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

111 lines
3.3 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 (
"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,
})
}
},
}
}