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

110
llmjob/2876.go Normal file
View File

@@ -0,0 +1,110 @@
package llmjob
import (
"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"
"math"
)
func J2876(pol *config.RunPolicyConfig) *strat.TradeStrat {
// 定义可调超参数
frequency := pol.DefInt("frequency", 28, core.PNorm(5, 30))
rsiFrequency := pol.DefInt("rsiFrequency", 220, core.PNorm(14, 100))
buyZoneDistance := pol.Def("buyZoneDistance", 7, core.PNorm(2, 15))
avgDownATRSum := pol.DefInt("avgDownATRSum", 3, core.PNorm(1, 10))
useAbsoluteRSIBarrier := pol.Def("useAbsoluteRSIBarrier", 1, core.PUniform(0, 1)) // 1表示true,0表示false
barrierLevel := pol.Def("barrierLevel", 45, core.PNorm(30, 70))
// 计算预热数量,取RSI周期和均线周期中的较大值
warmupNum := rsiFrequency
if frequency > rsiFrequency {
warmupNum = frequency
}
// 再加上ATR周期
warmupNum += 20
return &strat.TradeStrat{
WarmupNum: warmupNum,
HedgeOff: true, // 单向持仓模式
RunTimeFrames: []string{"15m"},
EachMaxLong: 3, // 最多允许3个多头订单,对应原策略的pyramiding=3
OnBar: func(s *strat.StratJob) {
e := s.Env
// 计算技术指标
momentumRSI := ta.RSI(e.Close, rsiFrequency)
momentumRSI_slow := ta.SMA(momentumRSI, frequency)
atr := ta.ATR(e.High, e.Low, e.Close, 20)
// 获取当前值
rsiValue := momentumRSI.Get(0)
rsiSlowValue := momentumRSI_slow.Get(0)
closePrice := e.Close.Get(0)
// 检查数据有效性
if math.IsNaN(rsiValue) || math.IsNaN(rsiSlowValue) || math.IsNaN(closePrice) {
return
}
// 计算买卖区域
buyZoneLower := rsiSlowValue * (1 - buyZoneDistance/100)
// 生成交易信号
useBarrier := useAbsoluteRSIBarrier > 0.5
momentumRSISoftClose := (rsiValue > rsiSlowValue) && (rsiValue > barrierLevel || !useBarrier)
isClose := momentumRSISoftClose
// 计算风险管理条件
riskCondition := true
if len(s.LongOrders) > 0 {
// 计算平均持仓价格
totalCost := 0.0
totalAmount := 0.0
for _, od := range s.LongOrders {
if od.Status >= ormo.InOutStatusPartEnter {
totalCost += od.EnterCost()
totalAmount += od.HoldAmount()
}
}
if totalAmount > 0 {
avgPrice := totalCost / totalAmount
// 计算过去avgDownATRSum个周期的ATR值之和
atrSum := 0.0
for i := 0; i < avgDownATRSum; i++ {
atrVal := atr.Get(i)
if !math.IsNaN(atrVal) {
atrSum += atrVal
}
}
// 计算风险条件:平均持仓价格 - ATR求和值 * 开仓数量 > 当前价格
riskCondition = avgPrice-atrSum*float64(len(s.LongOrders)) > closePrice
}
}
// 买入信号:RSI低于买入区域下限且满足风险条件
isBuy := rsiValue < buyZoneLower && (riskCondition || len(s.LongOrders) == 0)
// 执行交易操作
if isBuy && len(s.LongOrders) < 3 { // 限制最多3个多头订单
s.OpenOrder(&strat.EnterReq{
Tag: "Buy",
Short: false,
OrderType: core.OrderTypeMarket,
})
}
// 平仓信号
if isClose && len(s.LongOrders) > 0 {
s.CloseOrders(&strat.ExitReq{
Tag: "Close",
Dirt: core.OdDirtLong,
OrderType: core.OrderTypeLimit,
Limit: closePrice,
})
}
},
}
}