112 lines
3.2 KiB
Go
112 lines
3.2 KiB
Go
// 修复后的完整策略代码
|
||
// 请勿修改package包名和任意函数名
|
||
package llmjob
|
||
|
||
import (
|
||
"github.com/banbox/banbot/config"
|
||
"github.com/banbox/banbot/core"
|
||
"github.com/banbox/banbot/orm/ormo"
|
||
"github.com/banbox/banbot/strat"
|
||
ta "github.com/banbox/banta"
|
||
)
|
||
|
||
// MACD动态趋势量化交易策略
|
||
func J592(pol *config.RunPolicyConfig) *strat.TradeStrat {
|
||
// 定义可调超参数
|
||
fastPeriod := pol.DefInt("fastPeriod", 19, core.PNorm(5, 20))
|
||
slowRate := pol.Def("slowRate", 2.9, core.PNorm(1.5, 4))
|
||
signalPeriod := pol.DefInt("signalPeriod", 10, core.PNorm(5, 15))
|
||
|
||
// 计算慢线周期
|
||
slowPeriod := int(float64(fastPeriod) * slowRate)
|
||
|
||
return &strat.TradeStrat{
|
||
WarmupNum: 100, // 预热K线数量
|
||
EachMaxLong: 1, // 最多开1单做多
|
||
EachMaxShort: 1, // 最多开1单做空
|
||
DrawDownExit: true, // 启用回撤止盈
|
||
RunTimeFrames: []string{"8h"},
|
||
OnBar: func(s *strat.StratJob) {
|
||
e := s.Env
|
||
|
||
// 计算MACD指标
|
||
// 使用initType=1,符合中国主流使用习惯
|
||
macdLine, signalLine := ta.MACDBy(e.Close, fastPeriod, slowPeriod, signalPeriod, 1)
|
||
|
||
// 检测MACD线与信号线的交叉
|
||
// 返回值:1表示上穿(金叉),-1表示下穿(死叉),0表示重合或未知
|
||
cross := macdLine.Cross(signalLine)
|
||
|
||
// 计算ATR用于止损止盈
|
||
atr := ta.ATR(e.High, e.Low, e.Close, 14)
|
||
atrVal := atr.Get(0)
|
||
|
||
// 获取当前价格
|
||
|
||
// 获取当前订单数量
|
||
longOrders := s.LongOrders
|
||
shortOrders := s.ShortOrders
|
||
|
||
// 金叉信号:MACD线上穿信号线,且当前没有做多订单
|
||
if cross == 1 && len(longOrders) == 0 {
|
||
// 如果有空单,先平空单
|
||
if len(shortOrders) > 0 {
|
||
s.CloseOrders(&strat.ExitReq{
|
||
Tag: "close_short",
|
||
Dirt: core.OdDirtShort,
|
||
OrderType: core.OrderTypeMarket,
|
||
})
|
||
}
|
||
|
||
// 开多单
|
||
s.OpenOrder(&strat.EnterReq{
|
||
Tag: "long_cross",
|
||
Short: false,
|
||
OrderType: core.OrderTypeMarket,
|
||
StopLossVal: atrVal * 2, // 2倍ATR止损
|
||
TakeProfitVal: atrVal * 4, // 4倍ATR止盈
|
||
StopLossTag: "atr_stop_loss",
|
||
TakeProfitTag: "atr_take_profit",
|
||
})
|
||
}
|
||
|
||
// 死叉信号:MACD线下穿信号线,且当前没有做空订单
|
||
if cross == -1 && len(shortOrders) == 0 {
|
||
// 如果有多单,先平多单
|
||
if len(longOrders) > 0 {
|
||
s.CloseOrders(&strat.ExitReq{
|
||
Tag: "close_long",
|
||
Dirt: core.OdDirtLong,
|
||
OrderType: core.OrderTypeMarket,
|
||
})
|
||
}
|
||
|
||
// 开空单
|
||
s.OpenOrder(&strat.EnterReq{
|
||
Tag: "short_cross",
|
||
Short: true,
|
||
OrderType: core.OrderTypeMarket,
|
||
StopLossVal: atrVal * 2, // 2倍ATR止损
|
||
TakeProfitVal: atrVal * 4, // 4倍ATR止盈
|
||
StopLossTag: "atr_stop_loss",
|
||
TakeProfitTag: "atr_take_profit",
|
||
})
|
||
}
|
||
},
|
||
|
||
// 回撤止盈计算函数
|
||
GetDrawDownExitRate: func(s *strat.StratJob, od *ormo.InOutOrder, maxChg float64) float64 {
|
||
// 最大盈利超过5%后,回撤30%止盈
|
||
if maxChg > 0.05 {
|
||
return 0.3
|
||
}
|
||
// 最大盈利超过2%后,回撤50%止盈
|
||
if maxChg > 0.02 {
|
||
return 0.5
|
||
}
|
||
// 其他情况不设置回撤止盈
|
||
return 0
|
||
},
|
||
}
|
||
}
|