157 lines
4.0 KiB
Go
157 lines
4.0 KiB
Go
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,
|
||
})
|
||
}
|
||
},
|
||
}
|
||
}
|