//==========================================
// Signal Name : HiLoZZTrendLine_Ver_16
// Written by  : yahoosir
// Blog        : http://yahoosir.blog.me
// Last Update : 2017-03-01
//==========================================
Input:length(10),tlExtend(5),tlCheckRange(10),entryCntLimit(1),
      waveLineSize(1),tlSize(0),waveLineColor(GREEN),displPRC(0);
Var:j(0),jj(0),lastHi(0),lastLo(0),lastVertex(""),procBit(""),entryCnt(0),
    TL1(0),TL2(0),TL3(0),Text1(0),
//ssssssssssssssssssssssssssssssssss
    hiTLEndVal(0),loTLEndVal(0),pkID(0),vlID(0);
//eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
Array:PK[100,4](0),VL[100,4](0); // 1:Price,2:BarNumber,3:Date,4:Time
//==========================================
Condition1 = Highest(H,length) = H and lastHi <> H;
Condition2 = Lowest (L,length) = L and lastLo <> L;
procBit = "";
If Condition1 and Condition2 Then Begin
   If lastVertex = "Valley" Then Begin 
      If VL[1,1] > L Then procBit = "Valley"
      Else                procBit = "Peak";
   End
   Else If lastVertex = "Peak" Then Begin
      If PK[1,1] < H Then procBit = "Peak" 
      Else                procBit = "Valley";
   End;
End
Else If Condition1 Then procBit = "Peak"
Else If Condition2 Then procBit = "Valley";
//==========================================
If procBit = "Peak" Then Begin
   lastHi = H;
   If lastVertex = "Valley" Then Begin
      entryCnt = 0;
      For j = 100 DownTo 2 Begin
//ssssssssssssssssssssssssssssssssss
          For jj = 1 To 4 Begin
              PK[j,jj] = PK[j-1,jj];
          End ;
//eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
      End;
      PK[1,1] = H;
      PK[1,2] = BarNumber;
//ssssssssssssssssssssssssssssssssss
      PK[1,3] = Date;
      PK[1,4] = Time;
      TL1  = TL_New(VL[1,3],VL[1,4],VL[1,1],PK[1,3],PK[1,4],PK[1,1]);
//eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
      If displPRC = 1 Then Begin
         Text1 = Text_New(PK[1,3],PK[1,4],PK[1,1],NumToStr(PK[1,1],2));
         Text_SetStyle(Text1, 2, 1);
         Text_SetColor(Text1,black);
      End ;
      TL_SetSize(TL1,waveLineSize);
      TL_SetColor(TL1,waveLineColor);
   End
   Else If PK[1,1] < H Then Begin
      PK[1,1] = H;
      PK[1,2] = BarNumber;
//ssssssssssssssssssssssssssssssssss
      PK[1,3] = Date;
      PK[1,4] = Time;
      TL_SetEnd(TL1,PK[1,3],PK[1,4],PK[1,1]);
//eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
      If displPRC = 1 Then Begin
         Text_SetLocation(Text1,PK[1,3],PK[1,4],PK[1,1]);
         Text_SetString(Text1,NumToStr(PK[1,1],2));
      End;
   End ;
{ High Trend Line }
   If PK[2,2][1] <> PK[2,2] Then Begin
//ssssssssssssssssssssssssssssssssss
      hiTLEndVal = 0;
//eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
      For j = 3 To tlCheckRange Begin
          If PK[2,1] < PK[j,1] Then Begin
//ssssssssssssssssssssssssssssssssss
             hiTLEndVal = (PK[2,1] - PK[j,1])/(PK[2,2] - PK[j,2]) * (BarNumber - PK[j,2]) + PK[j,1];
             TL2 = TL_New(PK[j,3],PK[j,4],PK[j,1],Date,Time,hiTLEndVal); 
             pkID = j;
//eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
             TL_SetSize(TL2,tlSize);
             TL_SetColor(TL2,RED);
             Break;
          End ;
      End;
   End
   Else If hiTLEndVal[1] > 0 Then Begin
//ssssssssssssssssssssssssssssssssss
      hiTLEndVal = (PK[2,1] - PK[pkID,1])/(PK[2,2] - PK[pkID,2]) * (BarNumber - PK[pkID,2]) + PK[pkID,1];
//eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
      TL_SetEnd(TL2,Date,Time,hiTLEndVal);
   End ;
   If loTLEndVal[1] > 0 Then Begin
//ssssssssssssssssssssssssssssssssss
      loTLEndVal = (VL[2,1] - VL[vlID,1])/(VL[2,2] - VL[vlID,2]) * (BarNumber - VL[vlID,2]) + VL[vlID,1];
//eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
      TL_SetEnd(TL3,Date,Time,loTLEndVal);
   End ;
   lastVertex = "Peak";
   If entryCnt < entryCntLimit and
      hiTLEndVal > 0 and hiTLEndVal < C Then Begin
      Buy  This Bar On  Close;
   End ;
End ;
//==========================================
If procBit = "Valley" Then Begin
   lastLo = L;
   If lastVertex = "Peak" then Begin
      entryCnt = 0;
      For j = 100 DownTo 2 Begin
//ssssssssssssssssssssssssssssssssss
          For jj = 1 To 4 Begin
              VL[j,jj] = VL[j-1,jj];
          End;
//eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
      End;
      VL[1,1] = L;
      VL[1,2] = BarNumber;
//ssssssssssssssssssssssssssssssssss
      VL[1,3] = Date;
      VL[1,4] = Time; 
      TL1  = TL_New(PK[1,3],PK[1,4],PK[1,1],VL[1,3],VL[1,4],VL[1,1]);
//eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
      If displPRC = 1 Then Begin
         Text1 = Text_New(VL[1,3],VL[1,4],VL[1,1],NumToStr(VL[1,1],2));
         Text_SetStyle(Text1, 2, 0);
         Text_SetColor(Text1,black);
      End ;
      TL_SetSize(TL1,waveLineSize);
      TL_SetColor(TL1,waveLineColor);
   End
   Else If VL[1,1] > L then Begin
      VL[1,1] = L;
      VL[1,2] = BarNumber;
//ssssssssssssssssssssssssssssssssss
      VL[1,3] = Date;
      VL[1,4] = Time; 
      TL_SetEnd(TL1,VL[1,3],VL[1,4],VL[1,1]);
//eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
      If displPRC = 1 Then Begin
         Text_SetLocation(Text1,VL[1,3],VL[1,4],VL[1,1]);
         Text_SetString(Text1,NumToStr(VL[1,1],2));
      End ;
   End ;
{ Low Trend Line }
   If VL[2,2][1] <> VL[2,2] Then Begin
//ssssssssssssssssssssssssssssssssss
      loTLEndVal = 0;
//eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
      For j = 3 To tlCheckRange Begin
          If VL[2,1] > VL[j,1] and VL[j,1] > 0 Then Begin
//ssssssssssssssssssssssssssssssssss
             loTLEndVal = (VL[2,1] - VL[j,1])/(VL[2,2] - VL[j,2]) * (BarNumber - VL[j,2]) + VL[j,1];
             TL3 = TL_New(VL[j,3],VL[j,4],VL[j,1],Date,Time,loTLEndVal); 
             vlID = j;
//eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
             TL_SetSize(TL3,tlSize);
             TL_SetColor(TL3,Blue);
             Break;
          End ;
      End;
   End
   Else If loTLEndVal[1] > 0 Then Begin
//ssssssssssssssssssssssssssssssssss
      loTLEndVal = (VL[2,1] - VL[vlID,1])/(VL[2,2] - VL[vlID,2]) * (BarNumber - VL[vlID,2]) + VL[vlID,1];
//eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
      TL_SetEnd(TL3,Date,Time,loTLEndVal);
   End ;
   If hiTLEndVal[1] > 0 Then Begin
//ssssssssssssssssssssssssssssssssss
      hiTLEndVal = (PK[2,1] - PK[pkID,1])/(PK[2,2] - PK[pkID,2]) * (BarNumber - PK[pkID,2]) + PK[pkID,1];
//eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
      TL_SetEnd(TL2,Date,Time,hiTLEndVal);
   End ;
   lastVertex = "Valley";
   If entryCnt < entryCntLimit and
      loTLEndVal > 0 and loTLEndVal > C Then Begin
      SellShort  This Bar On  Close;
   End ;
End ;
//==========================================
If procBit = "" Then Begin
   If BarNumber - PK[1,2] <= tlExtend Then Begin
      If hiTLEndVal[1] > 0 Then Begin
//ssssssssssssssssssssssssssssssssss
         hiTLEndVal = (PK[2,1] - PK[pkID,1])/(PK[2,2] - PK[pkID,2]) * (BarNumber - PK[pkID,2]) + PK[pkID,1];
//eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
         TL_SetEnd(TL2,Date,Time,hiTLEndVal);
      End ;
   End
   Else Begin
      hiTLEndVal = 0;
   End ;
   If BarNumber - VL[1,2] <= tlExtend Then Begin
      If loTLEndVal[1] > 0 Then Begin
//ssssssssssssssssssssssssssssssssss
         loTLEndVal = (VL[2,1] - VL[vlID,1])/(VL[2,2] - VL[vlID,2]) * (BarNumber - VL[vlID,2]) + VL[vlID,1];
//eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
         TL_SetEnd(TL3,Date,Time,loTLEndVal);
      End ;
   End
   Else Begin
      loTLEndVal = 0;
   End ;
   If MarketPosition > 0 and TL2[1] = TL2 and
      hiTLEndVal > 0 and hiTLEndVal[1] <= C[1] and hiTLEndVal > C Then
      Sell   This Bar On  Close;
   If MarketPosition < 0 and TL3[1] = TL3 and
      loTLEndVal > 0 and loTLEndVal[1] >= C[1] and loTLEndVal < C Then
      BuyToCover   This Bar On  Close;
End ;
If ((lastVertex = "Peak" and MarketPosition = 1) or
    (lastVertex = "Valley" and MarketPosition = -1)) and
   MarketPosition[1] <> MarketPosition Then Begin
   entryCnt = entryCnt + 1;
End ;
