双动量指标突破策略


创建日期: 2023-11-16 17:00:54 最后修改: 2023-12-01 14:59:44
复制: 1 点击次数: 366
1
关注
1124
关注者

双动量指标突破策略

概述

该策略是一种双动量指标突破策略。它使用两个不同参数设置的动量指标,在两个动量指标都突破零轴时产生交易信号。该策略只做多头 entries,空头仅用于平仓。

策略原理

代码首先设置策略属性,如委托模式、手续费模式等。然后它计算两个动量指标:

// Momentum settings

i_len           = input(defval = 12, title = "Length", minval = 1) 
i_src           = input(defval = close, title = "Source")
i_percent       = input(defval = true, title = "Percent?")
i_mom           = input(defval = "MOM2", title = "MOM Choice", options = ["MOM1", "MOM2"])

// Momentum code

mom0 = momentum(i_src, i_len, i_percent) 
mom1 = momentum(mom0, 1, i_percent)
mom2 = momentum(i_src, 1, i_percent)

momX = mom1 

if i_mom == "MOM2"
    momX := mom2

mom0是基础动量指标,长度为i_len,数据源为i_src,是否计算百分比由i_percent决定。

mom1是以mom0为数据源,长度为1的动量指标。

mom2是以原始数据i_src为源,长度为1的动量指标。

最终使用的动量指标momX默认为mom1,也可以选择mom2。

当mom0和momX同时超过0轴时,做多;当mom0和momX同时低于0轴时,平仓。

策略优势

  1. 使用双动量指标结合不同参数设置,可以提高交易信号的可靠性,双重确认降低了假信号。

  2. 只做多头entries,空头仅用于平仓,可以降低交易频率,减少交易成本。

  3. 动量指标参数可以调整,适应不同市场环境。

  4. 代码结构清晰,容易理解和修改。

  5. 加入了交易消息设置,可以结合自动交易系统使用。

策略风险

  1. 双动量指标虽然可以减少假信号,但也可能错过较弱的趋势信号。

  2. 仅做多头交易,可能错过空头交易机会。

  3. 动量指标参数设置不当可能导致过于频繁或过于迟缓的交易。

  4. 回测数据不充分可能导致参数过拟合。

  5. 双重确认虽降低假信号但无法完全避免,实盘交易时仍需关注突破有效性。

策略优化方向

  1. 可以测试不同长度以及是否计算百分比的参数组合,找出最佳参数。

  2. 可以考虑在趋势确认后,加入空头交易信号,以捕捉更多交易机会。

  3. 可以测试不同的动量指标计算方式,如ROC,RSI等,寻找更好的效果。

  4. 可以结合趋势过滤,避免在震荡行情中交易。

  5. 可以优化止损策略,在利润最大化的同时控制风险。

总结

本策略是一个典型的双动量指标突破策略。它使用双重确认降低假信号,只做多头进入以减少交易频率。该策略优点是简单明了,容易实现,在参数优化和风险控制时有很大的改进空间。整体来说,本策略作为动量突破策略的基础框架是可行的,但需要针对具体市场进行优化调整,才能在实盘中稳定盈利。

策略源码
/*backtest
start: 2023-10-16 00:00:00
end: 2023-11-15 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Momentum Long Strategy", overlay = false, precision = 2, initial_capital = 10000, default_qty_value = 10000, default_qty_type = strategy.cash, commission_type = strategy.commission.percent, commission_value = 0, calc_on_every_tick = true)

// There will be no short entries, only exits from long.
strategy.risk.allow_entry_in(strategy.direction.long)

// Calculate start/end date and time condition
startDate  = input(timestamp("2021-01-02T00:00:00"), title = "Start Date", type = input.time)
finishDate = input(timestamp("2021-12-31T00:00:00"), title = "End Date",type = input.time)
 
time_cond  =true

// Momentum settings

i_len           =       input(defval = 12,      title = "Length",       minval = 1)
i_src           =       input(defval = close,   title = "Source")
i_percent       =       input(defval = true,    title = "Percent?")
i_mom           =       input(defval = "MOM2",  title = "MOM Choice",   options = ["MOM1", "MOM2"])

// Messages for buy and sell
message_buy  = input("{{strategy.order.alert_message}}", title="Buy message")
message_sell = input("{{strategy.order.alert_message}}", title="Sell message")

// Momentum code

momentum(seria, length, percent) =>
	_mom        =       percent ? ( (seria / seria[length]) - 1) * 100 : seria - seria[length]
	_mom

mom0        =       momentum(i_src, i_len, i_percent)
mom1        =       momentum(mom0, 1, i_percent)
mom2        =       momentum(i_src, 1, i_percent)

momX        =       mom1

if i_mom == "MOM2"
    momX    :=     mom2
    
// Strategy Alerts    

if (mom0 > 0 and momX > 0 and time_cond)
    strategy.entry("MomLE", strategy.long, stop = high + syminfo.mintick, comment = "MomLE", alert_message = message_buy)
else
	strategy.cancel("MomLE")
if (mom0 < 0 and momX < 0 and time_cond)
	strategy.entry("MomExit", strategy.short, stop = low - syminfo.mintick, comment = "MomSE", alert_message = message_sell)
else
	strategy.cancel("MomExit")
	
// Plotting

plot(0, color = #5d606b, title = "ZERO")
plot(mom0, color = #00bcd4, title = "MOM")
plot(mom1, color = #00FF00, title = "MOM1", display = display.none)
plot(mom2, color = #00FF00, title = "MOM2")
更多内容