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" "math" ) func J2876(pol *config.RunPolicyConfig) *strat.TradeStrat { // 定义可调超参数 frequency := pol.DefInt("frequency", 28, core.PNorm(5, 30)) rsiFrequency := pol.DefInt("rsiFrequency", 220, core.PNorm(14, 100)) buyZoneDistance := pol.Def("buyZoneDistance", 7, core.PNorm(2, 15)) avgDownATRSum := pol.DefInt("avgDownATRSum", 3, core.PNorm(1, 10)) useAbsoluteRSIBarrier := pol.Def("useAbsoluteRSIBarrier", 1, core.PUniform(0, 1)) // 1表示true,0表示false barrierLevel := pol.Def("barrierLevel", 45, core.PNorm(30, 70)) // 计算预热数量,取RSI周期和均线周期中的较大值 warmupNum := rsiFrequency if frequency > rsiFrequency { warmupNum = frequency } // 再加上ATR周期 warmupNum += 20 return &strat.TradeStrat{ WarmupNum: warmupNum, HedgeOff: true, // 单向持仓模式 RunTimeFrames: []string{"15m"}, EachMaxLong: 3, // 最多允许3个多头订单,对应原策略的pyramiding=3 OnBar: func(s *strat.StratJob) { e := s.Env // 计算技术指标 momentumRSI := ta.RSI(e.Close, rsiFrequency) momentumRSI_slow := ta.SMA(momentumRSI, frequency) atr := ta.ATR(e.High, e.Low, e.Close, 20) // 获取当前值 rsiValue := momentumRSI.Get(0) rsiSlowValue := momentumRSI_slow.Get(0) closePrice := e.Close.Get(0) // 检查数据有效性 if math.IsNaN(rsiValue) || math.IsNaN(rsiSlowValue) || math.IsNaN(closePrice) { return } // 计算买卖区域 buyZoneLower := rsiSlowValue * (1 - buyZoneDistance/100) // 生成交易信号 useBarrier := useAbsoluteRSIBarrier > 0.5 momentumRSISoftClose := (rsiValue > rsiSlowValue) && (rsiValue > barrierLevel || !useBarrier) isClose := momentumRSISoftClose // 计算风险管理条件 riskCondition := true if len(s.LongOrders) > 0 { // 计算平均持仓价格 totalCost := 0.0 totalAmount := 0.0 for _, od := range s.LongOrders { if od.Status >= ormo.InOutStatusPartEnter { totalCost += od.EnterCost() totalAmount += od.HoldAmount() } } if totalAmount > 0 { avgPrice := totalCost / totalAmount // 计算过去avgDownATRSum个周期的ATR值之和 atrSum := 0.0 for i := 0; i < avgDownATRSum; i++ { atrVal := atr.Get(i) if !math.IsNaN(atrVal) { atrSum += atrVal } } // 计算风险条件:平均持仓价格 - ATR求和值 * 开仓数量 > 当前价格 riskCondition = avgPrice-atrSum*float64(len(s.LongOrders)) > closePrice } } // 买入信号:RSI低于买入区域下限且满足风险条件 isBuy := rsiValue < buyZoneLower && (riskCondition || len(s.LongOrders) == 0) // 执行交易操作 if isBuy && len(s.LongOrders) < 3 { // 限制最多3个多头订单 s.OpenOrder(&strat.EnterReq{ Tag: "Buy", Short: false, OrderType: core.OrderTypeMarket, }) } // 平仓信号 if isClose && len(s.LongOrders) > 0 { s.CloseOrders(&strat.ExitReq{ Tag: "Close", Dirt: core.OdDirtLong, OrderType: core.OrderTypeLimit, Limit: closePrice, }) } }, } }