你好老师,金字塔里系统不带ADX指标,我尝试自己编写,但是最终数值出现了问题,请老师帮忙看看,谢谢!
ADX的计算方式 1、计算DM 图1:如何计算方向性运动DM。图片来源:《期货市场计算机分析指南》计算ADX的第一步是计算价格的方向性运动DM,其为当天的波动区间超出前一日波动区间的最大部分。图1中的左侧,当天价格向上运动,超出前一日波动区间的部分我们称为+DM;而在图1中的右侧,当天价格向下波动,超出前一日波动区间的部分我们称为-DM。 对于外部日,即当天的价格波动在上下两个方向都超出了前一日的波动区间,我们取超出部分的较大者;对于内含日,即当天的价格波动在上下两个方向都没有超出前一日的波动区间,我们认为DM=0。 2、计算真实区间TR TR=MAX{当日最高价和最低价之差,当日最高价和前一日收盘价之差,当日最低价和前一日收盘价之差} 3、计算方向指标DI DI=DM/TR 注意,我们区分DM为+DM和-DM,这在数值上表现为可正可负,而TR则只是一个正数,因此,DI也是可正可负的,我们区分为+DI和-DI。 此外,这里是先计算的14周期+DM均值+DM14和14周期-DM均值-DM14,以及14周期TR均值TR14。 此时,+DI14=+DM14/ TR14,-DI14=-DM14/ TR14。 4、计算+DI与-DI的差值 差值=|(+DI14)-(-DI14)| 5、计算+DI与-DI的和值 和值=|(+DI14)+(-DI14)| 6、计算方向性运动指数DX DX=(差值/和值)*100 然后再计算方向性运动指数DX的14周期平均值,就得到了平均趋向指数ADX。 ADX的计算非常复杂,我们在这里大篇幅的论述是为了让大家更好地理解ADX。目前几乎所有交易软件都自带ADX指标,并不需要我们单独计算。 从ADX的计算方式可知,其数值一定为正数,且一定位于0~100之间。
最终输出ADX有大于100的值和负值,请老师看看是哪里出了问题,代码如下: INPUT:m(14,7,60,1),n(14,7,60,1);
UP:high-ref(high,1); //今天最高-昨日最高 DOWN:ref(low,1)-low; //昨日最低-今日最低
TR1:MAX(MAX((HIGH-LOW),ABS(REF(CLOSE,1)-HIGH)),ABS(REF(CLOSE,1)-LOW)); ATR:MA(TR1,m); //14日ATR线
ZDM:MA(UP,n); // +DM FDM:MA( DOWN,n); // -DM
ZDI:(ZDM/ATR)*100; // +DI FDI:(FDM/ATR)*100; // -DI
CZ1:ZDI+ABS(FDI); // +DI与-DI差值 CZ2:ZDI-FDI; // +DI与-DI和值
DX:(CZ1/CZ2)*100; ADX:ma(DX,n);
|