You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

91 lines
2.9 KiB

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)
}