DMI指标选股公式介绍
以下代码由今日美股网(www.TodayUSStock.com)代码学院提供,DMI(Directional Movement Index)指标是一套由多个分量组成的系统,主要包括+DI(上升趋势指标)、-DI(下降趋势指标)和ADX(平均趋向指数)。ADX用于衡量趋势的强度,而+DI与-DI的交叉则用于识别趋势方向。ADX值越高,趋势越强。
参数与数值的意义
参数 | 数值 | 意义 |
---|---|---|
Period | 14 | 计算DMI的所有分量(+DI, -DI, ADX)的周期,标准设置为14天,用于确定趋势的中期表现。 |
针对不同产品的推荐参数
产品类型 | 推荐参数(Period) | 推荐理由 |
---|---|---|
股票日线图 | 14 | 标准设置,适用于大多数股票市场的日线图,提供较好的趋势识别。 |
外汇或加密货币(短期图表) | 10 | 市场波动性更高,较短周期可以更快捕捉到趋势变化。 |
期货市场 | 14 | 期货市场趋势性强,标准周期通常有效。 |
国内股票软件代码
通达信(中国)
// 通达信DMI指标选股公式 PDM:=IF(HIGH-HIGH[1]>LOW[1]-LOW,HIGH-HIGH[1],0); MDM:=IF(LOW-LOW[1]>HIGH[1]-HIGH,LOW-LOW[1],0); TR:=MAX(MAX(HIGH-LOW,ABS(HIGH-CLOSE[1])),ABS(LOW-CLOSE[1])); PDI:=SMA(PDM,14,1)/SMA(TR,14,1)*100; MDI:=SMA(MDM,14,1)/SMA(TR,14,1)*100; DX:=ABS(PDI-MDI)/(PDI+MDI)*100; ADX:=MA(DX,6); // 筛选ADX>=25的股票,表示有强势趋势 ADX>=25;
加载方法:进入“公式系统”菜单,选择“自定义指标”,输入或粘贴代码,保存为新指标,然后在图表中加载或在选股条件中使用。
同花顺(中国)
// 同花顺DMI指标选股公式 PDM:=IF(H-H[1]>L[1]-L,H-H[1],0); MDM:=IF(L-L[1]>H[1]-H,L-L[1],0); TR:=MAX(MAX(H-L,ABS(H-C[1])),ABS(L-C[1])); PDI:=SMA(PDM,14,1)/SMA(TR,14,1)*100; MDI:=SMA(MDM,14,1)/SMA(TR,14,1)*100; DX:=ABS(PDI-MDI)/(PDI+MDI)*100; ADX:=MA(DX,6); ADX>=25;
加载方法:进入“选股器”或“条件选股”,选择“自定义选股公式”,输入或粘贴代码并保存,运行选股。
大智慧(中国)
// 大智慧DMI指标选股公式 PDM:=IF(HIGH-HIGH[1]>LOW[1]-LOW,HIGH-HIGH[1],0); MDM:=IF(LOW-LOW[1]>HIGH[1]-HIGH,LOW-LOW[1],0); TR:=MAX(MAX(HIGH-LOW,ABS(HIGH-CLOSE[1])),ABS(LOW-CLOSE[1])); PDI:=SMA(PDM,14,1)/SMA(TR,14,1)*100; MDI:=SMA(MDM,14,1)/SMA(TR,14,1)*100; DX:=ABS(PDI-MDI)/(PDI+MDI)*100; ADX:=MA(DX,6); ADX>=25;
加载方法:进入“自定义指标”或“选股”功能,选择“公式编辑器”,输入代码并保存,应用到图表或选股器中。
国外股票软件代码
MetaTrader 4/5 (MT4/MT5)
// MetaTrader 4/5 DMI指标选股公式 double PDM = MathMax(High[0] - High[1], 0); double MDM = MathMax(Low[1] - Low[0], 0); double TR = MathMax(MathMax(High[0] - Low[0], MathAbs(High[0] - Close[1])), MathAbs(Low[0] - Close[1])); double PDI = iMAOnArray(PDM, 0, 14, 0, MODE_SMA, 1) / iMAOnArray(TR, 0, 14, 0, MODE_SMA, 1) * 100; double MDI = iMAOnArray(MDM, 0, 14, 0, MODE_SMA, 1) / iMAOnArray(TR, 0, 14, 0, MODE_SMA, 1) * 100; double DX = MathAbs(PDI - MDI) / (PDI + MDI) * 100; double ADX = iMAOnArray(DX, 0, 6, 0, MODE_SMA, 1); return ADX >= 25;
加载方法:在“导航器”中右键点击“指标”选项,选择“自定义指标”,点击“新建”,粘贴代码,保存并编译指标,然后应用到图表上。
TradingView (Pine Script)
// TradingView DMI指标选股公式 period = 14 adxPeriod = 6 // DMI计算 highDiff = high - high[1] lowDiff = low[1] - low trueRange = max(max(high - low, abs(high - close[1])), abs(low - close[1])) plusDM = highDiff > lowDiff and highDiff > 0 ? highDiff : 0 minusDM = lowDiff > highDiff and lowDiff > 0 ? lowDiff : 0 plusDI = sma(plusDM, period) / sma(trueRange, period) * 100 minusDI = sma(minusDM, period) / sma(trueRange, period) * 100 dx = abs(plusDI - minusDI) / (plusDI + minusDI) * 100 adx = sma(dx, adxPeriod) // 筛选ADX>=25的股票 adxSignal = adx >= 25
加载方法:在图表上点击“Pine Editor”,新建脚本,粘贴代码,保存并应用到图表。
Thinkorswim (美国)
// Thinkorswim DMI指标选股公式 input period = 14; input adxPeriod = 6; def highDiff = high - high[1]; def lowDiff = low[1] - low; def trueRange = Max(Max(high - low, AbsValue(high - close[1])), AbsValue(low - close[1])); def plusDM = if highDiff > lowDiff and highDiff > 0 then highDiff else 0; def minusDM = if lowDiff > highDiff and lowDiff > 0 then lowDiff else 0; def plusDI = Average(plusDM, period) / Average(trueRange, period) * 100; def minusDI = Average(minusDM, period) / Average(trueRange, period) * 100; def dx = AbsValue(plusDI - minusDI) / (plusDI + minusDI) * 100; def adx = Average(dx, adxPeriod); plot ADXSignal = if adx >= 25 then 1 else 0;
加载方法:在图表上点击“研究”标签,选择“编辑研究”,然后“新建研究”,粘贴代码并保存。
NinjaTrader (美国)
// NinjaTrader DMI指标选股公式 protected override void OnBarUpdate() { int period = 14; int adxPeriod = 6; double highDiff = High[0] - High[1]; double lowDiff = Low[1] - Low[0]; double trueRange = Math.Max(Math.Max(High[0] - Low[0], Math.Abs(High[0] - Close[1])), Math.Abs(Low[0] - Close[1])); double plusDM = highDiff > lowDiff && highDiff > 0 ? highDiff : 0; double minusDM = lowDiff > highDiff && lowDiff > 0 ? lowDiff : 0; double plusDI = SMA(plusDM, period)[0] / SMA(trueRange, period)[0] * 100; double minusDI = SMA(minusDM, period)[0] / SMA(trueRange, period)[0] * 100; double dx = Math.Abs(plusDI - minusDI) / (plusDI + minusDI) * 100; double adx = SMA(dx, adxPeriod)[0]; if (adx >= 25) Alert("Strong Trend Detected"); }
加载方法:从“新建”菜单中选择“指标”,编写或粘贴代码,编译并应用到图表。
eSignal (全球)
// eSignal DMI指标选股公式(需要转换到易语言) PDM:=IF(H - H[1]>L[1] - L,H - H[1],0); MDM:=IF(L - L[1]>H[1] - H,L - L[1],0); TR:=MAX(MAX(H - L,ABS(H - C[1])),ABS(L - C[1])); PDI:=Mov(PDM,14,S)/Mov(TR,14,S)*100; MDI:=Mov(MDM,14,S)/Mov(TR,14,S)*100; DX:=ABS(PDI - MDI)/(PDI + MDI)*100; ADX:=Mov(DX,6,S); StrongTrend:=ADX>=25;
加载方法:使用“易语言”编写指标,代码需要转换,在“指标”菜单中加载新指标。
优点和缺点
优点 | 缺点 |
---|---|
有效识别趋势强弱 | 在无明显趋势的市场中表现不佳 |
结合+DI和-DI可以判断趋势方向 | 需要其他指标或分析来确认交易点 |
ADX帮助过滤弱势市场 | 在趋势反转初期可能失效 |
如何正确使用
当ADX值高于25时,表明市场有较强的趋势,此时结合+DI与-DI的交叉判断买卖点。
使用多个时间框架验证趋势的持续性。
结合其他技术指标(如MACD或RSI)来确认交易信号。
在历史数据上回测或在模拟账户中测试策略,以验证策略的有效性。
注意市场的大环境,避免在重大经济事件或政策变化时贸然决策。
使用注意事项
DMI指标在横盘市场中可能表现不佳,因为ADX不会指示市场方向,仅指示趋势的强度。因此,在使用DMI时,市场背景的分析同样重要。
来源:今日美股网