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

112 lines
3.2 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包名和任意函数名
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
},
}
}