There are two Wolfe Wave TS code from this thread: http://www.amibrokerfan.com/forum/in...ic=405.msg2890
The code listing is more manageable if one uses the '#' icon in the full reply message composer.
This code verifies //Tradestation: Wolfe Wave 2
//http://www.purebytes.com/archives/amibroker/2001/msg04494.html
Inputs:
TICKCHG(10),PCTCHG(.2),OCCUR(1),PLOTBARS(40),ETALINE(TRUE),ZIGZAG (TRUE);
Array: PBAR[50](0), P[50](0);
VARS: X(0),PP(1), JA_SLOPE1(0), JLA_CTR(0),
JLA_LINE(0), JAIRHBAR(0),JAIRLBAR(0), LOWSEEK(FALSE),
W(0), JA_SLOPE2(0), JA_SLOPE3(0), JLA_PT1(0),
JLA_IRH(0), JLA_IRL(99999), WOLFE(0);
IF CURRENTBAR =1 THEN P[50] = C;
IF LOWSEEK = FALSE AND P[50] <= H THEN
BEGIN
P[50] = H;
PBAR[50] = 0;
END;
IF LOWSEEK = TRUE AND P[50] >= L THEN
BEGIN
P[50] = L;
PBAR[50] = 0;
END;
IF (LOWSEEK = FALSE AND PBAR[50] <> 0) THEN
BEGIN
IF (TICKCHG = 0
and L < P[50]*(1-PCTCHG/100))
OR (TICKCHG <> 0
AND L < (P[50] - TICKCHG* MINMOVE POINTS)) THEN
BEGIN
IF ZIGZAG = TRUE THEN
PLOT4[PBAR[50]](P[50],"SWINGS");
LOWSEEK = TRUE;
FOR W = 1 TO 49
BEGIN
PBAR[W] = PBAR[W+1];
P[W] = P[W+1];
END;
P[50] = L;
PBAR[50] = 0;
END;
END;
IF (LOWSEEK = TRUE AND PBAR[50] <> 0) THEN
BEGIN
IF (TICKCHG = 0
and H > P[50]*(1+PCTCHG/100))
OR (TICKCHG <> 0
AND H > (P[50] + TICKCHG* MINMOVE POINTS)) THEN
BEGIN
IF ZIGZAG = TRUE THEN
PLOT4[PBAR[50]](P[50],"SWINGS");
LOWSEEK = FALSE;
FOR W = 1 TO 49
BEGIN
PBAR[W] = PBAR[W+1];
P[W] = P[W+1];
END;
P[50] = H;
PBAR[50] = 0;
END;
END;
IF TIME = LASTCALCTIME
AND DATE = LASTCALCDATE
AND P[48 - PP] <> 0 THEN
BEGIN
PP =-1;
WOLFE = 0;
WHILE WOLFE < OCCUR AND PP < 46
BEGIN
PP = PP+1;
VALUE1 = P[47-PP];
VALUE2 = P[48-PP];
VALUE3 = P[49-PP];
VALUE4 = P[50-PP];
CONDITION1 =
VALUE2 > VALUE1
AND VALUE4 > VALUE3
AND VALUE4 < VALUE2
AND VALUE3 < VALUE1
AND VALUE4 > VALUE1;
CONDITION2 =
VALUE2 < VALUE1
AND VALUE4 < VALUE3
AND VALUE4 > VALUE2
AND VALUE3 > VALUE1
AND VALUE4 < VALUE1;
IF CONDITION1 OR CONDITION2 THEN WOLFE = WOLFE +1;
END;
JA_SLOPE1 = (P[49-PP] - P[47-PP]) / (PBAR[47-PP] -
PBAR[49-PP]);
JA_SLOPE2 = (P[50-PP] - P[47-PP]) / (PBAR[47-PP] -
PBAR[50-PP]);
{LINE 1 - 3}
VALUE90=
TL_New(DATE[PBAR[47-PP]],TIME[PBAR[47-PP]],P[47-PP],DATE[PBAR[49-
PP]],TIME[PBAR[49-PP]],P[49-PP]);
Value14 = TL_SetColor(VALUE90,5);
{VALUE93 = TL_SetExtRight(VALUE90,TRUE);}
Value94 =
TL_SETEND(VALUE90,DATE[PBAR[49-PP]-PLOTBARS],TIME[PBAR[49-PP]-
PLOTBARS],TL_GETVALUE(VALUE90,DATE[PBAR[49-PP]-PLOTBARS],TIME[PBAR[49-
PP]-PLOTBARS]));
{LINE 1 - 4}
VALUE91=
TL_NEW(DATE[PBAR[47-PP]],TIME[PBAR[47-PP]],P[47-PP],
DATE[PBAR[50-PP]],TIME[PBAR[50-PP]],P[50-PP]);
Value14 = TL_SetColor(VALUE91,16);
{VALUE93 = TL_SetExtRight(VALUE90,TRUE);}
TL_SETEND(VALUE91,DATE[PBAR[49-PP]-PLOTBARS],TIME[PBAR[49-PP]-
PLOTBARS],TL_GETVALUE(VALUE91,DATE[PBAR[49-PP]-PLOTBARS],TIME[PBAR[49-
PP]-PLOTBARS]));
{ETA LINE}
IF ETALINE THEN
BEGIN
VALUE92=
TL_New(DATE[PBAR[48-PP]],TIME[PBAR[48-PP]],P[48-PP],
DATE[PBAR[50-PP]],TIME[PBAR[50-PP]],P[50-PP]);
Value14 = TL_SetColor(VALUE92,4);
TL_SETEND(VALUE92,DATE[PBAR[50-PP]-PLOTBARS],TIME[PBAR[50-PP]-
PLOTBARS],TL_GETVALUE(VALUE92,DATE[PBAR[50-PP]-PLOTBARS],TIME[PBAR[50-
PP]-PLOTBARS]));
END;
END;
IF DATE = LASTCALCDATE
AND TIME = LASTCALCTIME
AND ZIGZAG = TRUE THEN
BEGIN
JA_SLOPE3 = (P[50-PP] - P[49-PP]) / (PBAR[49-PP] -
PBAR[50-PP]);
FOR JLA_CTR = PBAR[49] DOWNTO PBAR[50]
BEGIN
PLOT4[JLA_CTR](P[49]+(PBAR[49]-JLA_CTR) *
JA_SLOPE3,"SWINGS");
END;
END;
FOR W = 1 TO 50
BEGIN
PBAR[W] = PBAR[W]+1;
END;
| This one requires two functions:
BarsToDate_Time & Swing_Lee_Simple
Swing_Lee_Simple can probably be substituted with Swing_Lee //Tradestation: Wolfe Wave 1
//http://finance.groups.yahoo.com/group/amibroker/message/112236
Inputs: NBars(13), {Number of bars for Swing_Lee pivot picking }
MaxBars(250); {Maximum number of bars forward to search for }
{Match/Crossing of ETA lines to set end EPA }
{If this is set to a very high number, the time}
{to compute and plot will become excessive. }
Vars: TPCount(0),Direct(0),
HoldPrice(0),BarsBk(0),
Slope1(0),Slope2(0),
ETA1(0),ETA2(0),EPA(0),
NewDate(0),NewTime(0);
Arrays: TPDate[4](0),TPTime[4](0),TPBar[4](0),TPPrice[4](0),TPDirect[4](0);
Direct=Swing_Lee(NBars); //Swing_Lee_Simple(NBars,False); // something about Zaf's modification ?
If Sign(Direct)<>Sign(Direct[1]) then begin
BarsBk=AbsValue(Direct);
{Found a TurningPoing so increase count}
TPCount=TPCount+1;
{Save the proper price}
If Direct<0 then HoldPrice=High[BarsBk]
else HoldPrice=Low [BarsBk];
{Push the Stack}
For Value1=1 to 3 begin
TPDate[Value1] =TPDate[Value1+1];
TPTime[Value1] =TPTime[Value1+1];
TPBar[Value1] =TPBar[Value1+1];
TPPrice[Value1] =TPPrice[Value1+1];
TPDirect[Value1]=TPDirect[Value1+1];
End;
{Save Current Data}
TPDate[4] =Date[BarsBk];
TPTime[4] =Time[BarsBk];
TPBar[4] =CurrentBar-BarsBk;
TPPrice[4] =HoldPrice;
TPDirect[4]=Sign(Direct);
Plot1[BarsBk](HoldPrice,"TP");
If TPCount>3 then begin
{If we have 4 TP's then we can look for WW}
Condition1=False;Condition2=False;
Slope1=(TPPrice[3]-TPPrice[1])/(TPBar[1]-TPBar[3]);
Slope2=(TPPrice[4]-TPPrice[2])/(TPBar[2]-TPBar[4]);
If TPDirect[1]>0 then begin
{Look for Bullish WW}
Condition1=
TPPrice[4]>TPPrice[3] and
TPPrice[4]<TPPrice[2] and
TPPrice[3]<TPPrice[1] and
TPPrice[4]>TPPrice[1] and
Slope1 <Slope2 ;
End
Else Begin
{Look for Bearish WW}
Condition2=
TPPrice[4]<TPPrice[3] and
TPPrice[4]>TPPrice[2] and
TPPrice[3]>TPPrice[1] and
TPPrice[4]<TPPrice[1] and
Slope1 >Slope2 ;
End;
{Plot the wave and lines if it exists}
If Condition1 or Condition2 then begin
ETA1=TL_NEW(TPDate[1],TPTime[1],TPPrice[1],TPDate[3],TPTime[3],TPPrice[3]);
ETA2=TL_NEW(TPDate[2],TPTime[2],TPPrice[2],TPDate[4],TPTime[4],TPPrice[4]);
EPA =TL_NEW(TPDate[1],TPTime[1],TPPrice[1],TPDate[4],TPTime[4],TPPrice[4]);
Value5=TL_New(Date,Time,TL_GetValue(ETA1,Date,Time),
Date,Time,TL_GetValue(ETA2,Date,Time));
Value1=mod(tpcount,6)+2;
Value1=red;
TL_SetColor(ETA1,VALUE1);
TL_SetColor(ETA2,VALUE1);
TL_SetColor(EPA ,VALUE1);
TL_SetColor(Value5,Red);
TL_SetSize(Value5,3);
Value2=0;
Value1=0;
While Value2=0 and Value1< MaxBars begin
// need function BarsToDate_Time
// Value2=BarsToDate_Time(TPBar[4]-TPBar[3], Value1, NewDate, NewTime);
Value3=TL_GetValue(ETA2, NewDate, NewTime)-TL_GetValue(ETA1, NewDate, NewTime);
If Condition1 and Value3>0 then Value2=0;
If Condition2 and Value3<0 then Value2=0;
Value1=Value1+1;
End;
If Value2<>0 or Value1=MaxBars then begin
TL_SetEnd(ETA1, NewDate, NewTime, TL_GetValue(ETA1, NewDate, NewTime));
Value7=TL_GetValue(ETA2, NewDate, NewTime);
TL_SetEnd(ETA2, NewDate, NewTime, Value7);
Value8=Text_New(NewDate,NewTime,Value7,"ETA");
Text_SetStyle(Value8, 0, 2);
Value7=TL_GetValue(EPA , NewDate, NewTime);
TL_SetEnd(EPA , NewDate, NewTime, Value7);
Value8=Text_New(NewDate,NewTime,Value7,"EPA");
Text_SetStyle(Value8, 0, 2);
End;
End;
End;
End;
| Swing_Lee function: [LegacyColorValue = true];
{*******************************************************************
Function : Swing_Lee
Last Edit : 6/4/99
Provided By : Clyde Lee (c) 1997,1998,1999
Notes: Uses HighestHigh and LowestLow to determine Turning
Points for Swing Analysis.
Returns number of bars back to last swing point.
Negative if low. Positive if high.
********************************************************************}
Input: NDays(NumericSimple);
Vars: HBar(0), LBar(0),
MinInt(IntPortion(NDays/5+1)),
Direct(0), Return(0);
If NDays<>0 and CurrentBar>NDays then begin
Value2=H;HBar=0;
For Value1=1 to AbsValue(NDays)-1 begin
If H[Value1]>Value2 then begin
HBar=Value1;Value2=H[HBar];
End;
End;
Value2=L;LBar=0;
For Value1=1 to AbsValue(NDays)-1 begin
If L[Value1]<Value2 then begin
LBar=Value1;Value2=L[LBar];
End;
End;
If Direct=0 then begin
Direct=HBar-LBar;
End;
If Direct>0 then
Return=Return+1
else
Return=Return-1;
If LBar<HBar and Direct>0 {and HBar-LBar>MinInt} then begin
Direct=-1;
Return=-HBar;
End
Else If HBar<LBar and Direct<0 {and LBar-HBar>MinInt} then begin
Direct=+1;
Return=LBar;
End;
End;
Swing_Lee = Return;
| |