/* Variable Index Dynamic Average(VIDYA) by CMO as volatility index */ 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\000VIDYA(5)\000VIDYA(10)"; title("VIDYA"); xy(t,data~vidya(data,5)~vidya(data,10)); proc vidya(x,k); local alpha,diff,ups,downs,kk,cmo,m,i; alpha=2/(k+1); /* CMO as volatility index */ diff=zeros(1,cols(x))|(x[2:rows(x),.]-x[1:rows(x)-1,.]); ups=zeros(rows(x),cols(x)); downs=zeros(rows(x),cols(x)); i=k+1; do while i<=rows(x); ups[i,.]=sumc(diff[i-k+1:i,.].*(diff[i-k+1:i,.].>=0))'; downs[i,.]=sumc(-diff[i-k+1:i,.].*(diff[i-k+1:i,.].<0))'; i=i+1; endo; cmo=(ups-downs)./(ups+downs); /* modified EMA by abs(CMO) */ m=zeros(rows(x),cols(x)); m[1,.]=x[1,.]; i=2; do while i<=k; m[i,.]=alpha*x[i,.]+(1-alpha)*m[i-1,.]; i=i+1; endo; i=k+1; do while i<=rows(x); m[i,.]=alpha.*abs(cmo[i,.]).*x[i,.]+(1-alpha.*abs(cmo[i,.])).*m[i-1,.]; i=i+1; endo; retp(m); endp;