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

74
llmjob/7593.go Normal file
View File

@@ -0,0 +1,74 @@
package llmjob
import (
"math"
"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"
)
func J7593(pol *config.RunPolicyConfig) *strat.TradeStrat {
// 定义可调参数
lengthRSI := pol.DefInt("lengthRSI", 20, core.PNorm(5, 30))
rsiEntryThs := pol.DefInt("rsiEntryThs", 72, core.PNorm(60, 85))
rsiExitThs := pol.DefInt("rsiExitThs", 50, core.PNorm(45, 65))
takeProfitRate := pol.Def("takeProfitRate", 6.0, core.PNorm(1, 15))
return &strat.TradeStrat{
Name: "TrendFollowingRSI",
WarmupNum: lengthRSI + 10, // 预热足够的K线用于RSI计算
HedgeOff: true, // 单向持仓模式
EachMaxLong: 1, // 最多持有一个多单
TimeFrames: "8h",
OnBar: func(s *strat.StratJob) {
e := s.Env
// 计算RSI指标
rsi := ta.RSI(e.Close, lengthRSI)
currentRSI := rsi.Get(0)
// 检查是否有有效的RSI值
if math.IsNaN(currentRSI) {
return
}
// 入场条件:RSI > 70
if currentRSI > float64(rsiEntryThs) && len(s.LongOrders) == 0 {
s.OpenOrder(&strat.EnterReq{
Tag: "long",
Short: false,
})
}
// 出场条件:RSI < 55
if currentRSI < float64(rsiExitThs) && s.Position(core.OdDirtLong, "") > 0 {
s.CloseOrders(&strat.ExitReq{
Tag: "rsi_exit",
Dirt: core.OdDirtLong,
})
}
},
OnCheckExit: func(s *strat.StratJob, od *ormo.InOutOrder) *strat.ExitReq {
// 仅对开仓状态的多头订单检查止盈
if !od.Short || od.Status != ormo.InOutStatusFullEnter {
return nil
}
// 基于持仓成本计算止盈目标价
longTakeProfit := od.InitPrice * (1 + takeProfitRate/100)
// 检查是否达到止盈条件
if s.Env.Close.Get(0) > longTakeProfit {
return &strat.ExitReq{
Tag: "tp_exit",
Dirt: core.OdDirtLong,
}
}
return nil
},
}
}