package llmjob import ( "math" "github.com/banbox/banbot/config" "github.com/banbox/banbot/core" "github.com/banbox/banbot/strat" ta "github.com/banbox/banta" ) func J570(pol *config.RunPolicyConfig) *strat.TradeStrat { // 定义可调参数 fastLength := pol.DefInt("fastLength", 20, core.PNorm(5, 20)) macdRate := pol.Def("macdRate", 3, core.PNorm(1.5, 3.5)) MACDLength := pol.DefInt("MACDLength", 12, core.PNorm(5, 15)) macdThreshold := pol.Def("macdThreshold", -0.25, core.PNorm(-0.8, -0.1)) takeProfitValue := pol.Def("takeProfitValue", 12, core.PNorm(2, 15)) // 计算慢速EMA周期 slowLength := int(float64(fastLength) * macdRate) // 确定预热数量,需要足够的K线来计算MACD和检测谷底 warmupNum := slowLength + MACDLength + 3 return &strat.TradeStrat{ WarmupNum: warmupNum, HedgeOff: true, // 单向持仓模式 TimeFrames: "8h", OnBar: func(s *strat.StratJob) { e := s.Env // 计算MACD指标 fastEMA := ta.EMA(e.Close, fastLength) slowEMA := ta.EMA(e.Close, slowLength) macd := fastEMA.Sub(slowEMA) aMACD := ta.EMA(macd, MACDLength) delta := macd.Sub(aMACD) // 获取当前、前一个和前两个时间点的delta值 delta0 := delta.Get(0) delta1 := delta.Get(1) delta2 := delta.Get(2) // 获取当前MACD值和收盘价 macdValue := macd.Get(0) closePrice := e.Close.Get(0) // 检查数据有效性 if math.IsNaN(delta0) || math.IsNaN(delta1) || math.IsNaN(delta2) || math.IsNaN(macdValue) || math.IsNaN(closePrice) { return } // 检测MACD谷底 isValley := delta0 > delta1 && delta1 < delta2 // 谷底买入信号 if isValley && macdValue <= macdThreshold && delta0 < 0 { // 设置止盈价格 // 生成买入订单 s.OpenOrder(&strat.EnterReq{ Tag: "valley_buy", TakeProfitVal: takeProfitValue, }) } // 检测delta与0的交叉 crossResult := delta.Cross(0) // delta上穿0,买入信号 if crossResult == 1 { // 获取当前最高价和最低价 highPrice := e.High.Get(0) lowPrice := e.Low.Get(0) if !math.IsNaN(highPrice) && !math.IsNaN(lowPrice) { // 生成买入订单,使用固定止盈值0.3 s.OpenOrder(&strat.EnterReq{ Tag: "MacdLE", TakeProfitVal: 0.3, }) } } // delta下穿0,卖出信号 if crossResult == -1 { // 获取当前最高价和最低价 highPrice := e.High.Get(0) lowPrice := e.Low.Get(0) if !math.IsNaN(highPrice) && !math.IsNaN(lowPrice) { // 生成卖出订单,使用固定止盈值0.3 s.OpenOrder(&strat.EnterReq{ Tag: "MacdSE", Short: true, TakeProfitVal: 0.3, }) } } }, } }