Rank: Advanced Member
Groups: Registered, Registered Users, Subscribers Joined: 7/25/2005(UTC) Posts: 1,042
Was thanked: 57 time(s) in 54 post(s)
|
H Tsen
After making my previous post I realized that I had already pulled all the ideas together to do what you want. The following Multi-Frame formula plots EMA weekly through 1, 2, 3, 4, 6 and 12 mothly periodicities. The Forum DLL is used to remove unwanted N/A results and calculate the selected higher periodicity EMA values. Price options include Open, High, Low, Close, Mean Price, Typical Price and Weighted Close. A quick check shows that it is accurate to at least 2 decimal places on 109 years of DJIA daily data and that on weekly data it starts with the same value as the EMA Mov() function. However, there's still a possibility that the initially seeding might fail, so beware.
The commercial version of this formula uses a different DLL for calculating the EMA and is accurate to at least 4 decimal places. That DLL can also be used to accurately reproduce the likes of Kaufman's AMA for higher periodicities, something that the Forum DLL can't quite manage.
Roy
{Multi-Frame D EMA Special} {Exponential Moving Average} {Requires Equis Forum DLL} {Roy Larsen, 2009, 28/12/09}
{User settings} N:=Input("Multi-Frame D EMA, Periods",1,99,5); J:=Input("Months per Frame, 0=Weekly",0,12,0); J:=If(J<5 OR Mod(J,3)=0 AND (J<>9),Int(J),-1); U:=Input("Price, 1=O 2=H 3=L 4=C 5=MP 6=WC 7=Typical",1,7,4); G:=Input("End-of-week Offset in Days",0,6,0); Q:=Input("Mode, 0=Static 1=Dynamic 2=Delayed",0,2,1); {Update on last bar, new bar or new frame}
{Timing signals} {Day counter by metastocktools.com} D:=DayOfWeek();M:=Month();Y:=Year(); Z:=Cum(1);F:=Rnd(Life(291231)); M:=If(J=0,ValueWhen(1,Z=1,F+D-G-1)-F, (Y-ValueWhen(1,Z=1,Y))*12+M); I:=If(J=0,Int(M/7),Int((M-1)/Max(1,J))); I:=I>ValueWhen(2,1,I); G:=LastValue(J<0 OR Lowest(Sum(I>0,5))=5); I:=ExtFml("Forum.Sum",I,1);M:=G+I; F:=ExtFml("Forum.Sum",Ref(I,1),1)*(M=0)*(Z>1)+G; B:=LastValue(Z);A:=B-1=Z;B:=B=Z; F:=F+B*(Q=0)*(J=0)*(D=5); J:=If(F,1,(Alert(F,2)=0)*M*2*(Z>1)); J:=If(A+LastValue(J)>2 OR B+(Q=1)=2,1,J); J:=If(G,1,If(Q=2,M*2,J));
{Frame prices} Q:=ValueWhen(1,M+(Z=1),O); B:=HighestSince(1,M+(Z=1),H); Y:=LowestSince(1,M+(Z=1),L); Q:=ValueWhen(1,J,If(J=1,Q,ValueWhen(2-G,1,Q))); {O} B:=ValueWhen(1,J,If(J=1,B,ValueWhen(2-G,1,B))); {H} Y:=ValueWhen(1,J,If(J=1,Y,ValueWhen(2-G,1,Y))); {L} K:=ValueWhen(1,J,If(J=1,C,ValueWhen(2-G,1,C))); {C} A:=(B+Y)/2; D:=(B+Y+2*K)/4; I:=(B+Y+K)/3; K:=If(U=1,Q,If(U=2,B,If(U=3,Y,If(U=5,A,If(U=6,D,If(U=7,I,K))))));
{EMA} I:=Cum(J>0); R:=If(J,N,Pwr(10,10)); ValueWhen(1,I>=N,ExtFml("Forum.Mov",K,R,E));
|