Rank: Advanced Member
Groups: Registered, Registered Users Joined: 1/19/2005(UTC) Posts: 1,065 Location: Koh Pha-Ngan, Earth
Was thanked: 2 time(s) in 2 post(s)
|
This MetaStock utility indicator converts chart bar periods to calendar Days/Weeks and vice versa.
Useful for creating indicators such as Moving Averages based on calendar periods, rather than using (default) bar periods.
MetaStock -> Tools -> Indicator Builder -> New -> Copy and paste formula below.
[code:1:ffe8ba0c7b] ============================= Calendar days <-> bar periods ============================= ---8<---------------------------------------
{ Bars <--> Calendar Week/Day, period converter.
Incorporating Gregorian calendar Week/Day counter v3.0 - period count is independent of any missing chart data.
©Copyright 2002~2006 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("Conversion Periods",1,2520,21); choose:=Input("[1]Bars -> CalendarPeriods, [2]CalPds -> Bars",1,2,1); use:=Input("Calendar Periods: [1]Days, [2]Weeks",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);
{ Choose Days/Weeks } Cal:=If(use=1,DayNr,WkCount);
{ Bars -> Calendar Days/Weeks, average } calendar:=Cal-Ref(Cal,-pds); avgCal:=Cum(calendar)/Cum(IsDefined(calendar));
{ Calendar Days/Weeks -> Bars } bars:=pds /((Cal-ValueWhen(1,Cum(1)=1,Cal)+1)/Cum(1));
{ Choose Bars->CalPds or CalPds->Bars } convert:=If(choose=1,calendar,bars); avg:=Int(If(choose=1,avgCal,bars)*10+.5)/10;
{ Plot in own window } Int(convert*10+.5)/10;avg
---8<---------------------------------------
[/code:1:ffe8ba0c7b]
jose '-)
|