package trend import ( "github.com/banbox/banbot/config" "github.com/banbox/banbot/core" "github.com/banbox/banbot/strat" ) func pcmp(pol *config.RunPolicyConfig) *strat.TradeStrat { // 定义可优化的超参数 shortPeriod := int(pol.Def("short", 7, core.PNorm(5, 10))) longPeriod := int(pol.Def("long", 14, core.PNorm(10, 20))) return &strat.TradeStrat{ WarmupNum: longPeriod + 5, // 预热数据数量,确保有足够的历史数据 EachMaxLong: 1, // 最多持有1个多单 EachMaxShort: 1, // 最多持有1个空单 OnBar: func(s *strat.StratJob) { e := s.Env curPrice := e.Close.Get(0) // 检查当前价格是否高于短周期和长周期前的价格 shortPriceHigher := curPrice > e.Close.Get(shortPeriod) longPriceHigher := curPrice > e.Close.Get(longPeriod) // 检查当前价格是否低于短周期和长周期前的价格 shortPriceLower := curPrice < e.Close.Get(shortPeriod) longPriceLower := curPrice < e.Close.Get(longPeriod) // 多头信号:当前价格比两个周期前都高 goLong := shortPriceHigher && longPriceHigher // 空头信号:当前价格比两个周期前都低 goShort := shortPriceLower && longPriceLower // 检查当前订单状态 hasLongOrder := len(s.LongOrders) > 0 hasShortOrder := len(s.ShortOrders) > 0 // 开多单逻辑:当前价格比两个周期前都高,且没有持仓 if goLong && !hasLongOrder && !hasShortOrder { s.OpenOrder(&strat.EnterReq{Tag: "long"}) } else if goShort && !hasShortOrder && !hasLongOrder { // 开空单逻辑:当前价格比两个周期前都低,且没有持仓 s.OpenOrder(&strat.EnterReq{Tag: "short", Short: true}) } // 平多单逻辑:不满足做多条件,且有多单持仓 if !goLong && hasLongOrder { s.CloseOrders(&strat.ExitReq{Tag: "close_long", Dirt: core.OdDirtLong}) } // 平空单逻辑:不满足做空条件,且有空单持仓 if !goShort && hasShortOrder { s.CloseOrders(&strat.ExitReq{Tag: "close_short", Dirt: core.OdDirtShort}) } }, } }