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

89 lines
2.4 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 J5115(pol *config.RunPolicyConfig) *strat.TradeStrat {
// 定义可调超参数
fastPeriod := pol.DefInt("fastPeriod", 11, core.PNorm(3, 15))
maRate := pol.Def("maRate", 4.4, core.PNorm(2.0, 8.0))
atrPeriod := pol.DefInt("atrPeriod", 14, core.PNorm(7, 30))
slMultiplier := pol.Def("slMultiplier", 1.3, core.PNorm(1.0, 5.0))
// 计算长期均线周期
longPeriod := int(float64(fastPeriod) * maRate)
// 确保预热足够长以覆盖所有指标
warmup := longPeriod + atrPeriod + 50
return &strat.TradeStrat{
Name: "Moving-Average-Convergence-Momentum-Cloud-Strategy",
WarmupNum: warmup,
HedgeOff: true, // 单向持仓
DrawDownExit: false,
RunTimeFrames: []string{"8h"},
OnBar: func(s *strat.StratJob) {
e := s.Env
close := e.Close
// 计算SMA
maShort := ta.SMA(close, fastPeriod)
maLong := ta.SMA(close, longPeriod)
cross := maShort.Cross(maLong)
// 计算ATR用于止损
atr := ta.ATR(e.High, e.Low, close, atrPeriod)
atrVal := atr.Get(0)
// RSI仅用于展示,不参与信号过滤
_ = ta.RSI(close, 14) // 保留调用但不用于条件判断
currentPrice := close.Get(0)
if math.IsNaN(currentPrice) || math.IsNaN(atrVal) {
return
}
// 买入信号:SMA上穿(无RSI过滤)
if cross == 1 {
s.OpenOrder(&strat.EnterReq{
Tag: "Buy",
StopLossVal: atrVal * slMultiplier,
StopLossTag: "atr_sl",
})
s.CloseOrders(&strat.ExitReq{
Tag: "ExitShort",
Dirt: core.OdDirtShort,
})
}
// 卖出信号:SMA下穿
if cross == -1 {
s.OpenOrder(&strat.EnterReq{
Tag: "sell",
Short: true,
StopLossVal: atrVal * slMultiplier,
StopLossTag: "atr_sl",
})
s.CloseOrders(&strat.ExitReq{
Tag: "exitLong",
Dirt: core.OdDirtLong,
})
}
// 可选:计算并保留其他指标用于分析或未来扩展
// bbU, bbM, bbL := ta.BBANDS(close, 20, 2, 2)
// tenkan := ta.SMA(ta.HL2(e.High, e.Low), 9)
// kijun := ta.SMA(ta.HL2(e.High, e.Low), 26)
// senkouA := ta.SMA(ta.Add(tenkan, kijun).Div(2), 26)
// senkouB := ta.SMA(ta.HL2(e.High, e.Low), 52)
// momentum := close.Sub(close.Back(1))
// roc := close.Sub(close.Back(12)).Div(close.Back(12)).Mul(100)
},
}
}