@ -141,7 +141,7 @@ func (b *SigStrategyBacktester) multiIntervalSeries(ctx context.Context, sr *pb.
if err != nil {
if err != nil {
return
return
}
}
before , a fter := rsp . Before , rsp . After
driverBefore , driverA fter := rsp . Before , rsp . After
driverInterval := types . Interval ( sr . Interval )
driverInterval := types . Interval ( sr . Interval )
driverIntervalAdder := types . SupportedIntervals [ driverInterval ]
driverIntervalAdder := types . SupportedIntervals [ driverInterval ]
@ -175,10 +175,10 @@ func (b *SigStrategyBacktester) multiIntervalSeries(ctx context.Context, sr *pb.
intervalAdder := types . SupportedIntervals [ interval ]
intervalAdder := types . SupportedIntervals [ interval ]
driverTs := int64 ( 0 )
driverTs := int64 ( 0 )
isr := & pb . SeriesRange { Exchange : sr . Exchange , InstId : sr . InstId , Open : false , Live : sr . Live , Desc : sr . Desc }
isr := & pb . SeriesRange { Exchange : sr . Exchange , InstId : sr . InstId , Open : false , Live : sr . Live , Desc : sr . Desc }
isr . Before = intervalAdder ( b efore, - 1 )
isr . Before = intervalAdder ( driverB efore, - 1 )
isr . After = a fter
isr . After = driverA fter
isr . Interval = string ( interval )
isr . Interval = string ( interval )
isr . WindowExtra = uint32 ( max ( 0 , requiredIntervalSeries . Get ( interval ) - 1 ) )
isr . WindowExtra = uint32 ( max ( 0 , requiredIntervalSeries . Get ( interval ) - 1 ) ) + indicator . ApproCandles
err1 := b . fetchHistoryKlineSeries ( ctx , isr , func ( k * types . Kline ) ( err error ) {
err1 := b . fetchHistoryKlineSeries ( ctx , isr , func ( k * types . Kline ) ( err error ) {
closeTs := intervalAdder ( k . Ts , 1 )
closeTs := intervalAdder ( k . Ts , 1 )
// 与驱动周期series保持同步更新
// 与驱动周期series保持同步更新
@ -232,7 +232,7 @@ func (b *SigStrategyBacktester) multiIntervalSeries(ctx context.Context, sr *pb.
}
}
// 驱动周期数据拉取
// 驱动周期数据拉取
driverSeries := intervalKlineSeries . ComputeIfAbsent ( driverInterval , func ( ) * sig . KlineSeries { return sig . NewKlineSeries ( sr . Exchange , sr . InstId , driverInterval ) } )
driverSeries := intervalKlineSeries . ComputeIfAbsent ( driverInterval , func ( ) * sig . KlineSeries { return sig . NewKlineSeries ( sr . Exchange , sr . InstId , driverInterval ) } )
sr . WindowExtra = max ( sr . WindowExtra , uint32 ( max ( 0 , requiredIntervalSeries . Get ( driverInterval ) - 1 ) ) )
sr . WindowExtra = max ( sr . WindowExtra , uint32 ( max ( 0 , requiredIntervalSeries . Get ( driverInterval ) - 1 ) ) ) + indicator . ApproCandles
err0 := b . fetchHistoryKlineSeries ( ctx , sr , func ( k * types . Kline ) ( err error ) {
err0 := b . fetchHistoryKlineSeries ( ctx , sr , func ( k * types . Kline ) ( err error ) {
if lastTs , serial := driverSeries . Update ( k ) ; ! serial {
if lastTs , serial := driverSeries . Update ( k ) ; ! serial {
err = fmt . Errorf ( "kline not series: %s(%s), interval=%s, lastTs=%d" , sr . InstId , sr . Exchange , driverInterval , lastTs )
err = fmt . Errorf ( "kline not series: %s(%s), interval=%s, lastTs=%d" , sr . InstId , sr . Exchange , driverInterval , lastTs )
@ -257,6 +257,9 @@ func (b *SigStrategyBacktester) multiIntervalSeries(ctx context.Context, sr *pb.
if err != nil {
if err != nil {
return
return
}
}
if k . Ts < driverBefore {
return
}
// intervalKlineSeries.Range(func(interval types.Interval, v *sig.KlineSeries) {
// intervalKlineSeries.Range(func(interval types.Interval, v *sig.KlineSeries) {
// if v != nil {
// if v != nil {
// zlog.Debugf("interval series update: %s, %d", interval, v.Length())
// zlog.Debugf("interval series update: %s, %d", interval, v.Length())
@ -324,31 +327,3 @@ recvLoop:
zlog . Debugf ( "fetch history kline series: inst=%s(%s), interval=%s, recv=%d, total=%d, use %s" , sr . InstId , sr . Exchange , sr . Interval , recvTimes , recvTotal , watch . ElapsedFmt ( "." ) )
zlog . Debugf ( "fetch history kline series: inst=%s(%s), interval=%s, recv=%d, total=%d, use %s" , sr . InstId , sr . Exchange , sr . Interval , recvTimes , recvTotal , watch . ElapsedFmt ( "." ) )
return
return
}
}
// Deprecated
// _singleStrategySeries 单周期策略
func ( b * SigStrategyBacktester ) _singleStrategySeries ( ctx context . Context , sigStrategy strategy . ISingleSigStrategy , sr * pb . SeriesRange , recvSignal func ( sigSide types . Side , k types . Kline ) ( err error ) ) ( err error ) {
interval := types . Interval ( sr . Interval )
kSeries := sig . NewKlineSeries ( sr . Exchange , sr . InstId , interval )
strategyContext := sig . NewStrategyContext ( nil , kSeries , b . indicatorReg )
requiredSeries := int ( sigStrategy . CandlePeriods ( nil ) )
sr . WindowExtra = uint32 ( max ( 0 , requiredSeries - 1 ) )
err = b . fetchHistoryKlineSeries ( ctx , sr , func ( k * types . Kline ) ( err error ) {
if lastTs , serial := kSeries . Update ( k ) ; ! serial {
err = fmt . Errorf ( "kline not series: %s(%s), interval=%s, lastTs=%d" , sr . InstId , sr . Exchange , interval , lastTs )
return
}
if kSeries . Length ( ) < requiredSeries {
return
}
sigSide := sigStrategy . Update ( strategyContext )
if sigSide . IsValid ( ) {
if err = recvSignal ( sigSide , * k ) ; err != nil {
return
}
}
return
} )
return
}