PureBytes Links
Trading Reference Links
|
To List,
Listed below is my code for implementing Alexander Elder's new "SafeZone
Stop" that he presented in his new book "Come Into My Trading Room". (pages
173-180). In an uptrend, he defines noise as that part of each day's range
that protrudes below the previous day's low, and in a downtrend, he defines
noise as that part of each day's range that protrudes above the previous
day's high. The "SafeZone stop" measures market noise and places stops at a
multiple of noise levels away from the market.
The code works as is for a 15 day lookback, but I'm sure someone could
improve the code to
A) make the "lookback" period a variable
B) reduce the lines of code by using an array or loops.
=========================================================================
{ Barry Silberman's version of Alexander Elder's "SafeZone Stop" from book
"Come Into My Trading Room" page 173}
inputs:
Price((H+L)/2 ), Length( 22), MULTIPLELONG(1), MULTIPLESHORT(1);
variables:
MA(0), Lday1(0), Lday2(0), Lday3(0), Lday4(0), Lday5(0), Lday6(0),
Lday7(0), Lday8(0), Lday9(0), Lday10(0),
Lday11(0), Lday12(0), Lday13(0), Lday14(0), Lday15(0), Sday1(0), Sday2(0),
Sday3(0), Sday4(0), Sday5(0),
Sday6(0), Sday7(0), Sday8(0), Sday9(0), Sday10(0), Sday11(0), Sday12(0),
Sday13(0), Sday14(0), Sday15(0),
LONGSUM(0), SHORTSUM(0) , COUNTLONG(0), COUNTSHORT(0), AVGLOW(0),
AVGHIGH(0), LONGSTOP(0), SHORTSTOP(0),
LSTOP(0), SSTOP(0);
{determine trend by slope of EMA}
MA = xaverage( Price, Length );
CONDITION1 = MA > MA[3];
CONDITION2 = MA < MA[3];
{SafeZone for Longs}
IF CONDITION1 THEN BEGIN
LDAY1 = IFF(L[1]>L, L[1] - L, 0);
LDAY2 = IFF(L[2]>L[1], L[2] - L[1], 0);
LDAY3 = IFF(L[3]>L[2], L[3] - L[2], 0);
LDAY4 = IFF(L[4]>L[3], L[4] - L[3], 0);
LDAY5 = IFF(L[5]>L[4], L[5] - L[4], 0);
LDAY6 = IFF(L[6]>L[5], L[6] - L[5], 0);
LDAY7 = IFF(L[7]>L[6], L[7] - L[6], 0);
LDAY8 = IFF(L[8]>L[7], L[8] - L[7], 0);
LDAY9 = IFF(L[9]>L[8], L[9] - L[8], 0);
LDAY10 = IFF(L[10]>L[9], L[10] - L[9], 0);
LDAY11 = IFF(L[11]>L[10], L[11] - L[10], 0);
LDAY12 = IFF(L[12]>L[11], L[12] - L[11], 0);
LDAY13 = IFF(L[13]>L[12], L[13] - L[12], 0);
LDAY14 = IFF(L[14]>L[13], L[14] - L[13], 0);
LDAY15 = IFF(L[15]>L[14], L[15] - L[14], 0);
End;
{TOTAL ALL VALUES OF LOWS BEING LOWER THAN PRIOR LOW}
LONGSUM = LDAY1 + LDAY2 + LDAY3 + LDAY4 + LDAY5 + LDAY6 + LDAY7 + LDAY8 +
LDAY9 + LDAY10 +
LDAY11 + LDAY12 + LDAY13 + LDAY14 + LDAY15;
{COUNT NUMBER OF DAYS WITH LOWS BEING LOWER THAN PRIOR LOW}
COUNTLONG = 0;
IF LDAY1 > 0 THEN COUNTLONG = COUNTLONG + 1;
IF LDAY2 > 0 THEN COUNTLONG = COUNTLONG + 1;
IF LDAY3 > 0 THEN COUNTLONG = COUNTLONG + 1;
IF LDAY4 > 0 THEN COUNTLONG = COUNTLONG + 1;
IF LDAY5 > 0 THEN COUNTLONG = COUNTLONG + 1;
IF LDAY6 > 0 THEN COUNTLONG = COUNTLONG + 1;
IF LDAY7 > 0 THEN COUNTLONG = COUNTLONG + 1;
IF LDAY8 > 0 THEN COUNTLONG = COUNTLONG + 1;
IF LDAY9 > 0 THEN COUNTLONG = COUNTLONG + 1;
IF LDAY10 > 0 THEN COUNTLONG = COUNTLONG + 1;
IF LDAY11 > 0 THEN COUNTLONG = COUNTLONG + 1;
IF LDAY12 > 0 THEN COUNTLONG = COUNTLONG + 1;
IF LDAY13 > 0 THEN COUNTLONG = COUNTLONG + 1;
IF LDAY14 > 0 THEN COUNTLONG = COUNTLONG + 1;
IF LDAY15 > 0 THEN COUNTLONG = COUNTLONG + 1;
{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");
{SafeZone for SHORTS}
IF CONDITION2 THEN BEGIN
SDAY1 = IFF(H[1]<H, H - H[1], 0);
SDAY2 = IFF(H[2]<H[1], H[1] - H[2], 0);
SDAY3 = IFF(H[3]<H[2], H[2] - H[3], 0);
SDAY4 = IFF(H[4]<H[3], H[3] - H[4], 0);
SDAY5 = IFF(H[5]<H[4], H[4] - H[5], 0);
SDAY6 = IFF(H[6]<H[5], H[5] - H[6], 0);
SDAY7 = IFF(H[7]<H[6], H[6] - H[7], 0);
SDAY8 = IFF(H[8]<H[7], H[7] - H[8], 0);
SDAY9 = IFF(H[9]<H[8], H[8] - H[9], 0);
SDAY10 = IFF(H[10]<H[9], H[9] - H[10], 0);
SDAY11 = IFF(H[11]<H[10], H[10] - H[11], 0);
SDAY12 = IFF(H[12]<H[11], H[11] - H[12], 0);
SDAY13 = IFF(H[13]<H[12], H[12] - H[13], 0);
SDAY14 = IFF(H[14]<H[13], H[13] - H[14], 0);
SDAY15 = IFF(H[15]<H[14], H[14] - H[15], 0);
End;
{TOTAL ALL VALUES OF HIGHS BEING HIGHER THAN PRIOR HIGH}
SHORTSUM = SDAY1 + SDAY2 + SDAY3 + SDAY4 + SDAY5 + SDAY6 + SDAY7 + SDAY8 +
SDAY9 + SDAY10 +
SDAY11 + SDAY12 + SDAY13 + SDAY14 + SDAY15;
{COUNT NUMBER OF DAYS WITH HIGHS BEING HIGHER THAN PRIOR HIGH}
COUNTSHORT = 0;
IF SDAY1 > 0 THEN COUNTSHORT = COUNTSHORT + 1;
IF SDAY2 > 0 THEN COUNTSHORT = COUNTSHORT + 1;
IF SDAY3 > 0 THEN COUNTSHORT = COUNTSHORT + 1;
IF SDAY4 > 0 THEN COUNTSHORT = COUNTSHORT + 1;
IF SDAY5 > 0 THEN COUNTSHORT = COUNTSHORT + 1;
IF SDAY6 > 0 THEN COUNTSHORT = COUNTSHORT + 1;
IF SDAY7 > 0 THEN COUNTSHORT = COUNTSHORT + 1;
IF SDAY8 > 0 THEN COUNTSHORT = COUNTSHORT + 1;
IF SDAY9 > 0 THEN COUNTSHORT = COUNTSHORT + 1;
IF SDAY10 > 0 THEN COUNTSHORT = COUNTSHORT + 1;
IF SDAY11 > 0 THEN COUNTSHORT = COUNTSHORT + 1;
IF SDAY12 > 0 THEN COUNTSHORT = COUNTSHORT + 1;
IF SDAY13 > 0 THEN COUNTSHORT = COUNTSHORT + 1;
IF SDAY14 > 0 THEN COUNTSHORT = COUNTSHORT + 1;
IF SDAY15 > 0 THEN COUNTSHORT = COUNTSHORT + 1;
{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");
Attachment:
Description: "ELDER SAFEZONE STOP.ELD"
|