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

157 lines
4.0 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/strat"
ta "github.com/banbox/banta"
"math"
)
func J4267(pol *config.RunPolicyConfig) *strat.TradeStrat {
// 定义可调超参数
shortMaLength := pol.DefInt("shortMaLength", 10, core.PNorm(5, 20))
maRate := pol.Def("maRate", 1.8, core.PNorm(1.5, 4))
rsiOverbought := pol.DefInt("rsiOverbought", 75, core.PNorm(60, 85))
rsiOversold := pol.DefInt("rsiOversold", 25, core.PNorm(15, 40))
bbMultiplier := pol.Def("bbMultiplier", 2.0, core.PNorm(1.5, 3.0))
// 计算长期均线周期
longMaLength := int(float64(shortMaLength) * maRate)
// 确定预热数量,取所有指标中最大的周期
warmupNum := longMaLength
if warmupNum < 20 {
warmupNum = 20
}
if warmupNum < 26 {
warmupNum = 26
}
return &strat.TradeStrat{
Name: "Multi-Technical-Indicator-Synergistic-Trading-System",
WarmupNum: warmupNum,
HedgeOff: true, // 单向持仓模式
EachMaxLong: 1, // 最多一个做多订单
EachMaxShort: 1, // 最多一个做空订单
RunTimeFrames: []string{"4h"},
OnBar: func(s *strat.StratJob) {
e := s.Env
// 计算移动平均线
shortMa := ta.SMA(e.Close, shortMaLength)
longMa := ta.SMA(e.Close, longMaLength)
// 计算RSI
rsi := ta.RSI(e.Close, 14)
// 计算MACD
macdLine, signalLine := ta.MACD(e.Close, 12, 26, 9)
macdHist := macdLine.Sub(signalLine)
// 计算布林带
bbUpper, _, bbLower := ta.BBANDS(e.Close, 20, bbMultiplier, bbMultiplier)
// 获取当前价格
closePrice := e.Close.Get(0)
if math.IsNaN(closePrice) {
return
}
// 检测主要交易信号:MA交叉
maCross := shortMa.Cross(longMa)
buySignal := maCross == 1 // 短期均线上穿长期均线
sellSignal := maCross == -1 // 短期均线下穿长期均线
// 检测辅助交易信号
rsiVal := rsi.Get(0)
macdHistVal := macdHist.Get(0)
bbLowerVal := bbLower.Get(0)
bbUpperVal := bbUpper.Get(0)
additionalBuySignal := !math.IsNaN(rsiVal) && !math.IsNaN(macdHistVal) && !math.IsNaN(bbLowerVal) &&
rsiVal < float64(rsiOversold) && macdHistVal > 0 && closePrice < bbLowerVal
additionalSellSignal := !math.IsNaN(rsiVal) && !math.IsNaN(macdHistVal) && !math.IsNaN(bbUpperVal) &&
rsiVal > float64(rsiOverbought) && macdHistVal < 0 && closePrice > bbUpperVal
// 执行交易策略
if buySignal {
// 平掉所有做空订单
if len(s.ShortOrders) > 0 {
s.CloseOrders(&strat.ExitReq{
Tag: "MA_Sell_Close",
Dirt: core.OdDirtShort,
Force: true,
})
}
// 开做多订单
if len(s.LongOrders) == 0 {
s.OpenOrder(&strat.EnterReq{
Tag: "MA_Buy",
})
}
} else if sellSignal {
// 平掉所有做多订单
if len(s.LongOrders) > 0 {
s.CloseOrders(&strat.ExitReq{
Tag: "MA_Buy_Close",
Dirt: core.OdDirtLong,
Force: true,
})
}
// 平掉所有做空订单
if len(s.ShortOrders) > 0 {
s.CloseOrders(&strat.ExitReq{
Tag: "MA_Sell_Close",
Dirt: core.OdDirtShort,
Force: true,
})
}
// 开做空订单
if len(s.ShortOrders) == 0 {
s.OpenOrder(&strat.EnterReq{
Tag: "MA_Sell",
Short: true,
})
}
}
// 辅助信号处理(仅在主要信号未触发时执行)
if additionalBuySignal && !buySignal && len(s.LongOrders) == 0 {
// 平掉所有做空订单
if len(s.ShortOrders) > 0 {
s.CloseOrders(&strat.ExitReq{
Tag: "Aux_Sell_Close",
Dirt: core.OdDirtShort,
Force: true,
})
}
// 开做多订单
s.OpenOrder(&strat.EnterReq{
Tag: "Aux_Buy",
})
} else if additionalSellSignal && !sellSignal && len(s.ShortOrders) == 0 {
// 平掉所有做多订单
if len(s.LongOrders) > 0 {
s.CloseOrders(&strat.ExitReq{
Tag: "Aux_Buy_Close",
Dirt: core.OdDirtLong,
Force: true,
})
}
// 开做空订单
s.OpenOrder(&strat.EnterReq{
Tag: "Aux_Sell",
Short: true,
})
}
},
}
}