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)
|
[code:1:f5c7103ea5]
=========================
EMA - (BEMA), dll version
=========================
---8<-------------------------------------
{ [B]reakout-sensitive [E]xp [M]ov [A]vg v.dll
- Plots much faster than PREV-based version.}
{ BEMA based on bars since price breakouts.
Options:
[1] Composite BEMA: (Upper+Lower)/2;
[2] Upper BEMA band based on upside breaks;
Lower BEMA band based on downside breaks;
[3] BEMA shifts to Upper/Lower on crossovers}
{ Forum.dll from http://forum.equis.com
or ASI.dll from http://www.thedml.com
must be in:
...\\MetaStock\\External Function DLLs\\ folder.}
{ ©Copyright 2005 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("BEMA and HHV/LLV lookback periods",
1,2520,21);
plot:=Input("BEMA: [1]Composite, [2]Upper+Lower, [3]Long/Short",1,4,1);
spread:=Input("Upper/Lower BEMA bands shift %",
0,100,2)/200;
x:=Input("Breakouts, use: [1]Close, [2]High/Low",1,2,1);
{ Upside breakouts }
xup:=If(x=1,C,H);
up:=xup=HHV(xup,pds);
{ Downside breakouts }
xdw:=If(x=1,C,L);
dw:=xdw=LLV(xdw,pds);
{ Remove ghost breakout signals }
init:=Cum(IsDefined(up+dw))=1;
bin:=ValueWhen(1,up-dw<>0 OR init,up);
up:=bin AND (Alert(bin=0,2) OR init);
dw:=bin=0 AND (Alert(bin,2) OR init);
NullZone:=Cum(up)>0 AND Cum(dw)<1
OR Cum(up)<1 AND Cum(dw)>0;
{ Periods since breakouts }
upPds:=BarsSince(up OR Cum(1)=pds)+2;
upPds:=If(upPds>pds,pds,upPds);
dwPds:=BarsSince(dw OR Cum(1)=pds)+2;
dwPds:=If(dwPds>pds,pds,dwPds);
{ Upside breakout-based EMA }
{upEma:=ExtFml("Forum.VarMOV",xup,upPds,e);}
upEma:=ExtFml("ASI.EMA",xup,upPds);
upEma:=If(NullZone,Mov(xup,pds,E),upEma);
upEma:=upEma*(1+spread);
{ Downside breakout-based EMA }
{dwEma:=ExtFml("Forum.VarMOV",xdw,dwPds,e);}
dwEma:=ExtFml("ASI.EMA",xdw,dwPds);
dwEma:=If(NullZone,Mov(xdw,pds,E),dwEma);
dwEma:=dwEma*(1-spread);
{ Composite BEMA }
BEMA:=(upEma+dwEma)/2;
LngSht:=If(C>=BEMA,dwEma,upEma);
{ Plot on price chart }
If(plot=1,BEMA,If(plot=2,dwEma,
If(plot=3,LngSht,up)));
If(plot=1,BEMA,If(plot=2,upEma,
If(plot=3,LngSht,-dw)))
---8<-------------------------------------
[/code:1:f5c7103ea5]
jose '-)
|