// 修复后的banbot完整策略代码 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 J2874(pol *config.RunPolicyConfig) *strat.TradeStrat { // 定义可调参数 rsiPeriod := pol.DefInt("rsiPeriod", 70, core.PNorm(20, 100)) longExitThreshold := pol.Def("longExitThreshold", 0.65, core.PNorm(0.55, 0.8)) shortExitThreshold := pol.Def("shortExitThreshold", 0.35, core.PNorm(0.2, 0.45)) allowLong := pol.Def("allowLong", 1.0, core.PUniform(0, 1)) > 0.5 allowShort := pol.Def("allowShort", 1.0, core.PUniform(0, 1)) > 0.5 return &strat.TradeStrat{ WarmupNum: rsiPeriod, // 预热期至少为RSI周期 HedgeOff: true, // 单向持仓模式,与原PineScript策略一致 RunTimeFrames: []string{"4h"}, OnBar: func(s *strat.StratJob) { e := s.Env // 计算各种价格组合 ohlc4 := ta.HLC3(e.High, e.Low, e.Close).Add(e.Open).Div(4) hlc3 := ta.HLC3(e.High, e.Low, e.Close) hl2 := ta.HL2(e.High, e.Low) // 计算各种RSI值并归一化(除以100) rsiOhlc4 := ta.RSI(ohlc4, rsiPeriod).Div(100) rsiClose := ta.RSI(e.Close, rsiPeriod).Div(100) rsiOpen := ta.RSI(e.Open, rsiPeriod).Div(100) rsiHigh := ta.RSI(e.High, rsiPeriod).Div(100) rsiHlc3 := ta.RSI(hlc3, rsiPeriod).Div(100) rsiHl2 := ta.RSI(hl2, rsiPeriod).Div(100) // 计算RSI均值 rsiAvg := rsiOhlc4.Add(rsiClose).Add(rsiOpen).Add(rsiHigh).Add(rsiHlc3).Add(rsiHl2).Div(6) rsiAvgVal := rsiAvg.Get(0) // 检查数据有效性 if math.IsNaN(rsiAvgVal) { return } // 检测RSI均值与0.5的交叉 entryThreshold := 0.5 crossSignal := rsiAvg.Cross(entryThreshold) // 生成交易信号 longSignal := crossSignal == 1 // RSI均值上穿0.5 shortSignal := crossSignal == -1 // RSI均值下穿0.5 // 生成平仓信号 longExit := rsiAvgVal >= longExitThreshold || shortSignal shortExit := rsiAvgVal <= shortExitThreshold || longSignal // 执行交易逻辑 if allowLong && longSignal && len(s.LongOrders) == 0 { // 开多头仓位 s.OpenOrder(&strat.EnterReq{ Tag: "long", }) } if allowShort && shortSignal && len(s.ShortOrders) == 0 { // 开空头仓位 s.OpenOrder(&strat.EnterReq{ Tag: "short", Short: true, }) } if allowLong && len(s.LongOrders) > 0 && longExit { // 平多头仓位 s.CloseOrders(&strat.ExitReq{ Tag: "long_exit", Dirt: core.OdDirtLong, }) } if allowShort && len(s.ShortOrders) > 0 && shortExit { // 平空头仓位 s.CloseOrders(&strat.ExitReq{ Tag: "short_exit", Dirt: core.OdDirtShort, }) } }, } }