
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 DeepPink
#property indicator_color2 LawnGreen
#property indicator_color3 DeepPink

extern int ExtDepth = 34;
extern color Line_color = Red;
extern color Target_color = DeepPink;
extern bool Draw_ZZ = FALSE;
extern bool ShowTarget = TRUE;
int Gi_96 = 233;
int Gi_100 = 234;
color G_color_104 = LawnGreen;
color G_color_108 = DeepPink;
int G_width_112 = 2;
int G_width_116 = 2;
double G_ibuf_120[];
double G_ibuf_124[];
double G_ibuf_128[];
double Gd_132 = 0.0;
double Gd_140 = 0.0;
int Gi_148 = 0;

int init() {
   SetIndexStyle(2, DRAW_ARROW);
   SetIndexStyle(1, DRAW_ARROW);
   SetIndexStyle(0, DRAW_SECTION);
   SetIndexArrow(2, 174);
   SetIndexArrow(1, 174);
   if (Draw_ZZ) SetIndexBuffer(0, G_ibuf_128);
   SetIndexBuffer(1, G_ibuf_124);
   SetIndexBuffer(2, G_ibuf_120);
   SetIndexEmptyValue(0, 0.0);
   SetIndexEmptyValue(1, 0.0);
   SetIndexEmptyValue(2, 0.0);
   return (0);
}

int deinit() {
   ObjectDelete("xpMA");
   ObjectDelete("Target1=");
   ObjectDelete("Target2=");
   ObjectDelete("TargetUp");
   ObjectDelete("TargetDown");
   ObjectDelete("TP1");
   ObjectDelete("TP2");
   ObjectDelete("R1");
   ObjectDelete("R2");
   ObjectDelete("R3");
   ObjectDelete("R4");
   ObjectDelete("LH");
   ObjectDelete("LL");
   ObjectDelete("Low");
   ObjectDelete("High");
   ObjectDelete("0.618");
   ObjectDelete("0.5");
   ObjectDelete("0.382");
   ObjectDelete("0.236");
   Comment(" ");
   return (0);
}

int start() {

   int Li_8;
   int Li_20;
   int Li_24;
   double Ld_28;
   double Ld_36;
   double Ld_60;
   double Ld_68;
   double Ld_76;
   double Ld_84;
   double Ld_92;
   double Ld_100;
   double Ld_108;
   double Ld_116;
   ArrayInitialize(G_ibuf_128, 0.0);
   ArrayInitialize(G_ibuf_120, 0.0);
   ArrayInitialize(G_ibuf_124, 0.0);
   int Li_12 = Bars;
   int Li_16 = Bars;
   double low_52 = Low[Bars];
   double Ld_44 = High[Bars];
   for (int Li_4 = Bars - ExtDepth; Li_4 >= 0; Li_4--) {
      Li_24 = iLowest(NULL, 0, MODE_LOW, ExtDepth, Li_4);
      Ld_28 = Low[Li_24];
      Li_20 = iHighest(NULL, 0, MODE_HIGH, ExtDepth, Li_4);
      Ld_36 = High[Li_20];
      if (Ld_28 >= Ld_52) Ld_52 = Ld_28;
      else {
         if (Li_12 > Li_24) {
            G_ibuf_120[Li_24] = Ld_28;
            Ld_60 = 100000;
            Li_8 = Li_12;
            for (int Li_0 = Li_12; Li_0 >= Li_24; Li_0--) {
               if (G_ibuf_120[Li_0] != 0.0) {
                  if (G_ibuf_120[Li_0] < Ld_60) {
                     Ld_60 = G_ibuf_120[Li_0];
                     Li_8 = Li_0;
                  }
                  G_ibuf_128[Li_0] = 0.0;
               }
            }
            G_ibuf_128[Li_8] = Ld_60;
         }
         Li_16 = Li_24;
         Ld_52 = Ld_28;
      }
      if (Ld_36 <= Ld_44) Ld_44 = Ld_36;
      else {
         if (Li_16 > Li_20) {
            G_ibuf_124[Li_20] = Ld_36;
            Ld_68 = -100000;
            Li_8 = Li_16;
            for (Li_0 = Li_16; Li_0 >= Li_20; Li_0--) {
               if (G_ibuf_124[Li_0] != 0.0) {
                  if (G_ibuf_124[Li_0] > Ld_68) {
                     Ld_68 = G_ibuf_124[Li_0];
                     Li_8 = Li_0;
                  }
                  G_ibuf_128[Li_0] = 0.0;
               }
            }
            G_ibuf_128[Li_8] = Ld_68;
         }
         Li_12 = Li_20;
         Ld_44 = Ld_36;
      }
      Ld_116 = Ld_44 - Ld_52;
      if (Li_16 < Li_12) {
         Ld_76 = Ld_28;
         Ld_84 = Ld_76 + 0.618 * Ld_116;
         Ld_92 = Ld_76 + Ld_116 / 2.0;
         Ld_100 = Ld_76 + Ld_116 / 2.0;
         Ld_108 = Ld_76 + 0.236 * Ld_116;
         if (Close[0] > Ld_84) Gd_132 = Ld_36 + 0.618 * Ld_116;
         if (Close[0] > Gd_132) Gd_132 = 0;
      }
      if (Li_12 < Li_16) {
         Ld_76 = Ld_36;
         Ld_84 = Ld_76 - 0.618 * Ld_116;
         Ld_92 = Ld_76 - Ld_116 / 2.0;
         Ld_100 = Ld_76 - Ld_116 / 2.0;
         Ld_108 = Ld_76 - 0.236 * Ld_116;
         if (Close[0] < Ld_84) Gd_140 = Ld_28 - 0.618 * Ld_116;
         if (Close[0] < Gd_140) Gd_140 = 0;
      }
      drawLine(Ld_36, "LH", Line_color, 1);
      drawLabel("High", Ld_36, Line_color, 13);
      drawLine(Ld_28, "LL", Line_color, 1);
      drawLabel("Low", Ld_28, Line_color, 13);
      drawLine(Ld_84, "R4", Yellow, 2);
      drawLabel("0.618", Ld_84, Yellow, 13);
      drawLine(Ld_100, "R2", Yellow, 2);
      drawLabel("0.382", Ld_100, Yellow, 13);
      ObjectDelete("xpMA");
      if (Gd_132 > 0.0 && ShowTarget == TRUE) {
         drawLine(Gd_132, "TP1", Target_color, 2);
         drawLabel("Target Up", Gd_132, Target_color, 7);
         drawTarget("Target1=", Gd_132, Target_color, 1);
         if (Ld_84 > Ld_100 && Close[0] > Ld_84 && Gd_132 > Ld_84) DrawObject(1, (Gd_132 + Ld_36) / 2.0);
         if (Ld_84 < Ld_100 && Close[0] > Ld_100 && Gd_132 > Ld_100) DrawObject(1, (Gd_132 + Ld_36) / 2.0);
      }
      if (Gd_140 > 0.0 && ShowTarget == TRUE) {
         drawLine(Gd_140, "TP2", Target_color, 2);
         drawLabel("Target Down", Gd_140, Target_color, 7);
         drawTarget("Target2=", Gd_140, Target_color, 2);
         if (Ld_84 < Ld_100 && Close[0] < Ld_84 && Gd_140 < Ld_84) DrawObject(2, (Gd_140 + Ld_28) / 2.0);
         if (Ld_84 > Ld_100 && Close[0] < Ld_100 && Gd_140 < Ld_100) DrawObject(2, (Gd_140 + Ld_28) / 2.0);
      }
   }
   return (0);
}

void drawTarget(string A_name_0, double Ad_8, int Ai_unused_16, int Ai_20) {
   string dbl2str_24 = DoubleToStr(Ad_8, Digits);
   string Ls_unused_32 = "Ve";
   ObjectCreate(A_name_0, OBJ_LABEL, 0, 0, 0);
   if (Ai_20 == 1) {
      ObjectSet(A_name_0, OBJPROP_XDISTANCE, 575);
      ObjectSet(A_name_0, OBJPROP_YDISTANCE, 25);
      ObjectSetText(A_name_0, "Upper Target   =  " + dbl2str_24, 10, "Arial Bold", Lime);
   }
   if (Ai_20 == 2) {
      ObjectSet(A_name_0, OBJPROP_XDISTANCE, 575);
      ObjectSet(A_name_0, OBJPROP_YDISTANCE, 45);
      ObjectSetText(A_name_0, "Lower Target   =  " + dbl2str_24, 10, "Arial Bold", Red);
   }
}

void drawLabel(string A_name_0, double A_price_8, color A_color_16, int Ai_20) {
   if (ObjectFind(A_name_0) != 0) {
      ObjectCreate(A_name_0, OBJ_TEXT, 0, Time[Ai_20], A_price_8);
      ObjectSetText(A_name_0, A_name_0, 9, "Arial Bold", CLR_NONE);
      ObjectSet(A_name_0, OBJPROP_COLOR, A_color_16);
      return;
   }
   ObjectMove(A_name_0, 0, Time[Ai_20], A_price_8);
}

void drawLine(double A_price_0, string A_name_8, color A_color_16, int Ai_20) {
   if (ObjectFind(A_name_8) != 0) {
      if (Ai_20 == 1) ObjectCreate(A_name_8, OBJ_HLINE, 0, Time[0], A_price_0, Time[0], A_price_0);
      else ObjectCreate(A_name_8, OBJ_GANNLINE, 0, Time[15], A_price_0, Time[0], A_price_0);
      ObjectSet(A_name_8, OBJPROP_STYLE, STYLE_DOT);
      ObjectSet(A_name_8, OBJPROP_COLOR, A_color_16);
      ObjectSet(A_name_8, OBJPROP_WIDTH, 0);
      return;
   }
   ObjectDelete(A_name_8);
   if (Ai_20 == 1) ObjectCreate(A_name_8, OBJ_HLINE, 0, Time[0], A_price_0, Time[0], A_price_0);
   else ObjectCreate(A_name_8, OBJ_GANNLINE, 0, Time[15], A_price_0, Time[0], A_price_0);
   ObjectSet(A_name_8, OBJPROP_STYLE, STYLE_DOT);
   ObjectSet(A_name_8, OBJPROP_COLOR, A_color_16);
   ObjectSet(A_name_8, OBJPROP_WIDTH, 0);
}

void DrawObject(int Ai_0, double A_price_4) {
   Gi_148++;
   string name_12 = "";
   name_12 = "xpMA";
   if (Ai_0 == 1) {
      ObjectCreate(name_12, OBJ_ARROW, 0, Time[0], A_price_4);
      ObjectSet(name_12, OBJPROP_COLOR, G_color_104);
      ObjectSet(name_12, OBJPROP_ARROWCODE, Gi_96);
      ObjectSet(name_12, OBJPROP_WIDTH, G_width_112);
   }
   if (Ai_0 == 2) {
      ObjectCreate(name_12, OBJ_ARROW, 0, Time[0], A_price_4);
      ObjectSet(name_12, OBJPROP_COLOR, G_color_108);
      ObjectSet(name_12, OBJPROP_ARROWCODE, Gi_100);
      ObjectSet(name_12, OBJPROP_WIDTH, G_width_116);
   }
}
