package trading import ( "sig-pub/pkg/data/entity" "sig-pub/pkg/indicator" "sig-pub/pkg/strategy" "sync/atomic" ) type TradingPlan struct { Status atomic.Int32 plan entity.TradePlan indicatorReg *indicator.IndicatorRegistry sigStrategy strategy.ISigStrategy sigStrategyContext *StrategyContext // publisher publish.Publisher[int32, any] // signalKey map[string]int32 } func NewTradingPlan(plan entity.TradePlan, indicatorReg *indicator.IndicatorRegistry) *TradingPlan { return &TradingPlan{ plan: plan, indicatorReg: indicatorReg, } } // Init 初始化交易计划 // subKlineKeys 订阅k线更新, 更新时调用Update方法 // 交易信号/下单/平仓/风控 func (r *TradingPlan) Init() (err error) { // 初始化执行策略 // if err = r.initSigStrategy(r.sigStrategy, r.plan.SigStrategyParams); err != nil { // return // } // sigStrategy 1m // tradeStrategy 1s // closeStrategy 2s return } // initSigStrategy 初始化多空信号策略 // buy/sell -> 过滤/风控 -> tradeStrategy -> closeStrategy func (r *TradingPlan) InitSigStrategy(sigStrategy strategy.ISigStrategy, params strategy.SigStrategyParam, sigIndCtx IOffsetIndicatorContext) (err error) { if err = sigStrategy.Init(params); err != nil { return } r.sigStrategy = sigStrategy r.sigStrategyContext = NewStrategyContext(sigIndCtx, r.indicatorReg) return } // Update 订阅k线更新 func (r *TradingPlan) Update(signalType strategy.StrategyType) { switch signalType { case strategy.StrategyTypeSig: r.sigStrategy.Update(r.sigStrategyContext) } }