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

105 lines
2.7 KiB
Go
Raw Permalink 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 (
"math"
"github.com/banbox/banbot/config"
"github.com/banbox/banbot/core"
"github.com/banbox/banbot/strat"
ta "github.com/banbox/banta"
)
func J570(pol *config.RunPolicyConfig) *strat.TradeStrat {
// 定义可调参数
fastLength := pol.DefInt("fastLength", 20, core.PNorm(5, 20))
macdRate := pol.Def("macdRate", 3, core.PNorm(1.5, 3.5))
MACDLength := pol.DefInt("MACDLength", 12, core.PNorm(5, 15))
macdThreshold := pol.Def("macdThreshold", -0.25, core.PNorm(-0.8, -0.1))
takeProfitValue := pol.Def("takeProfitValue", 12, core.PNorm(2, 15))
// 计算慢速EMA周期
slowLength := int(float64(fastLength) * macdRate)
// 确定预热数量,需要足够的K线来计算MACD和检测谷底
warmupNum := slowLength + MACDLength + 3
return &strat.TradeStrat{
WarmupNum: warmupNum,
HedgeOff: true, // 单向持仓模式
TimeFrames: "8h",
OnBar: func(s *strat.StratJob) {
e := s.Env
// 计算MACD指标
fastEMA := ta.EMA(e.Close, fastLength)
slowEMA := ta.EMA(e.Close, slowLength)
macd := fastEMA.Sub(slowEMA)
aMACD := ta.EMA(macd, MACDLength)
delta := macd.Sub(aMACD)
// 获取当前、前一个和前两个时间点的delta值
delta0 := delta.Get(0)
delta1 := delta.Get(1)
delta2 := delta.Get(2)
// 获取当前MACD值和收盘价
macdValue := macd.Get(0)
closePrice := e.Close.Get(0)
// 检查数据有效性
if math.IsNaN(delta0) || math.IsNaN(delta1) || math.IsNaN(delta2) ||
math.IsNaN(macdValue) || math.IsNaN(closePrice) {
return
}
// 检测MACD谷底
isValley := delta0 > delta1 && delta1 < delta2
// 谷底买入信号
if isValley && macdValue <= macdThreshold && delta0 < 0 {
// 设置止盈价格
// 生成买入订单
s.OpenOrder(&strat.EnterReq{
Tag: "valley_buy",
TakeProfitVal: takeProfitValue,
})
}
// 检测delta与0的交叉
crossResult := delta.Cross(0)
// delta上穿0,买入信号
if crossResult == 1 {
// 获取当前最高价和最低价
highPrice := e.High.Get(0)
lowPrice := e.Low.Get(0)
if !math.IsNaN(highPrice) && !math.IsNaN(lowPrice) {
// 生成买入订单,使用固定止盈值0.3
s.OpenOrder(&strat.EnterReq{
Tag: "MacdLE",
TakeProfitVal: 0.3,
})
}
}
// delta下穿0,卖出信号
if crossResult == -1 {
// 获取当前最高价和最低价
highPrice := e.High.Get(0)
lowPrice := e.Low.Get(0)
if !math.IsNaN(highPrice) && !math.IsNaN(lowPrice) {
// 生成卖出订单,使用固定止盈值0.3
s.OpenOrder(&strat.EnterReq{
Tag: "MacdSE",
Short: true,
TakeProfitVal: 0.3,
})
}
}
},
}
}