MetaStock -> Tools -> Indicator Builder -> New -> copy & paste all formulae below. =================== Weekly EMA of Close =================== ---8<--------------------------------------- { True weekly Close Exponential Mov Avg v6.0 For daily/intraday charts. Requires either "Week's true start & end" or "Week's true start & end(2)" indicators. ©Copyright 2002~2007 Jose Silva. The grant of this license is for personal use only - no resale or repackaging allowed. All code remains the property of Jose Silva. http://www.metastocktools.com } { User inputs } pds:=Input("Weekly EMA periods",1,520,4); shift:=1+Input("EMA vertical shift %", -100,100,0)/100; EOW:=Input("Final week's end: [1]True, [2]Current (dynamic)",1,2,2); plot:=Input("plot: [1] EMA, [2] Crossover signals",1,2,1); { Choice of Static/Dynamic last EOW signal } EOW:=If(EOW=2,Cum(1)=LastValue(Cum(1)), Cum(1)=LastValue(Cum(1)) AND DayOfWeek()=5); { Reference EOW signals } WkEnd:=EOW OR FmlVar("Week's true Start & End","WEEKEND"); { Week's Close } WkCl:=ValueWhen(1,WkEnd,C); WkCl:=ValueWhen(1,WkCl<>0,WkCl); { Reduce periodicity if insufficient periods } pds:=If(pds>Cum(WkEnd),Cum(WkEnd),pds); { Weekly EMA } factor:=2/(pds+1); WkEma:=PREV*If(WkEnd,1-factor,1) +If(WkEnd,WkCl*factor,0); { Vertical shift } WkEma:=WkEma*shift; { Crossover signals } signals:=Cross(C,WkEma)-Cross(WkEma,C); { Plot on price chart } If(plot=2,signals,WkEma) ---8<--------------------------------------- =================== Weekly SMA of Close =================== ---8<--------------------------------------- { True weekly Close Simple Moving Average v5.1 For daily/intraday charts. Requires either "Week's true start & end" or "Week's true start & end(2)" indicators. ©Copyright 2002~2007 Jose Silva. The grant of this license is for personal use only - no resale or repackaging allowed. All code remains the property of Jose Silva. http://www.metastocktools.com } { User inputs } pds:=Input("Weekly SMA periods",1,520,4); shift:=1+Input("SMA vertical shift %", -100,100,0)/100; EOW:=Input("Final week's end: [1]True, [2]Current (dynamic)",1,2,2); plot:=Input("plot: [1] SMA, [2] Crossover signals",1,2,1); { Choice of Static/Dynamic last EOW signal } EOW:=If(EOW=2,Cum(1)=LastValue(Cum(1)), Cum(1)=LastValue(Cum(1)) AND DayOfWeek()=5); { Reference EOW signals } WkEnd:=EOW OR FmlVar("Week's true Start & End","WEEKEND"); { Week's Close } WkCl:=ValueWhen(1,WkEnd,C); WkCl:=ValueWhen(1,WkCl<>0,WkCl); { Weekly SMA } z:=Cum(WkEnd*WkCl); WkSma:=(z-ValueWhen(pds+1,WkEnd,z))/pds; { Vertical shift } WkSma:=WkSma*shift; { Crossover signals } signals:=Cross(C,WkSma)-Cross(WkSma,C); { Plot on price chart } If(plot=2,signals,WkSma) ---8<--------------------------------------- ======================= Week's true Start & End ======================= ---8<--------------------------------------- { Week's true start & end of week (EOW) v3.0 Confirms EOW signal at start of following week, and signals EOW in retrospect. For daily & intraday charts. ©Copyright 2002~2007 Jose Silva. The grant of this license is for personal use only - no resale or repackaging allowed. All code remains the property of Jose Silva. http://www.metastocktools.com } { User inputs } EOW:=Input("Final week's end: [1]True, [2]Current (dynamic)",1,2,1); adj:=Input("Week's start: [0]Sunday, [1]Monday",0,1,1); { Calendar counter engine } leap:=Frac(Year()/4)=0 AND Frac(Year()/100)<>0 OR Frac(Year()/400)=0; y:=Year()*365+Int(Year()/4) -Int(Year()/100)+Int(Year()/400)-730484; m:= If(Month()=2,31-leap, If(Month()=3,59, If(Month()=4,90, If(Month()=5,120, If(Month()=6,151, If(Month()=7,181, If(Month()=8,212, If(Month()=9,243, If(Month()=10,273, If(Month()=11,304, If(Month()=12,334, -leap))))))))))); DayNr:=y+m+DayOfMonth(); adj:=adj+If(DayNr<1,1,2) -(Frac(Year()/100)=0 AND Frac(Year()/400)<>0); WkCount:=Int((DayNr-adj)/7)+(Year()>=2000); { Week's start signal } WeekStart:=WkCount>Ref(WkCount,-1); { Week's end signal } { Choice of Static/Dynamic last EOW signal } EOW:=If(EOW=2,Cum(1)=LastValue(Cum(1)), Cum(1)=LastValue(Cum(1)) AND DayOfWeek()=5); { Detect other than daily/intraday charts } detect:=LastValue(Cum( WkCount=ValueWhen(2,1,WkCount)))=0; { Make EOW signal visible for weekly+ charts } WeekEnd:=PeakBars(1,-(If(detect=0, WeekStart OR Cum(IsDefined(WeekStart))=1, Cum(1)/2=Int(Cum(1)/2))),1)=0 OR EOW; WeekEnd:=If(detect=0,WeekEnd,1); { Plot signals in own window } WeekStart;-WeekEnd ---8<--------------------------------------- ========================= Week's true Start & End(2) ========================= ---8<--------------------------------------- { Week's true start & end of week (EOW) vPREVx2 Confirms EOW signal at start of following week, and signals EOW in retrospect. Signals independent of any missing chart data. For use with highly irregular & sporadic (frequent missing data) daily & intraday charts. Use v3.0 signals for normal charts. ©Copyright 2002~2007 Jose Silva. The grant of this license is for personal use only - no resale or repackaging allowed. All code remains the property of Jose Silva. http://www.metastocktools.com } { User inputs } EOW:=Input("Final week's end: [1]True, [2]Current (dynamic)",1,2,1); adj:=Input("Week's start: [0]Sunday, [1]Monday",0,1,1); { Calendar counter engine } leap:=Frac(Year()/4)=0 AND Frac(Year()/100)<>0 OR Frac(Year()/400)=0; y:=Year()*365+Int(Year()/4) -Int(Year()/100)+Int(Year()/400)-730484; m:= If(Month()=2,31-leap, If(Month()=3,59, If(Month()=4,90, If(Month()=5,120, If(Month()=6,151, If(Month()=7,181, If(Month()=8,212, If(Month()=9,243, If(Month()=10,273, If(Month()=11,304, If(Month()=12,334, -leap))))))))))); DayNr:=y+m+DayOfMonth(); adj:=adj+If(DayNr<1,1,2) -(Frac(Year()/100)=0 AND Frac(Year()/400)<>0); WkCount:=Int((DayNr-adj)/7)+(Year()>=2000); { Week's start signal } WeekStart:=WkCount>Ref(WkCount,-1); { Choice of Static/Dynamic last EOW signal } EOW:=If(EOW=2,Cum(1)=LastValue(Cum(1)), Cum(1)=LastValue(Cum(1)) AND DayOfWeek()=5); { Week's end signal } WeekEnd:=LastValue(Ref(WeekStart,1)+PREV-PREV) OR EOW; { Plot signals in own window } WeekStart;-WeekEnd ---8<--------------------------------------- ====================== SMA - variable Nth bar ====================== ---8<---------------------------------------- { Variable Nth bar Simple Moving Average v1.0 ©Copyright 2007 Jose Silva. The grant of this license is for personal use only - no resale or repackaging allowed. http://www.metastocktools.com } { User inputs } pds1:=Input("Average Close in every Nth bar",1,260,5); pds2:=Input("SMA periods",1,520,4); shift:=1+Input("SMA vertical shift %", -100,100,0)/100; plot:=Input("[1]SMA, [2]Nth bar, [3]Crossover signals",1,3,1); { Nth bar signals } NthBar:=Mod(Cum(1),pds1)=0; { Nth bar's Close } NthCl:=ValueWhen(1,NthBar,C); NthCl:=ValueWhen(1,NthCl<>0,NthCl); { Nth-bar SMA } z:=Cum(NthBar*NthCl); NthSma:=(z-ValueWhen(pds2+1,NthBar,z))/pds2; { Vertical shift } NthSma:=NthSma*shift; { Crossover signals } signals:=Cross(C,NthSma)-Cross(NthSma,C); { Plot SMA on price chart } If(plot=1,NthSma,If(plot=2,NthBar,signals)) ---8<---------------------------------------- http://www.metastocktools.com