package llmjob import ( "github.com/banbox/banbot/config" "github.com/banbox/banbot/core" "github.com/banbox/banbot/strat" ta "github.com/banbox/banta" "math" ) func J4267(pol *config.RunPolicyConfig) *strat.TradeStrat { // 定义可调超参数 shortMaLength := pol.DefInt("shortMaLength", 10, core.PNorm(5, 20)) maRate := pol.Def("maRate", 1.8, core.PNorm(1.5, 4)) rsiOverbought := pol.DefInt("rsiOverbought", 75, core.PNorm(60, 85)) rsiOversold := pol.DefInt("rsiOversold", 25, core.PNorm(15, 40)) bbMultiplier := pol.Def("bbMultiplier", 2.0, core.PNorm(1.5, 3.0)) // 计算长期均线周期 longMaLength := int(float64(shortMaLength) * maRate) // 确定预热数量,取所有指标中最大的周期 warmupNum := longMaLength if warmupNum < 20 { warmupNum = 20 } if warmupNum < 26 { warmupNum = 26 } return &strat.TradeStrat{ Name: "Multi-Technical-Indicator-Synergistic-Trading-System", WarmupNum: warmupNum, HedgeOff: true, // 单向持仓模式 EachMaxLong: 1, // 最多一个做多订单 EachMaxShort: 1, // 最多一个做空订单 RunTimeFrames: []string{"4h"}, OnBar: func(s *strat.StratJob) { e := s.Env // 计算移动平均线 shortMa := ta.SMA(e.Close, shortMaLength) longMa := ta.SMA(e.Close, longMaLength) // 计算RSI rsi := ta.RSI(e.Close, 14) // 计算MACD macdLine, signalLine := ta.MACD(e.Close, 12, 26, 9) macdHist := macdLine.Sub(signalLine) // 计算布林带 bbUpper, _, bbLower := ta.BBANDS(e.Close, 20, bbMultiplier, bbMultiplier) // 获取当前价格 closePrice := e.Close.Get(0) if math.IsNaN(closePrice) { return } // 检测主要交易信号:MA交叉 maCross := shortMa.Cross(longMa) buySignal := maCross == 1 // 短期均线上穿长期均线 sellSignal := maCross == -1 // 短期均线下穿长期均线 // 检测辅助交易信号 rsiVal := rsi.Get(0) macdHistVal := macdHist.Get(0) bbLowerVal := bbLower.Get(0) bbUpperVal := bbUpper.Get(0) additionalBuySignal := !math.IsNaN(rsiVal) && !math.IsNaN(macdHistVal) && !math.IsNaN(bbLowerVal) && rsiVal < float64(rsiOversold) && macdHistVal > 0 && closePrice < bbLowerVal additionalSellSignal := !math.IsNaN(rsiVal) && !math.IsNaN(macdHistVal) && !math.IsNaN(bbUpperVal) && rsiVal > float64(rsiOverbought) && macdHistVal < 0 && closePrice > bbUpperVal // 执行交易策略 if buySignal { // 平掉所有做空订单 if len(s.ShortOrders) > 0 { s.CloseOrders(&strat.ExitReq{ Tag: "MA_Sell_Close", Dirt: core.OdDirtShort, Force: true, }) } // 开做多订单 if len(s.LongOrders) == 0 { s.OpenOrder(&strat.EnterReq{ Tag: "MA_Buy", }) } } else if sellSignal { // 平掉所有做多订单 if len(s.LongOrders) > 0 { s.CloseOrders(&strat.ExitReq{ Tag: "MA_Buy_Close", Dirt: core.OdDirtLong, Force: true, }) } // 平掉所有做空订单 if len(s.ShortOrders) > 0 { s.CloseOrders(&strat.ExitReq{ Tag: "MA_Sell_Close", Dirt: core.OdDirtShort, Force: true, }) } // 开做空订单 if len(s.ShortOrders) == 0 { s.OpenOrder(&strat.EnterReq{ Tag: "MA_Sell", Short: true, }) } } // 辅助信号处理(仅在主要信号未触发时执行) if additionalBuySignal && !buySignal && len(s.LongOrders) == 0 { // 平掉所有做空订单 if len(s.ShortOrders) > 0 { s.CloseOrders(&strat.ExitReq{ Tag: "Aux_Sell_Close", Dirt: core.OdDirtShort, Force: true, }) } // 开做多订单 s.OpenOrder(&strat.EnterReq{ Tag: "Aux_Buy", }) } else if additionalSellSignal && !sellSignal && len(s.ShortOrders) == 0 { // 平掉所有做多订单 if len(s.LongOrders) > 0 { s.CloseOrders(&strat.ExitReq{ Tag: "Aux_Buy_Close", Dirt: core.OdDirtLong, Force: true, }) } // 开做空订单 s.OpenOrder(&strat.EnterReq{ Tag: "Aux_Sell", Short: true, }) } }, } }