This commit is contained in:
2026-08-24 20:53:21 +08:00
commit 6e78bba16a
287 changed files with 32443 additions and 0 deletions

103
llmjob/2523.go Normal file
View File

@@ -0,0 +1,103 @@
// 修复后的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
//},
}
}