| 
Rank: Advanced Member
 Groups: Registered, Registered Users, SubscribersJoined: 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));
 |