/* Volume-Weighted Moving Average VWMA(k) */ /* Notice: using volume data in addition */ new; cls; let data[50,2]= 60 10240000 61 3041000 60 3767000 62 4427000 60 3074000 63 4258000 64 2792000 65 7381000 69 5372000 70 6280000 69 6598000 66 7093000 64 6888000 64 4799000 62 11264000 64 9145000 65 16051000 55 42481000 53 17632000 57 7251000 60 12095000 58 10858000 63 3996000 63 5487000 63 7433000 68 1980000 69 2095000 69 3887000 68 3736000 69 4134000 70 8882000 67 6457000 66 8963000 67 5253000 68 4058000 69 5248000 69 13687000 77 4240000 80 5133000 80 4798000 78 3859000 76 3952000 76 6222000 72 5364000 71 12111000 70 8230000 73 9126000 71 9371000 78 10351000 80 10236000 ; data=rev(data); /* original data in reverse order */ vols=data[.,2]; data=data[.,1]; t=seqa(1,1,rows(data)); library pgraph; graphset; pqgwin auto; title("Volume"); xy(t,vols); _pltype=6; _plegctl=1; _plegstr="actual\000VWMA(5)\000VWMA(10)"; title("Volume-Weighted Moving Average"); xy(t,data~vwma(data,vols,5)~vwma(data,vols,10)); proc vwma(x,vols,k); local w,m,i,j; m=zeros(rows(x),cols(x)); j=1; do while j<=cols(x); i=k; do while i<=rows(x); w=vols[i-k+1:i,j]; w=w/sumc(w); m[i,j]=w'x[i-k+1:i,j]; i=i+1; endo; j=j+1; endo; m[1:k-1,.]=miss(m[1:k-1,.],0); retp(m); endp;