基于DMI和移动平均线的交易策略


创建日期: 2023-09-28 12:39:44 最后修改: 2023-09-28 12:39:44
复制: 0 点击次数: 638
avatar of ChaoZhang ChaoZhang
1
关注
1243
关注者

概述

该策略通过结合趋向指标DMI和移动平均线来识别的趋势方向,以发出买入和卖出信号。当DMI显示报价进入趋势状态且移动平均线确认趋势方向时,策略会产生交易信号。

策略原理

该策略主要基于两个指标:

  1. DMI包括DMI+和DMI-,用于识别趋势的存在及方向。当DMI+高于DMI-,表示上升趋势;当DMI-高于DMI+,表示下跌趋势。

  2. 移动平均线,一般选取15到50天的平均线,用于判断价格趋势方向。当价格高于(低于)移动平均线时,表示上升(下跌)趋势。

策略首先计算DMI+、DMI-和移动平均线。在DMI显示趋势状态(DMI+高于DMI-或DMI-高于DMI+)的同时,如果移动平均线也确认该趋势方向,则产生交易信号。具体来说:

  • 当DMI+上穿DMI- 且价格上穿移动平均线时,做多;
  • 当DMI-上穿DMI+ 且价格下穿移动平均线时,做空。

该策略同时加入了反转输入选项。启用反转后,做多和做空信号会反向。

优势分析

这种结合趋向指标和趋势指标的策略,可以提高信号的可靠性,利用两种指标的优势进行互补。

DMI的优势在于可以快速识别趋势的存在。而移动平均线可过滤掉部分噪音,确认趋势方向。两者结合使用,可以在趋势形成时较早进入场内,同时避免在非趋势时随波逐流。

另外,该策略加入反转选项,可以根据实际需要选择顺势或逆势交易。这增加了策略的灵活性。

风险分析

该策略主要存在以下风险:

  1. 在趋势转换时,可能出现错误信号,从而导致亏损。这需要调整参数,或设置止损来控制风险。

  2. 趋势形成需要一定时间,在此期间策略容易受到价格震荡的干扰,产生错误信号。可以适当调整DMI和移动平均线的参数期限来过滤这种噪音。

  3. 反转交易面临逆势亏损扩大的风险。启用反转时,需要控制单笔亏损比例,或使用移动止损来锁定部分利润。

  4. 不同品种和不同时间周期下,参数需要重新优化。直接复制参数在其他品种或周期使用可能效果不佳。

优化方向

该策略可以从以下几个方面进行优化:

  1. 测试不同的移动平均线周期参数,找到衔接趋势转换的最佳参数组合。

  2. 测试DMI的平滑周期参数,过滤趋势中出现的短期反转噪音。

  3. 评估启用反转选项与默认顺势交易在历史回测中的效果差异,选择更优方案。

  4. 加入止损策略,如移动止损、时间止损、突破止损等,控制单笔亏损。

  5. 评估在不同品种和周期参数优化效果,优化参数组合。

  6. 结合其他指标进行过滤,如强弱指标RSI,可避免局部极值点发出错误信号。

总结

该策略通过融合趋向指标DMI和移动平均线两种指标的优势,在趋势形成时较早进入场内,并可避免在震荡行情中被套牢。反转交易选项也增加了策略的灵活性。通过参数优化、止损以及与其他指标组合使用,可以进一步增强策略稳定性。但需要注意不同品种和周期下需要重新测试参数的适用性。

策略源码
/*backtest
start: 2023-08-28 00:00:00
end: 2023-09-27 00:00:00
period: 3h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
////////////////////////////////////////////////////////////
//  Copyright by HPotter v1.0 03/03/2017
// The related article is copyrighted material from Stocks & Commodities Aug 2009 
//
// You can change long to short in the Input Settings
// Please, use it only for learning or paper trading. Do not for real trading.
////////////////////////////////////////////////////////////
strategy(title="Combining DMI And Moving Average For A EUR/USD Trading System")
Length_MA = input(30, minval=1)
Length_DMI = input(14, minval=1)
reverse = input(false, title="Trade reverse")
xMA = sma(close, Length_MA)
up = change(high)
down = -change(low)
trur = rma(tr, Length_DMI)
xPDI = fixnan(100 * rma(up > down and up > 0 ? up : 0, Length_DMI) / trur)
xNDI = fixnan(100 * rma(down > up and down > 0 ? down : 0, Length_DMI) / trur)
nPDI = xPDI
nNDI = xNDI
nMA = xMA
nPDI_1 = xPDI[1]
nNDI_1 = xNDI[1]
nMA_1 = xMA[1]
bMDILong =iff(nPDI > nNDI and nPDI_1 < nNDI_1, true, 
           iff(nPDI < nNDI and nPDI_1 > nNDI_1, false, false)) 
bMDIShort =  iff(nPDI > nNDI and nPDI_1 < nNDI_1, false, 
              iff(nPDI < nNDI and nPDI_1 > nNDI_1, true, false)) 
bMALong = iff(close > nMA and close[1] < nMA_1, true, 
           iff(close < nMA and close[1] > nMA_1, false, false))
bMAShort = iff(close > nMA and close[1] < nMA_1, false, 
             iff(close < nMA and close[1] > nMA_1, true, false))
pos = iff(bMDILong and bMALong, 1, 
     iff(bMDIShort and bMAShort, -1, nz(pos[1], 0)))
possig = iff(reverse and pos == 1, -1,
          iff(reverse and pos == -1, 1, pos))	   
if (possig == 1 )
    strategy.entry("Long", strategy.long)
if (possig == -1 )
    strategy.entry("Short", strategy.short)	   	    
barcolor(possig == -1 ? red: possig == 1 ? green : blue )
plot(nPDI, color=green, title="DMI Plus")
plot(nNDI, color=red, title="DMI Minus")