DMI 指标的计算与应用

Author: 小小梦, Created: 2019-07-03 14:03:53, Updated: 2023-10-25 20:00:58

img

DMI 指标的计算与应用

指标简介

DMI指标又叫动向指标或趋向指标,其全称叫“Directional Movement Index,简称DMI”,
也是由美国技术分析大师威尔斯·威尔德(Wells Wilder)所创造的,是一种中长期股市技术分析(Technical Analysis)方法。
DMI指标是通过分析股票价格在涨跌过程中买卖双方力量均衡点的变化情况,
即多空双方的力量的变化受价格波动的影响而发生由均衡到失衡的循环过程,从而提供对趋势判断依据的一种技术指标。
  • 指标计算

    最近有不少量化圈的朋友咨询我,在发明者量化交易平台上如何使用DMI指标。开始以为是很简单的问题,顺手就打开了API 文档查找这个指标函数。发现万能的 talib 指标库中没有这个指标。赶忙百度、知乎…一顿操作猛如虎后,找到了一些指标的资料。 发现这个指标是由四个指标组合而成,算法不是很复杂,干脆动手按照资料上的算法写一下。

    范例地址: https://www.fmz.com/strategy/154050

  • 指标源码帖一下

    // 指标函数
    function ADX(MDI, PDI, adx_period) {
        if(typeof(MDI) == "undefined" || typeof(PDI) == "undefined"){
            return false 
        }  
    
        if(MDI.length < 10 || PDI.length < 10){
            return false 
        }  
    
        /*
        DX = abs(DIPlus-DIMinus) / (DIPlus+DIMinus)*100
        ADX = sma(DX, len)
        */  
    
        var dx = []
        for(var i = 0; i < MDI.length; i++){
            if(!MDI[i] || !PDI[i]){
                continue
            }
            var dxValue = Math.abs((PDI[i] - MDI[i])) / (PDI[i] + MDI[i]) * 100
            var obj = {
                Close : dxValue,
            }
            dx.push(obj)
        }  
    
        if(dx.length < adx_period){
            return false
        }  
    
        var adx = talib.SMA(dx, adx_period)  
    
        return adx
    }  
    
    function DMI(records, pdi_period, mdi_period, adxr_period, adx_period) {    
        var recordsHLC = []
        for(var i = 0; i < records.length ; i++){
            var bar = {
                High : records[i].High,
                Low : records[i].Low, 
                Close : records[i].Close,
            }
            recordsHLC.push(bar)
        }
        
        var m_di = talib.MINUS_DI(recordsHLC, mdi_period) 
        var p_di = talib.PLUS_DI(recordsHLC, pdi_period)  
    
        var adx = ADX(m_di, p_di, adx_period)
        
        // ADXR=(当日的ADX+前n日的ADX)÷2
        var n = 0
        var adxr = []
        for (var j = 0 ; j < adx.length; j++) {
            if (typeof(adx[j]) == "number") {
                n++
            }
            
            if (n >= adxr_period) {
                var currAdxr = (adx[j] + adx[j - adxr_period]) / 2
                adxr.push(currAdxr)
            } else {
                adxr.push(NaN)
            }
        }
        
        return [m_di, p_di, adx, adxr]
    }
    
  • 对比

    用发明者量化的画线类库,很轻松的画出图表,可以对比下其他图表上的DMI

    img

    img

    对比了几根Kbar上的指标值,数值基本一致(略微四舍五入的偏差)。

  • 使用

    直接使用 DMI 这个函数(例如范例中 main 函数中调用的方式),传入K线数据,设置指标参数,一般都是14。 函数返回的数据是一个二维数组,分别代表四条线。

    • DI- : m_di,
    • DI+ : p_di,
    • ADX : adx,
    • ADXR: adxr,

    DMI指标中 这四条线,其中DI-,DI+ 是多空指标,体现了多空双方的力量。 ADX和ADXR是一对一起使用的指标线,是趋向指标,体现了目前行情的趋势和方向。

    DI+ ,指标数值越高,显示当前市场多头越强,反之多头越弱。 DI- ,指标相反。 DI+,DI-往往是交织在一起,之间数值越近代表市场处于盘整僵局中。反之说明趋势型增强。

    • 信号

      1、寻底

      经过长期下跌,若短期满足以下条件,说明短期底部已经探明,可能出现超跌反弹或反转。

      • 1、代表多头力量的DI+线在10以下,处于超跌位置向上拐头,DI—线在高位。

      • 2、代表趋势的ADX线在65以上较高的位置,向下拐头并与ADXR线形成死叉。

      2、探顶

      经过长期上涨,若短期满足以下条件,说明短期顶部已经探明,可能出现短期调整或反转。

      • 1、代表空头力量的DI—线在10以下,处于低位并向上拐头,DI+线在高位。

      • 2、代表趋势的ADX线在65以上较高的位置,向下拐头并与ADXR线形成死叉。

      3、起势

      走势经过一段时间的波动,DMI四条指标线在低位相互缠绕,之后忽然出现涨幅超5%的放量长阳k线, DI+线在两日内连续上穿DI-线、ADX线与ADXR线,代表新的上升趋势将要形成。DI+线上穿最后一根指标线即可买入。


Related

More

lonelyman 似曾相识

wuzhenyuv 梦总,能否写个基于DMI的趋势判断策略?

小小梦 好的 有时间了 写个范例。