init
This commit is contained in:
111
llmjob/592.go
Normal file
111
llmjob/592.go
Normal file
@@ -0,0 +1,111 @@
|
||||
// 修复后的完整策略代码
|
||||
// 请勿修改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
|
||||
},
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user