105 lines
2.7 KiB
Go
105 lines
2.7 KiB
Go
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,
|
||
})
|
||
}
|
||
}
|
||
},
|
||
}
|
||
}
|