分享

[转载]通达信公式SMA函数计算方式的问题

 mentor1974 2020-08-22

  最近有网友在百度知道中提到,通达信软件与大智慧软件写入相同的计算公式,但是计算出来的指标结果却不尽相同,尤其是在次新股中,差异较大,比如用钱龙的计算方式计算出来的DMI指标(DMI-QL)。

  举例来说,在次新股300238冠昊生物中,打开周K线图,大智慧默认指标DMI-QL,2011年9月23日该指标四个主要参数:PDI为14.272MDI为9.906 ADX为40.297ADXR为30.116 ,如果我们提取出大智慧DMI-QL指标的公式,在不改变该公式计算方式和取值的基础上,稍作修改将其放入通达信中,生成通达信公式,按理来说,计算方式相同,取值相同,得出的结果也应该是相同的。可是当我们使用通达信打开300238的周K线图,看到2011年9月23日该指标的四个主要参数,却是分别为:PDI14.27 MDI 9.91 ADX 91.62 ADXR 95.81

  这里边我们发现,PDI和MDI的计算结果是基本一致的,差别主要在于大智慧是取小数点后的3位数,而通达信只取2位,并且进行了“五舍六入”,差异最大的是ADX值和ADXR值,那么是什么原因造成了这么大的差异哪?

  笔者经过仔细对照和计算后发现,造成这种问题的原因主要是由于通达信软件中SMA函数的计算方式有错误。下面我们来深度剖析一下通达信和大智慧在计算DMI-QL公式的过程中,对SMA进行计算时的区别。

  还是以300238冠昊生物周K线图为例:(由于300238周K线图只有12根K线,而我们对DMI指标中的参数进行SMA平均的时候取值为14,在无法得到取值数据的时候,默认取值为0,才会出现上述问题。)

  下面先列出相关公式:(N=14 M=6)

大智慧DMI-QL 

TR :=SMA(MAX(MAX(HIGH-LOW,ABS(HIGH-REF(CLOSE,1))),ABS(LOW-REF(CLOSE,1))),N,1);
HD := HIGH-REF(HIGH,1);
LD := REF(LOW,1)-LOW;
DMP:= SMA(IF(HD>0 ANDHD>LD,HD,0),N,1);
DMM:= SMA(IF(LD>0 ANDLD>HD,LD,0),N,1);
PDI: DMP*100/TR;
MDI: DMM*100/TR;
ADX: SMA(ABS(MDI-PDI)/(MDI+PDI)*100,N,1);
ADXR:(ADX+REF(ADX,M))/2;

 

修改后放入通达信中:

HD := HIGH-REF(HIGH,1);
LD := REF(LOW,1)-LOW;
DMP:= SMA(IF(HD>0 ANDHD>LD,HD,0),N,1);
DMM:= SMA(IF(LD>0 ANDLD>HD,LD,0),N,1);
PDI:DMP*100/SMA(MAX(MAX(HIGH-LOW,ABS(HIGH-REF(CLOSE,1))),ABS(LOW-REF(CLOSE,1))),N,1);
MDI:DMM*100/SMA(MAX(MAX(HIGH-LOW,ABS(HIGH-REF(CLOSE,1))),ABS(LOW-REF(CLOSE,1))),N,1);
ADX: SMA(ABS(MDI-PDI)/(MDI+PDI)*100,N,1);
ADXR:(ADX+REF(ADX,M))/2;

(通达信中有一个函数名为 TR,所以不能以TR为名赋值,笔者较懒,干脆直接引用了,其实是可以改个名字再进行赋值的)

  通过公式我们知道,两种其实没什么区别,计算方式没变,赋值没变,那么为什么PDI和MDI得出的结果一致,而ADX和ADXR,却差异那么大哪?由于ADXR是通过ADX计算出来的,所以我们只需要找到ADX计算出现问题的原因就可以了,为了搞明白问题产生的真正原因,笔者找到了DMI计算的源头,将光标移动到300238周线图前三根K线处发现,此时DMI的四个参数都是没有数值的。从第四根K线开始,PDI和ADX数值出现了,我们会发现,大智慧的ADX是7.143,而通达信的ADX是100。
  通过ADX的计算公式我们可以看到,它的计算是要用到MDI数值的,而MDI的数值会在第十一根K线时才出现,此时还没有MDI得数值,那么两家软件得出的ADX值是怎么来的哪?先让我们看一看ADX的计算公式:

  ADX=SMA(ABS(MDI-PDI)/(MDI+PDI)*100,N,1)

  这里边涉及到了四个变量,PDI、MDI、SMA和N, 经过对照,我们知道,两种软件PDI和MDI的值是一样的(只是取的位数不同),那么我们来分析SMA的计算方式:

SMA《加权移动平均数》=[ X《X=(MDI-PDI)/(MDI+PDI) ×100》 ×  M《M为权重,这里是1》+Y《Y为前一日ADX值》 ×  (N-M) ] / N,计算方式本身没有问题,大智慧和通达信用的也都是一样的。
  但是鉴于最后得出的结果不同,经过笔者重新计算,得出了如下结论:
在计算ADX时,两家软件都是将MDI取值为 0 ,当用到 Y (前一日ADX)时,也是取值为0,但是当计算最后一步时,大智慧是先计算的X × M+Y × (N-M)然后才除以N,而通达信是,先用Y ×(N-M)除以N,然后才加的 X × M,所以造成了最后的结果就大智慧的ADX是1.743,而通达信是100,也就是说,通达信的SMA函数在计算时没有将公式中的“中括号部分”先进行计算,所以,笔者认为通达信的SMA函数应该是有错误的,(或许是缺少了一个中括号)这也就是为什么同样的计算公式,同样的取值,计算出的结果却不同的原因了。

  笔者对公式的编辑也并非十分精通,或许有些地方没有理解,或许有些别的函数可以代替,笔者不知道。笔者也曾想用其他函数来计算ADX的值,但是没能在通达信中找到适合的函数,还请看到高手指点。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多