|
|
|
@ -75,7 +75,7 @@ func (b *SigStrategyBacktester) singleStrategySeries(ctx context.Context, sigStr |
|
|
|
interval := types.Interval(sr.Interval) |
|
|
|
interval := types.Interval(sr.Interval) |
|
|
|
kSeries := intervalKlineSeries.ComputeIfAbsent(interval, func() *sig.KlineSeries { return sig.NewKlineSeries(sr.Exchange, sr.InstId, interval) }) |
|
|
|
kSeries := intervalKlineSeries.ComputeIfAbsent(interval, func() *sig.KlineSeries { return sig.NewKlineSeries(sr.Exchange, sr.InstId, interval) }) |
|
|
|
strategyContext := sig.NewStrategyContext(sigStrategyInput, kSeries, b.indicatorReg) |
|
|
|
strategyContext := sig.NewStrategyContext(sigStrategyInput, kSeries, b.indicatorReg) |
|
|
|
requiredSeries := int(sigStrategy.RequiredSeries(sigStrategyInput)) |
|
|
|
requiredSeries := int(sigStrategy.CandlePeriods(strategyContext)) |
|
|
|
|
|
|
|
|
|
|
|
requiredIntervalSeries := types.NewIntervalState[int16]() |
|
|
|
requiredIntervalSeries := types.NewIntervalState[int16]() |
|
|
|
requiredIntervalSeries.Set(interval, int16(max(1, requiredSeries))) |
|
|
|
requiredIntervalSeries.Set(interval, int16(max(1, requiredSeries))) |
|
|
|
@ -101,10 +101,10 @@ func (b *SigStrategyBacktester) singleStrategySeries(ctx context.Context, sigStr |
|
|
|
|
|
|
|
|
|
|
|
// intervalStrategySeries 多周期策略
|
|
|
|
// intervalStrategySeries 多周期策略
|
|
|
|
func (b *SigStrategyBacktester) intervalStrategySeries(ctx context.Context, intervalSigStrategy strategy.IIntervalSigStrategy, sigStrategyInput types.Input, sr *pb.SeriesRange, intervalKlineSeries *types.IntervalState[*sig.KlineSeries], recvSignal func(sigSide types.Side, k types.Kline) (err error)) (err error) { |
|
|
|
func (b *SigStrategyBacktester) intervalStrategySeries(ctx context.Context, intervalSigStrategy strategy.IIntervalSigStrategy, sigStrategyInput types.Input, sr *pb.SeriesRange, intervalKlineSeries *types.IntervalState[*sig.KlineSeries], recvSignal func(sigSide types.Side, k types.Kline) (err error)) (err error) { |
|
|
|
// 各周期所需k线数量
|
|
|
|
|
|
|
|
requiredIntervalSeries := intervalSigStrategy.RequiredIntervalSeries(sigStrategyInput) |
|
|
|
|
|
|
|
// 策略上下文
|
|
|
|
// 策略上下文
|
|
|
|
intervalStrategyContext := sig.NewIntervalStrategyContext(sigStrategyInput, intervalKlineSeries, b.indicatorReg) |
|
|
|
intervalStrategyContext := sig.NewIntervalStrategyContext(sigStrategyInput, intervalKlineSeries, b.indicatorReg) |
|
|
|
|
|
|
|
// 各周期所需k线数量
|
|
|
|
|
|
|
|
requiredIntervalSeries := intervalSigStrategy.CandlePeriods(intervalStrategyContext) |
|
|
|
err = b.multiIntervalSeries(ctx, sr, requiredIntervalSeries, intervalKlineSeries, func(driver bool, interval types.Interval, k *types.Kline) (err error) { |
|
|
|
err = b.multiIntervalSeries(ctx, sr, requiredIntervalSeries, intervalKlineSeries, func(driver bool, interval types.Interval, k *types.Kline) (err error) { |
|
|
|
if !driver { |
|
|
|
if !driver { |
|
|
|
return |
|
|
|
return |
|
|
|
@ -332,7 +332,7 @@ func (b *SigStrategyBacktester) _singleStrategySeries(ctx context.Context, sigSt |
|
|
|
kSeries := sig.NewKlineSeries(sr.Exchange, sr.InstId, interval) |
|
|
|
kSeries := sig.NewKlineSeries(sr.Exchange, sr.InstId, interval) |
|
|
|
strategyContext := sig.NewStrategyContext(nil, kSeries, b.indicatorReg) |
|
|
|
strategyContext := sig.NewStrategyContext(nil, kSeries, b.indicatorReg) |
|
|
|
|
|
|
|
|
|
|
|
requiredSeries := int(sigStrategy.RequiredSeries(nil)) |
|
|
|
requiredSeries := int(sigStrategy.CandlePeriods(nil)) |
|
|
|
sr.WindowExtra = uint32(max(0, requiredSeries-1)) |
|
|
|
sr.WindowExtra = uint32(max(0, requiredSeries-1)) |
|
|
|
err = b.fetchHistoryKlineSeries(ctx, sr, func(k *types.Kline) (err error) { |
|
|
|
err = b.fetchHistoryKlineSeries(ctx, sr, func(k *types.Kline) (err error) { |
|
|
|
if lastTs, serial := kSeries.Update(k); !serial { |
|
|
|
if lastTs, serial := kSeries.Update(k); !serial { |
|
|
|
|