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 '-)
|