// 修复后的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" ) /* 以大止损实现的高胜率,订单太少 尝试使用atrBase针对CostRate、TakeProfit、StopLoss进行自适应,效果都更差。 */ func J2523(pol *config.RunPolicyConfig) *strat.TradeStrat { // 定义可调参数 maLen := pol.DefInt("maLen", 240, core.PNorm(50, 300)) adxThres := pol.Def("adxThres", 20, core.PNorm(15, 35)) slRate := pol.Def("slRate", 2.5, core.PNorm(0.8, 5.0)) // 计算预热K线数,确保所有指标都能正确计算 warmupNum := maLen + 20 //rates := make([]float64, 0, 10) return &strat.TradeStrat{ WarmupNum: warmupNum, RunTimeFrames: []string{"3d"}, StakeRate: 20, EachMaxLong: 1, EachMaxShort: 1, OnBar: func(s *strat.StratJob) { e := s.Env // 计算技术指标 maBig := ta.SMA(e.Close, maLen) rsi := ta.RSI(e.Close, 14) // 使用DMI计算ADX,与原始策略保持一致 adx := ta.ADX(e.High, e.Low, e.Close, 14) atr := ta.ATR(e.High, e.Low, e.Close, 14) // 获取当前值和历史值,避免重复计算 curClose := e.Close.Get(0) curMA := maBig.Get(0) curRSI := rsi.Get(0) curADX := adx.Get(0) curATR := atr.Get(0) // 检查数据有效性 if math.IsNaN(curClose) || math.IsNaN(curMA) || math.IsNaN(curRSI) || math.IsNaN(curADX) || math.IsNaN(curATR) { return } // 检查2根K线前是否发生交叉 closeXBig := e.Close.Cross(maBig) rsi2 := rsi.Get(2) adxOk := adx.Get(2) > adxThres buyConfirmation := closeXBig == 3 && (rsi2 > 40) && adxOk sellConfirmation := closeXBig == -3 && (rsi2 < 60) && adxOk // 执行交易逻辑 if buyConfirmation { s.OpenOrder(&strat.EnterReq{ Tag: "Buy", TakeProfitVal: curClose * 0.02, // 2%止盈 StopLossVal: slRate * curATR, }) s.CloseOrders(&strat.ExitReq{ Tag: "XShort", Dirt: core.OdDirtShort, }) } if sellConfirmation { s.OpenOrder(&strat.EnterReq{ Tag: "short", Short: true, TakeProfitVal: curClose * 0.02, // 2%止盈 StopLossVal: slRate * curATR, }) s.CloseOrders(&strat.ExitReq{ Tag: "XLong", Dirt: core.OdDirtLong, }) } }, //OnShutDown: func(s *strat.StratJob) { // if len(rates) == 0 { // return // } // sort.Float64s(rates) // size := len(rates) / 10 // for i := 0; i < len(rates); i += size { // block := rates[i:min(len(rates), i+size)] // avg := floats.Sum(block) / float64(len(block)) // fmt.Printf("rate %v: %.3f\n", i, avg) // } // rates = nil //}, } }