PureBytes Links
Trading Reference Links
|
To List:
Many thanks to those who worked to improve my initial code for Alexander
Elder's "SafeZone Stop".
The version below is a combination of the code John Lynch provided to me
privately for testing (which he has approved for posting to the list) and
some neat additions from Eric Svendesen, which he previously provided to the
list. The array formula below gives identical results to the "LONG" way of
doing it.
Regards,
Barry Silberman
============================================================================
==
{ Barry Silberman's version of Alexander Elder's "SafeZone Stop" from book
"Come Into My Trading Room" page 173
Amended by John Lynch 5/1 for array and
Amended by Eric Svendsen's 5/3 for Coloured Stop and trend variable}
inputs: Price((H+L)/2 ), Length( 22), MULTIPLELONG(1), MULTIPLESHORT(1),
Lookback(15), trend(3), ColourShort(Red), ColourLong(Blue);
variables: MA(0), LONGSUM(0), SHORTSUM(0) , COUNTLONG(0), COUNTSHORT(0),
AVGLOW(0),
AVGHIGH(0), LONGSTOP(0), SHORTSTOP(0), LSTOP(0), SSTOP(0), ii(0);
Arrays: Lday[30](0), Sday[30](0);
{determine trend by slope of EMA}
MA = xaverage( Price, Length );
CONDITION1 = MA > MA[trend];
CONDITION2 = MA < MA[trend];
{SafeZone for Longs}
IF CONDITION1 THEN For ii=1 to Lookback Begin
Lday[ii]=IFF(L[ii]>L[ii-1],L[ii]-L[ii-1],0);
End;
{TOTAL ALL VALUES OF LOWS BEING LOWER THAN PRIOR LOW}
Longsum=0;
For ii=1 to Lookback Begin
LONGSUM =LONGSUM + Lday[ii];
End;
{COUNT NUMBER OF DAYS WITH LOWS BEING LOWER THAN PRIOR LOW}
COUNTLONG = 0;
For ii=1 to Lookback Begin
COUNTLONG = COUNTLONG + IFF(Lday[ii]>0,1,0);
End;
{GET AVERAGE OF LOWS LOWER THAN PRIOR LOW}
IF COUNTLONG <> 0 THEN
AVGLOW = LONGSUM / COUNTLONG;
{CALCULATE STOP AT "X" TIMES AVGLOW}
LSTOP = LOW[1] - (MULTIPLELONG * AVGLOW[1]);
{PREVENT STOP FROM BEING LOWERED}
LONGSTOP = MAXLIST(LSTOP, LSTOP[1], LSTOP[2], LSTOP[3], LSTOP[4], LSTOP[5]);
{SET PLOT}
IF CONDITION1 THEN
PLOT1(LONGSTOP, "STOP", ColourLong);
{SafeZone for SHORTS}
IF CONDITION2 THEN For ii=1 to Lookback Begin
Sday[ii]=IFF(H[ii]<H[ii-1],H[ii-1]-H[ii],0);
End;
{TOTAL ALL VALUES OF HIGHS BEING HIGHER THAN PRIOR HIGH}
Shortsum=0;
For ii=1 to Lookback Begin
SHORTSUM =SHORTSUM + Sday[ii];
End;
{COUNT NUMBER OF DAYS WITH HIGHS BEING HIGHER THAN PRIOR HIGH}
COUNTSHORT = 0;
For ii=1 to Lookback Begin
COUNTSHORT = COUNTSHORT + IFF(Sday[ii]>0,1,0);
End;
{GET AVERAGE OF HIGHS HIGHER THAN PRIOR HIGH}
IF COUNTSHORT <> 0 THEN
AVGHIGH = SHORTSUM / COUNTSHORT;
{CALCULATE STOP AT "X" TIMES AVGHIGH}
SSTOP = HIGH[1] + (MULTIPLESHORT * AVGHIGH[1]);
{PREVENT STOP FROM RISING}
SHORTSTOP = MINLIST(SSTOP, SSTOP[1], SSTOP[2], SSTOP[3], SSTOP[4],
SSTOP[5]);
{SET PLOT}
IF CONDITION2 THEN
PLOT1(SHORTSTOP, "STOP", ColourShort);
Attachment:
Description: "Elder SafeZone Stop.ELD"
|