/* Exponential Moving Average EMA given alpha values */ /* between 0(straight line) and 1(actual line). */ new; cls; let data[50,1]= 60 61 60 62 60 63 64 65 69 70 69 66 64 64 62 64 65 55 53 57 60 58 63 63 63 68 69 69 68 69 70 67 66 67 68 69 69 77 80 80 78 76 76 72 71 70 73 71 78 80 ; data=rev(data); /* original data in reverse order */ t=seqa(1,1,rows(data)); library pgraph; graphset; _pltype=6; _plegctl=1; _plegstr="actual\000EMA(alpha=0.8)\000EMA(alpha=0.5)\000EMA(alpha=0.2)\000EMA(alpha=0.1)"; title("Exponential Moving Average given alpha values"); xy(t,data~fema(data,0.8)~fema(data,0.5)~fema(data,0.2)~fema(data,0.1)); proc fema(x,alpha); local n,m,i; if alpha<0 or alpha>1; errorlog "ERROR: Parameter alpha must be between 0 and 1."; endif; n=rows(x); m=zeros(rows(x),cols(x)); m[1,.]=x[1,.]; i=2; do while i<=rows(x); m[i,.]=alpha*x[i,.]+(1-alpha)*m[i-1,.]; i=i+1; endo; retp(m); endp;