// 修复后的完整策略代码 // 请勿修改package包名和任意函数名 package llmjob import ( "github.com/banbox/banbot/config" "github.com/banbox/banbot/core" "github.com/banbox/banbot/orm/ormo" "github.com/banbox/banbot/strat" ta "github.com/banbox/banta" ) // MACD动态趋势量化交易策略 func J592(pol *config.RunPolicyConfig) *strat.TradeStrat { // 定义可调超参数 fastPeriod := pol.DefInt("fastPeriod", 19, core.PNorm(5, 20)) slowRate := pol.Def("slowRate", 2.9, core.PNorm(1.5, 4)) signalPeriod := pol.DefInt("signalPeriod", 10, core.PNorm(5, 15)) // 计算慢线周期 slowPeriod := int(float64(fastPeriod) * slowRate) return &strat.TradeStrat{ WarmupNum: 100, // 预热K线数量 EachMaxLong: 1, // 最多开1单做多 EachMaxShort: 1, // 最多开1单做空 DrawDownExit: true, // 启用回撤止盈 RunTimeFrames: []string{"8h"}, OnBar: func(s *strat.StratJob) { e := s.Env // 计算MACD指标 // 使用initType=1,符合中国主流使用习惯 macdLine, signalLine := ta.MACDBy(e.Close, fastPeriod, slowPeriod, signalPeriod, 1) // 检测MACD线与信号线的交叉 // 返回值:1表示上穿(金叉),-1表示下穿(死叉),0表示重合或未知 cross := macdLine.Cross(signalLine) // 计算ATR用于止损止盈 atr := ta.ATR(e.High, e.Low, e.Close, 14) atrVal := atr.Get(0) // 获取当前价格 // 获取当前订单数量 longOrders := s.LongOrders shortOrders := s.ShortOrders // 金叉信号:MACD线上穿信号线,且当前没有做多订单 if cross == 1 && len(longOrders) == 0 { // 如果有空单,先平空单 if len(shortOrders) > 0 { s.CloseOrders(&strat.ExitReq{ Tag: "close_short", Dirt: core.OdDirtShort, OrderType: core.OrderTypeMarket, }) } // 开多单 s.OpenOrder(&strat.EnterReq{ Tag: "long_cross", Short: false, OrderType: core.OrderTypeMarket, StopLossVal: atrVal * 2, // 2倍ATR止损 TakeProfitVal: atrVal * 4, // 4倍ATR止盈 StopLossTag: "atr_stop_loss", TakeProfitTag: "atr_take_profit", }) } // 死叉信号:MACD线下穿信号线,且当前没有做空订单 if cross == -1 && len(shortOrders) == 0 { // 如果有多单,先平多单 if len(longOrders) > 0 { s.CloseOrders(&strat.ExitReq{ Tag: "close_long", Dirt: core.OdDirtLong, OrderType: core.OrderTypeMarket, }) } // 开空单 s.OpenOrder(&strat.EnterReq{ Tag: "short_cross", Short: true, OrderType: core.OrderTypeMarket, StopLossVal: atrVal * 2, // 2倍ATR止损 TakeProfitVal: atrVal * 4, // 4倍ATR止盈 StopLossTag: "atr_stop_loss", TakeProfitTag: "atr_take_profit", }) } }, // 回撤止盈计算函数 GetDrawDownExitRate: func(s *strat.StratJob, od *ormo.InOutOrder, maxChg float64) float64 { // 最大盈利超过5%后,回撤30%止盈 if maxChg > 0.05 { return 0.3 } // 最大盈利超过2%后,回撤50%止盈 if maxChg > 0.02 { return 0.5 } // 其他情况不设置回撤止盈 return 0 }, } }