// 修复后的banbot完整策略代码 package llmjob import ( "github.com/banbox/banbot/config" "github.com/banbox/banbot/core" "github.com/banbox/banbot/strat" ta "github.com/banbox/banta" ) func J2251(pol *config.RunPolicyConfig) *strat.TradeStrat { // 定义可调超参数 fastPeriod := pol.DefInt("fastPeriod", 21, core.PNorm(5, 50)) slowPeriod := pol.DefInt("slowPeriod", 55, core.PNorm(30, 100)) slMultiplier := pol.Def("slMultiplier", 1.5, core.PNorm(0.8, 3)) tpMultiplier := pol.Def("tpMultiplier", 1, core.PNorm(0.5, 2.5)) atrLength := pol.DefInt("atrLength", 14, core.PNorm(7, 30)) return &strat.TradeStrat{ WarmupNum: slowPeriod, // 预热数量取较长的EMA周期 HedgeOff: true, // 单向持仓模式,与PineScript一致 RunTimeFrames: []string{"4h"}, OnBar: func(s *strat.StratJob) { e := s.Env // 计算技术指标 fastMA := ta.EMA(e.Close, fastPeriod) slowMA := ta.EMA(e.Close, slowPeriod) atr := ta.ATR(e.High, e.Low, e.Close, atrLength) // 获取最新值 atrVal := atr.Get(0) closePrice := e.Close.Get(0) // 检测EMA交叉信号 //goLong := fastMA.Cross(slowMA) == 1 goShort := fastMA.Cross(slowMA) == -1 // 金叉信号:做多 //if goLong && s.OrderNum == 0 { // // 计算止损和止盈价格 // slPrice := closePrice - atrVal*slMultiplier // tpPrice := closePrice + atrVal*tpMultiplier*2 // s.OpenOrder(&strat.EnterReq{ // Tag: "Long", // Short: false, // Limit: closePrice - atrVal*slMultiplier*0.7, // StopBars: 7, // StopLoss: slPrice, // 做多止损价格 // TakeProfit: tpPrice, // 做多止盈价格 // }) //} // 死叉信号:做空 if goShort && s.OrderNum == 0 { // 计算止损和止盈价格 slPrice := closePrice + atrVal*slMultiplier tpPrice := closePrice - atrVal*tpMultiplier s.OpenOrder(&strat.EnterReq{ Tag: "Short", Short: true, StopLoss: slPrice, // 做空止损价格 TakeProfit: tpPrice, // 做空止盈价格 }) } }, } }