DMI(动向指标)
DMI 指标又叫动向指标或趋向指标,其全称叫“Directional Movement Index,简称 DMI”,也是由美国技术分析大师威尔斯·威尔德(Wells Wilder)所创造的,是一种中长期股市技术分析(Technical Analysis)方法。
DMI 指标是通过分析股票价格在涨跌过程中买卖双方力量均衡点的变化情况,即多空双方的力量的变化受价格波动的影响而发生由均衡到失衡的循环过程,从而提供对趋势判断依据的一种技术指标。
计算方法:
DMI 的计算方法比较复杂,需要计算 DI1(上升指标),DI2(下降指标),ADX(平均动向指数)和 ADXR 四个指标,计算过程中还要涉及到一些中间指标比如 TR,DMP,DMM 等
以日 DMI 为例,计算过程如下:
1. 计算每日真实波幅 TR,并对 N1 日的真实波幅求和,记作 TR_sum
真实波幅等于当日股价振幅、最高与昨收差价、最低与昨收差价中的最大值。
2. 计算上升动向值 DMP 和下降动向值 DMM
上升动向值 DMP,其数值等于当日的最高价减去前一日的最高价,如果 <=0 则 DMP=0。
下降动向值 DMM,其数值等于前一日的最低价减去当日的最低价,如果 <=0 则 DMM=0
再比较 DMP 和 DMM,较大的那个数字保持,较小的数字归 0
3. 分别对 N1 日 DMP 和 DMM 求和,记作 DMP_sum 和 DMM_sum
4. 上升指标 DI1=DMP_sum*100/TR_sum
5. 下降指标 DI2=DMM_sum*100/TR_sum
6. 计算 N2 日内的平均动向指数 ADX=MA(DX,N2)
其中,动向指数 DX 等于 DI1 和 DI2 间的差的绝对值除以总和的百分比
7. 计算评估数值 ADXR=(当日的 ADX+ 前 N2 日的 ADX)/2
指标参数:
y1 |
DI1输出列。 |
y2 |
DI2输出列 |
y3 |
ADX输出列 |
y4 |
ADXR输出列 |
n1 |
时间周期,如 14 |
n2 |
时间周期,如 6 |
函数代码:
A |
B |
|
1 |
func DMI(A,$y1,$y2,$y3,$y4,n1,n2) |
=A.derive@o(:dmi_tr,:dmi_hd,:dmi_ld,:dmi_trsum,:dmi_dmp,:dmi_dmm,:dmi_dmpsum,:dmi_dmmsum,:dmi_dx) |
2 |
=A.run(max(( 最高 - 最低 ),abs( 最高 - 收盘 [-1]),abs(最低 - 收盘 [-1])):dmi_tr, 最高 - 最高 [-1]:dmi_hd, 最低 [-1]- 最低:dmi_ld) |
|
3 |
=A.run(sum(dmi_tr[1-n1:0]):dmi_trsum, if(dmi_hd>0 && dmi_hd>dmi_ld,dmi_hd,0):dmi_dmp, if(dmi_ld>0 && dmi_ld>dmi_hd,dmi_ld,0):dmi_dmm, sum(dmi_dmp[1-n1:0]):dmi_dmpsum, sum(dmi_dmm[1-n1:0]):dmi_dmmsum) |
|
4 |
=A.run(dmi_dmpsum*100/dmi_trsum:${y1}, dmi_dmmsum*100/dmi_trsum:${y2}, abs(${y1}-${y2})/(${y1}+${y2})*100:dmi_dx, avg(dmi_dx[1-n2:0]):${y3}, (${y3}+${y3}[-n2])/2:${y4}) |
|
5 |
=A.alter(;dmi_tr,dmi_hd,dmi_ld,dmi_trsum,dmi_dmp,dmi_dmm,dmi_dmpsum,dmi_dmmsum,dmi_dx) |
将函数保存在 indicator.splx 中。
举例:调用脚本计算浦发银行 2024 年收 DMI 指标,n1、n2 取 14 和 6。
A |
B |
|
… |
… |
|
5 |
=call@f("indicator.splx") |
登记脚本中的函数 |
6 |
… |
计算出源数据 |
7 |
=A6.derive(:DI1,:DI2,:ADX,:ADXR) |
增加要返回的指标字段 |
8 |
=DMI(A7,DI1,DI2,ADX,ADXR,14,6) |
调用函数计算指标 |
运行效果: