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

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

举例来说,在次新股300238冠昊生物中,打开周K线图,大智慧默认指标DMI-QL,2011年9月23日该指标四个主要参数:PDI为14.272

MDI为9.906 ADX为40.297

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

14.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 AND

HD>LD,HD,0),N,1);

DMM:= SMA(IF(LD>0 AND

LD>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 AND

HD>LD,HD,0),N,1);

DMM:= SMA(IF(LD>0 AND

LD>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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值