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

75 lines
1.9 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.

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
},
}
}