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

156
llmjob/4267.go Normal file
View File

@@ -0,0 +1,156 @@
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,
})
}
},
}
}