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.
 
 

60 lines
1.6 KiB

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, klineSeries *KlineSeries) (err error) {
if err = sigStrategy.Init(params); err != nil {
return
}
r.sigStrategy = sigStrategy
r.sigStrategyContext = NewStrategyContext(klineSeries, r.indicatorReg)
return
}
// Update 订阅k线更新
func (r *TradingPlan) Update(signalType strategy.StrategyType) {
switch signalType {
case strategy.StrategyTypeSig:
r.sigStrategy.Update(r.sigStrategyContext)
}
}