CYC是表示取第周期的值, N是EMA函数里的N
Function EMA3(Formula,CYC,N)
Set History=Formula.ParentGrid.GetHistoryData()
Y=History.Close(0)
For i=1 To CYC
Y=(2*History.Close(i)+(N-1)*Y)/(N+1)
Next
Ema3=Y
End Function
如果创建一个自定义函数EMA2
Function EMA2(Formula,N)
EMA2 = EMA3(formula,formula.indexdata,n)
End Function
公式里这些调用测试
aa:ema(close,30);
bb:ema2(30);
与系统EMA结果完全一致
计算:有一组数据(收盘价为):1,2,3,4,5,6,7,求其EMA(c,5)
解答:对应上面数据,X1,X2,X3,X4,X5分别对应3、4、5、6、7
则EMA(c,5)=5/15*X5+4/15*X4+3/15*X3+2/15*X2+1/15*X1=(5*X5+4*X4+3*X3+2*X2+1*X1)/15
=5.67
而,MA(c,5)=(3+4+5+6+7)/5=5
理解公式算法-EMA与MA(理解了公式算法,才能更好的应用公式)
MA和EMA的数学表达式:
1、MA(X,N),求X的N日移动平均值。算法是:
(X1+X2+X3+…..+Xn)/N
例如:MA(C,20)表示20日的平均收盘价。C表示CLOSE。
2、EMA(X,N)求X的N日指数平滑移动平均。算法是:
若Y=EMA(X,N),则Y=[2*X+(N-1)*Y’]/(N+1),其中Y’表示上一周期的Y值。
EMA引用函数在计算机上使用递归算法很容易实现,但不容易理解。例举分析说明EMA函数。
X是变量,每天的X值都不同,从远到近地标记,它们分别记为X1,X2,X3,….,Xn
如果N=1,则EMA(X,1)=[2*X1+(1-1)*Y’]/(1+1)=X1
如果N=2,则EMA(X,2)=[2*X2+(2-1)*Y’]/(2+1)=(2/3)*X2+(1/3)X1
如果N=3,则EMA(X,3)=[2*X3+(3-1)*Y’]/(3+1)=[2*X3+2*((2/3)*X2+(1/3)*X1)]/4=(1/2)*X3+(1/3)*X2+(1/6)*X1=3/6*X3+2/6*X2+1/6*X1
如果N=4,则EMA(X,4)=[2*X4+(4-1)*Y’]/(4+1)=2/5*X4+3/5*((1/2)*X3+(1/3)*X2+(1/6)*X1)=4/10*X4+3/10*X3+2/10*X2+1/10*X1
=2/5*X4+3/10*X3+3/15*X2+3/30*X1
如果N=5,则EMA(X,5)=2/(5+1)*X5+(5-1)/(5+1)(2/5*X4+3/10*X3+3/15*X2+3/30*X1)
=(1/3)*X5+(4/15)*X4+(3/15)*X3+(2/15)*X2+(1/15)*X1=5/15*X5+4/15*X4+3/15*X3+2/15*X2+1/15*X1
…………循环下去吧:)
EMA(X,6)=6/21*X6+5/21*X5+4/21*X4+3/21*X3+2/21*1/21X1
注意到上面我标记的颜色部分,应该发现一个规律:即任何时候系数之和恒为1(如果X是常量,每天的X值都不变,则EMA(X,N)=MA(X,N).),但系数该如何确定呢?这个你还是自己观察一下吧(提示,系数的分母是各个系数分子之和,而系数的个数就是EMA(X,N)中的N,还有一个需要注意的就是系数的分子和系数后参数的下标是一致的)