Files
banstagy/llmjob/2523.go
2026-08-24 20:53:21 +08:00

104 lines
2.7 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 修复后的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
//},
}
}