package llmjob import ( "github.com/banbox/banbot/config" "github.com/banbox/banbot/core" "github.com/banbox/banbot/strat" ta "github.com/banbox/banta" ) func J6697(pol *config.RunPolicyConfig) *strat.TradeStrat { // 定义可调超参数 periodK := pol.DefInt("periodK", 13, core.PNorm(5, 30)) smoothK := pol.DefInt("smoothK", 5, core.PNorm(2, 8)) periodD := pol.DefInt("periodD", 2, core.PNorm(2, 5)) tpTicks := pol.DefInt("tpTicks", 100, core.PNorm(10, 500)) // 固定tick止盈 overboughtLevel := pol.DefInt("overboughtLevel", 80, core.PNorm(70, 90)) oversoldLevel := 100 - overboughtLevel // 自动计算超卖水平 return &strat.TradeStrat{ WarmupNum: periodK + smoothK + periodD + 10, // 确保足够的数据计算指标 HedgeOff: true, // 启用单向持仓模式 EachMaxLong: 100, // 对应pyramiding=100 EachMaxShort: 100, // 对应pyramiding=100 TimeFrames: "8h", OnBar: func(s *strat.StratJob) { e := s.Env // 计算KDJ指标,返回[K, D, RSV] k, d, _ := ta.KDJ(e.High, e.Low, e.Close, periodK, smoothK, periodD) // 获取最新值 kVal := k.Get(0) // 计算交叉信号 kdCross := k.Cross(d) // 1:上穿, -1:下穿, 0:重合 // 使用ATR作为动态止盈参考 atr := ta.ATR(e.High, e.Low, e.Close, 14) // 做多条件:K线上穿D线,且K值未达超买区 if kdCross == 1 && kVal < float64(overboughtLevel) { s.OpenOrder(&strat.EnterReq{ Tag: "Long", OrderType: core.OrderTypeMarket, TakeProfitVal: atr.Get(0) * float64(tpTicks) / 100, // 使用ATR作为动态止盈 }) } // 做空条件:K线下穿D线,且K值未破超卖区 if kdCross == -1 && kVal > float64(oversoldLevel) { s.OpenOrder(&strat.EnterReq{ Tag: "Short", Short: true, OrderType: core.OrderTypeMarket, TakeProfitVal: atr.Get(0) * float64(tpTicks) / 100, // 使用ATR作为动态止盈 }) } }, } }