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)
|
As mentioned above, this version of the PEMA plots much faster, thanks to the use of variable-period DLLs which circumvent the very slow PREV functions.
[code:1:ef3bb517da] MetaStock -> Tools -> Indicator Builder -> New -> Copy and paste complete formulae between "---8<---" lines.
========================== EMA - pivotal, dll version ========================== ---8<------------------------------------
{ Pivotal Exponential Moving Average v.dll - Plots much faster than PREV-based version.}
{ PEMA based on trough/peak support/resistance. Options: [1] Composite EMA: (Upper+Lower)/2; [2] Upper EMA band based on peaks; Lower EMA band based on troughs; [3] EMA 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 2004~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("EMA periods",1,2520,21)/2; plot:=Input("EMA: [1]Composite, [2]Upper+Lower, [3]Long/Short",1,3,1); spread:=Input("Upper/Lower EMA bands shift %", 0,100,2)/200; x:=Input("use: [1]Close, [2]High/Low",1,2,1);
{ Peak/Troughs } xpk:=If(x=1,C,H); pk:=xpk<Ref(xpk,-1) AND Ref(xpk,-1)>Ref(xpk,-2); pkVal:=ValueWhen(1,pk,Ref(xpk,-1)); xtr:=If(x=1,C,L); tr:=xtr>Ref(xtr,-1) AND Ref(xtr,-1)<Ref(xtr,-2); trVal:=ValueWhen(1,tr,Ref(xtr,-1));
{ Peak-based EMA } pkpds:=If(pds>Cum(pk),Cum(pk),pds); pkpds:=If(pkpds<1,1,pkpds); {pkEma:=ExtFml("Forum.VarMOV",pkVal,pds,e);} pkEma:=ExtFml("ASI.EMA",pkVal,pds); pkEma:=pkEma*(1+spread);
{ Trough-based EMA } trpds:=If(pds>Cum(tr),Cum(tr),pds); trpds:=If(trpds<1,1,trpds); {trEma:=ExtFml("Forum.VarMOV",trVal,pds,e);} trEma:=ExtFml("ASI.EMA",trVal,pds); trEma:=trEma*(1-spread);
{ Composite EMA } Ema:=(pkEma+trEma)/2; LngShtEma:=If(C>=Ema,trEma,pkEma);
{ Plot on price chart } If(plot=1,Ema,If(plot=2,trEma,LngShtEma)); If(plot=1,Ema,If(plot=2,pkEma,LngShtEma))
---8<------------------------------------
[/code:1:ef3bb517da]
jose '-)
|