package sig import ( "fmt" "sig-pub/pkg/indicator" "sig-pub/pkg/strategy" "sig-pub/pkg/types" "sig-pub/pkg/types/series" ) type StrategyContext struct { strategy.ISingleSigStrategyContext indicatorContext IOffsetIndicatorContext indicatorsReg *indicator.IndicatorRegistry } func NewStrategyContext(indicatorContext IOffsetIndicatorContext, indicatorsReg *indicator.IndicatorRegistry) *StrategyContext { return &StrategyContext{ indicatorContext: indicatorContext, indicatorsReg: indicatorsReg, } } func (c *StrategyContext) Get(offset int16) (kline types.Kline) { return c.indicatorContext.Get(offset) } func (c *StrategyContext) Series(offset, count int16) (klines series.Klines) { return c.indicatorContext.Series(offset, count) } // 获取窗口类型指标 func (c *StrategyContext) IndicatorW(name string, window int16) (s indicator.IIndicatorSeries) { indicator, ok := c.indicatorsReg.IndicatorW(name) if !ok { panic(fmt.Errorf("indicatorW %s not exists", name)) } return NewWindowIndicatorSeries(window, indicator, c.indicatorContext) } // IntervalStrategyContext 周期策略上下文 type IntervalStrategyContext struct { strategy.IIntervalSigStrategyContext intervalIndicatorContexts map[types.Interval]*IndicatorContext intervalKlineSeries *types.IntervalState[*KlineSeries] indicatorsReg *indicator.IndicatorRegistry } func NewIntervalStrategyContext(intervalKlineSeries *types.IntervalState[*KlineSeries], indicatorsReg *indicator.IndicatorRegistry) *IntervalStrategyContext { return &IntervalStrategyContext{ intervalIndicatorContexts: make(map[types.Interval]*IndicatorContext), intervalKlineSeries: intervalKlineSeries, indicatorsReg: indicatorsReg, } } func (c *IntervalStrategyContext) getIndicatorContext(interval types.Interval) *IndicatorContext { ctx, ok := c.intervalIndicatorContexts[interval] if !ok { klineSeries := c.intervalKlineSeries.Get(interval) if klineSeries == nil { panic(fmt.Errorf("interval %s kline series is nil", interval)) } ctx = NewIndicatorContext(klineSeries) c.intervalIndicatorContexts[interval] = ctx } return ctx } // Get [0]当前k线 func (c *IntervalStrategyContext) Get(interval types.Interval, offset int16) (kline types.Kline) { ctx := c.getIndicatorContext(interval) return ctx.Get(offset) } // Series [offset...end] func (c *IntervalStrategyContext) Series(interval types.Interval, offset, count int16) (klines series.Klines) { ctx := c.getIndicatorContext(interval) return ctx.Series(offset, count) } // 获取窗口类型指标 func (c *IntervalStrategyContext) IndicatorW(interval types.Interval, name string, window int16) (series indicator.IIndicatorSeries) { indicatorContext := c.getIndicatorContext(interval) indicator, ok := c.indicatorsReg.IndicatorW(name) if !ok { panic(fmt.Errorf("indicatorW %s not exists", name)) } return NewWindowIndicatorSeries(window, indicator, indicatorContext) }