/*
   Generated by EX4-TO-MQ4 decompiler V4.0.224.1 []
   Website: http://purebeam.biz
   E-mail : purebeam@gmail.com
*/
#property copyright "Copyright © 2009, Usama Abu-Yousef. gm@egyptnile.com"
#property link      "gm@egyptnile.com"

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 LightBlue

extern bool ShowSR = TRUE;
extern bool ShowTrend = FALSE;
extern bool ShowH4SR = TRUE;
extern bool ShowLowTFSR = FALSE;
extern bool ShowDayRect = FALSE;
extern int MaxSupportResistance = 6;
extern string Note1 = "...SR Lines styles ........................";
extern int SRStyle = 0;
extern int SRwidth1 = 2;
extern int SRwidth2 = 2;
extern int SRwidth3 = 2;
extern int SRwidth4 = 1;
extern int SRwidth5 = 1;
extern int SRwidth6 = 1;
extern color SRColor1 = Maroon;
extern color SRColor2 = Purple;
extern color SRColor3 = Red;
extern color SRColor4 = Brown;
extern color SRColor5 = C'0x00,0x00,0x33';
extern color SRColor6 = DarkOrange;
extern color RecColor = C'0x00,0x00,0x28';
extern string Note2 = "...Trend Lines styles ........................";
extern int MN1Width = 1;
extern int W1Width = 1;
extern int D1Width = 1;
extern int H4Width = 1;
extern int H1Width = 1;
extern int M15Width = 1;
extern int M5Width = 1;
extern int MN1Style = 1;
extern int W1Style = 1;
extern int D1Style = 1;
extern int H4Style = 1;
extern int H1Style = 2;
extern int M15Style = 2;
extern int M5Style = 2;
extern color MN1Color = DarkViolet;
extern color W1Color = White;
extern color D1Color = Red;
extern color H4Color = Yellow;
extern color H1Color = Aqua;
extern color M15Color = Green;
extern color M5Color = HotPink;
extern color M1Color = Red;
extern string Note3 = "...Zigzag Settings for Trend ........................";
extern int z1 = 9;
extern int z2 = 0;
extern int z3 = 3;
extern string Note4 = "...Zigzag Settings for SR ........................";
extern int y1 = 12;
extern int y2 = 6;
extern int y3 = 3;
bool g_bool_300 = TRUE;
double gda_304[];
double gda_308[];
double gda_312[];
double gda_316[];
double gda_320[];
int gi_324 = 3;
int gi_328 = 2000;
bool gi_332 = FALSE;
double gd_336;
int g_datetime_344;
int g_timeframe_508 = 0;

void delObjects() {
   ObjectDelete("Trend_MN1_Down");
   ObjectDelete("Trend_MN1_Up");
   ObjectDelete("Trend_W1_Down");
   ObjectDelete("Trend_W1_Up");
   ObjectDelete("Trend_D1_Down");
   ObjectDelete("Trend_D1_Up");
   ObjectDelete("Trend_H4_Down");
   ObjectDelete("Trend_H4_Up");
   ObjectDelete("Trend_H1_Down");
   ObjectDelete("Trend_H1_Up");
   ObjectDelete("Trend_M15_Down");
   ObjectDelete("Trend_M15_Up");
   ObjectDelete("Trend_M5_Down");
   ObjectDelete("Trend_M5_Up");
   ObjectDelete("Trend_M1_Down");
   ObjectDelete("Trend_M1_Up");
   ObjectDelete("DREC");
   for (int li_0 = 1; li_0 <= 9 * MaxSupportResistance; li_0++) {
      ObjectDelete("SUP__________" + li_0);
      ObjectDelete("RES__________" + li_0);
   }
}

int deinit() {
   delObjects();
   return (0);
}

int init() {
   ArrayResize(gda_304, gi_328);
   ArraySetAsSeries(gda_304, TRUE);
   ArrayResize(gda_308, gi_328);
   ArraySetAsSeries(gda_308, TRUE);
   ArrayResize(gda_312, gi_328);
   ArraySetAsSeries(gda_312, TRUE);
   ArrayResize(gda_316, gi_328);
   ArraySetAsSeries(gda_316, TRUE);
   ArrayResize(gda_320, gi_328);
   ArraySetAsSeries(gda_320, TRUE);
   SetIndexEmptyValue(0, 0.0);
   CreateTrendLine("Trend_MN1_Down", MN1Color, MN1Width, MN1Style);
   CreateTrendLine("Trend_MN1_Up", MN1Color, MN1Width, MN1Style);
   CreateTrendLine("Trend_W1_Down", W1Color, W1Width, W1Style);
   CreateTrendLine("Trend_W1_Up", W1Color, W1Width, W1Style);
   CreateTrendLine("Trend_D1_Down", D1Color, D1Width, D1Style);
   CreateTrendLine("Trend_D1_Up", D1Color, D1Width, D1Style);
   CreateTrendLine("Trend_H4_Down", H4Color, H4Width, H4Style);
   CreateTrendLine("Trend_H4_Up", H4Color, H4Width, H4Style);
   CreateTrendLine("Trend_H1_Down", H1Color, H1Width, H1Style);
   CreateTrendLine("Trend_H1_Up", H1Color, H1Width, H1Style);
   CreateTrendLine("Trend_M15_Down", M15Color, M15Width, M15Style);
   CreateTrendLine("Trend_M15_Up", M15Color, M15Width, M15Style);
   CreateTrendLine("Trend_M5_Down", M5Color, M5Width, M5Style);
   CreateTrendLine("Trend_M5_Up", M5Color, M5Width, M5Style);
   CreateTrendLine("Trend_M1_Down", M1Color, M5Width, M5Style);
   CreateTrendLine("Trend_M1_Up", M1Color, M5Width, M5Style);
   IndicatorShortName("Usama_SupportResistanceLines");
   return (0);
}

int start() {
   int l_datetime_0;
   int li_4;
   double l_ihigh_8;
   double l_ilow_16;
   if (ShowDayRect && Period() < PERIOD_D1) {
      l_ihigh_8 = iHigh(NULL, PERIOD_D1, 1);
      l_ilow_16 = iLow(NULL, PERIOD_D1, 1);
      l_datetime_0 = iTime(NULL, PERIOD_D1, 0);
      li_4 = l_datetime_0 + 86400;
      CreateRectangle("DREC", l_ihigh_8, l_ilow_16, l_datetime_0, li_4, RecColor, 1, STYLE_SOLID);
   }
   if (ShowTrend) {
      initializeBuffers();
      zigzag(PERIOD_MN1, z1, z2, z3);
      fillztzb();
      getFirstZigzagPoint(PERIOD_MN1);
      drawDnTrend(PERIOD_MN1, "Trend_MN1_Down");
      drawUpTrend(PERIOD_MN1, "Trend_MN1_Up");
      if (Period() <= PERIOD_W1) {
         initializeBuffers();
         zigzag(PERIOD_W1, z1, z2, z3);
         fillztzb();
         getFirstZigzagPoint(PERIOD_W1);
         drawDnTrend(PERIOD_W1, "Trend_W1_Down");
         drawUpTrend(PERIOD_W1, "Trend_W1_Up");
      }
      if (Period() <= PERIOD_D1) {
         initializeBuffers();
         zigzag(PERIOD_D1, z1, z2, z3);
         fillztzb();
         getFirstZigzagPoint(PERIOD_D1);
         drawDnTrend(PERIOD_D1, "Trend_D1_Down");
         drawUpTrend(PERIOD_D1, "Trend_D1_Up");
      }
      if (Period() <= PERIOD_H4) {
         initializeBuffers();
         zigzag(PERIOD_H4, z1, z2, z3);
         fillztzb();
         getFirstZigzagPoint(PERIOD_H4);
         drawDnTrend(PERIOD_H4, "Trend_H4_Down");
         drawUpTrend(PERIOD_H4, "Trend_H4_Up");
      }
      if (Period() <= PERIOD_H1) {
         initializeBuffers();
         zigzag(PERIOD_H1, z1, z2, z3);
         fillztzb();
         getFirstZigzagPoint(PERIOD_H1);
         drawDnTrend(PERIOD_H1, "Trend_H1_Down");
         drawUpTrend(PERIOD_H1, "Trend_H1_Up");
      }
      if (Period() <= PERIOD_M15) {
         initializeBuffers();
         zigzag(PERIOD_M15, z1, z2, z3);
         fillztzb();
         getFirstZigzagPoint(PERIOD_M15);
         drawDnTrend(PERIOD_M15, "Trend_M15_Down");
         drawUpTrend(PERIOD_M15, "Trend_M15_Up");
      }
      if (Period() <= PERIOD_M5) {
         initializeBuffers();
         zigzag(PERIOD_M5, z1, z2, z3);
         fillztzb();
         getFirstZigzagPoint(PERIOD_M5);
         drawDnTrend(PERIOD_M5, "Trend_M5_Down");
         drawUpTrend(PERIOD_M5, "Trend_M5_Up");
      }
   }
   if (ShowSR) {
      if (Period() <= PERIOD_MN1) {
         g_timeframe_508 = 43200;
         initializeBuffers();
         zigzag(g_timeframe_508, y1, y2, y3);
         fillztzb();
         getFirstZigzagPoint(g_timeframe_508);
         DrawSupportResistance("MN1", SRwidth1, SRColor1, 1, 0);
      }
      if (Period() <= PERIOD_W1) {
         g_timeframe_508 = 10080;
         initializeBuffers();
         zigzag(g_timeframe_508, y1, y2, y3);
         fillztzb();
         getFirstZigzagPoint(g_timeframe_508);
         DrawSupportResistance("W1", SRwidth2, SRColor2, MaxSupportResistance + 1, 0);
      }
      if (Period() <= PERIOD_D1) {
         g_timeframe_508 = 1440;
         initializeBuffers();
         zigzag(g_timeframe_508, y1, y2, y3);
         fillztzb();
         getFirstZigzagPoint(g_timeframe_508);
         DrawSupportResistance("D1", SRwidth3, SRColor3, MaxSupportResistance * 2 + 1, 0);
      }
      if (ShowH4SR) {
         if (Period() <= PERIOD_H4) {
            g_timeframe_508 = 240;
            initializeBuffers();
            zigzag(g_timeframe_508, y1, y2, y3);
            fillztzb();
            getFirstZigzagPoint(g_timeframe_508);
            DrawSupportResistance("H4", SRwidth4, SRColor4, 3 * MaxSupportResistance + 1, 0);
         }
      }
      if (ShowLowTFSR) {
         if (Period() <= PERIOD_H1) {
            g_timeframe_508 = 60;
            initializeBuffers();
            zigzag(g_timeframe_508, y1, y2, y3);
            fillztzb();
            getFirstZigzagPoint(g_timeframe_508);
            DrawSupportResistance("H1", SRwidth5, SRColor5, MaxSupportResistance << 2 + 1, 0);
         }
         if (Period() <= PERIOD_M15) {
            g_timeframe_508 = 15;
            initializeBuffers();
            zigzag(g_timeframe_508, y1, y2, y3);
            fillztzb();
            getFirstZigzagPoint(g_timeframe_508);
            DrawSupportResistance("M15", SRwidth6, SRColor6, 5 * MaxSupportResistance + 1, 0);
         }
      }
   }
   return (0);
}

void DrawSupportResistance(string as_0, int ai_8, int ai_12, int ai_16, double ad_20 = 0.0) {
   int li_64;
   int l_datetime_68;
   string ls_72;
   int l_count_60 = 0;
   for (int li_52 = 0; li_52 < gi_328; li_52++) {
      if (gda_316[li_52] > 0.0 && gda_316[li_52] != gd_336) {
         l_count_60++;
         li_64 = l_count_60 + ai_16 - 1;
         l_datetime_68 = iTime(NULL, g_timeframe_508, li_52);
         ls_72 = TimeYear(l_datetime_68) + "." + TimeMonth(l_datetime_68) + "." + TimeDay(l_datetime_68) + " " + TimeHour(l_datetime_68) + ":" + TimeMinute(l_datetime_68);
         drawHLine("RES__________" + li_64, gda_316[li_52], ai_12, ai_8, SRStyle, as_0 + "_RESISTANCE_" + l_count_60 
            + "\n" 
         + ls_72, ad_20);
         if (l_count_60 >= MaxSupportResistance) break;
      }
   }
   l_count_60 = 0;
   for (li_52 = 0; li_52 < gi_328; li_52++) {
      if (gda_320[li_52] > 0.0 && gda_320[li_52] != gd_336) {
         l_count_60++;
         li_64 = l_count_60 + ai_16 - 1;
         l_datetime_68 = iTime(NULL, g_timeframe_508, li_52);
         ls_72 = TimeYear(l_datetime_68) + "." + TimeMonth(l_datetime_68) + "." + TimeDay(l_datetime_68) + " " + TimeHour(l_datetime_68) + ":" + TimeMinute(l_datetime_68);
         drawHLine("SUP__________" + li_64, gda_320[li_52], ai_12, ai_8, SRStyle, as_0 + "_SUPPORT_" + l_count_60 
            + "\n" 
         + ls_72, ad_20);
         if (l_count_60 >= MaxSupportResistance) break;
      }
   }
}

void getFirstZigzagPoint(int a_timeframe_0) {
   for (int li_4 = 0; li_4 < gi_328; li_4++) {
      if (gda_304[li_4] > 0.0) {
         gd_336 = gda_304[li_4];
         g_datetime_344 = iTime(NULL, a_timeframe_0, li_4);
         return;
      }
   }
}

void fillztzb() {
   int li_20 = 0;
   int li_24 = 0;
   ArrayInitialize(gda_316, 0.0);
   ArrayInitialize(gda_320, 0.0);
   double ld_4 = 0;
   double ld_12 = 0;
   for (int l_index_0 = 0; l_index_0 < gi_328; l_index_0++) {
      if (gda_304[l_index_0] > 0.0) {
         if (ld_4 == 0.0) ld_4 = gda_304[l_index_0];
         else {
            ld_12 = gda_304[l_index_0];
            break;
         }
      }
   }
   if (ld_4 > ld_12) li_20 = 1;
   else li_20 = 2;
   li_24 = li_20;
   for (l_index_0 = 0; l_index_0 < gi_328; l_index_0++) {
      if (gda_304[l_index_0] > 0.0) {
         if (li_24 == 1) {
            gda_316[l_index_0] = gda_304[l_index_0];
            li_24 = 2;
         } else {
            gda_320[l_index_0] = gda_304[l_index_0];
            li_24 = 1;
         }
      }
   }
}

void drawDnTrend(int a_timeframe_0, string a_name_4) {
   int li_16;
   int li_20;
   double ld_24;
   double ld_32;
   int l_datetime_40;
   int l_datetime_44;
   bool li_48 = FALSE;
   bool li_52 = FALSE;
   for (int l_index_12 = 0; l_index_12 < gi_328; l_index_12++) {
      if (gda_316[l_index_12] > 0.0 && gda_316[l_index_12] != gd_336) {
         if (li_48 == FALSE) {
            li_16 = l_index_12;
            ld_24 = gda_316[l_index_12];
            li_48 = TRUE;
         } else {
            if (gda_316[l_index_12] >= ld_24) {
               li_20 = l_index_12;
               ld_32 = gda_316[l_index_12];
               li_52 = TRUE;
               break;
            }
         }
      }
   }
   if (li_48 == TRUE && li_52 == TRUE) {
      l_datetime_40 = iTime(NULL, a_timeframe_0, li_16);
      l_datetime_44 = iTime(NULL, a_timeframe_0, li_20);
      ObjectMove(a_name_4, 1, l_datetime_40, ld_24);
      ObjectMove(a_name_4, 0, l_datetime_44, ld_32);
   }
}

void drawUpTrend(int a_timeframe_0, string a_name_4) {
   int li_16;
   int li_20;
   double ld_24;
   double ld_32;
   int l_datetime_40;
   int l_datetime_44;
   bool li_48 = FALSE;
   bool li_52 = FALSE;
   for (int l_index_12 = 0; l_index_12 < gi_328; l_index_12++) {
      if (gda_320[l_index_12] > 0.0 && gda_320[l_index_12] != gd_336) {
         if (li_48 == FALSE) {
            li_16 = l_index_12;
            ld_24 = gda_320[l_index_12];
            li_48 = TRUE;
         } else {
            if (gda_320[l_index_12] <= ld_24) {
               li_20 = l_index_12;
               ld_32 = gda_320[l_index_12];
               li_52 = TRUE;
               break;
            }
         }
      }
   }
   if (li_48 == TRUE && li_52 == TRUE) {
      l_datetime_40 = iTime(NULL, a_timeframe_0, li_16);
      l_datetime_44 = iTime(NULL, a_timeframe_0, li_20);
      ObjectMove(a_name_4, 1, l_datetime_40, ld_24);
      ObjectMove(a_name_4, 0, l_datetime_44, ld_32);
   }
}

void drawHLine(string a_name_0, double ad_8, color a_color_16, int a_width_20 = 1, int a_style_24 = 0, string a_text_28 = "", double a_pips_36 = 0.0) {
   a_pips_36 = 0;
   ObjectCreate(a_name_0, OBJ_HLINE, 0, 0, ad_8 + a_pips_36 * Point, 0);
   ObjectSet(a_name_0, OBJPROP_STYLE, a_style_24);
   ObjectSet(a_name_0, OBJPROP_COLOR, a_color_16);
   ObjectSet(a_name_0, OBJPROP_WIDTH, a_width_20);
   ObjectSet(a_name_0, OBJPROP_BACK, g_bool_300);
   ObjectSet(a_name_0, OBJPROP_RAY, FALSE);
   ObjectSetText(a_name_0, a_text_28, 10, "Times New Roman", Red);
}

void CreateTrendLine(string a_name_0, color a_color_8, int a_width_12 = 1, int a_style_16 = 0) {
   ObjectCreate(a_name_0, OBJ_TREND, 0, 0, 0, 0, 0);
   ObjectSet(a_name_0, OBJPROP_COLOR, a_color_8);
   ObjectSet(a_name_0, OBJPROP_STYLE, a_style_16);
   ObjectSet(a_name_0, OBJPROP_WIDTH, a_width_12);
   ObjectSet(a_name_0, OBJPROP_BACK, g_bool_300);
}

void initializeBuffers() {
   ArrayInitialize(gda_304, 0.0);
   ArrayInitialize(gda_308, 0.0);
   ArrayInitialize(gda_312, 0.0);
   ArrayInitialize(gda_316, 0.0);
   ArrayInitialize(gda_320, 0.0);
}

int zigzag(int a_timeframe_0, int ai_4 = 9, int ai_8 = 5, int ai_12 = 3) {
   int li_16;
   int li_24;
   int li_28;
   int li_32;
   int li_44;
   int li_48;
   double ld_52;
   double ld_60;
   double ld_68;
   double ld_76;
   double ld_84;
   double ld_92;
   int l_ind_counted_20 = IndicatorCounted();
   if (l_ind_counted_20 == 0 && gi_332) {
      ArrayInitialize(gda_304, 0.0);
      ArrayInitialize(gda_308, 0.0);
      ArrayInitialize(gda_312, 0.0);
   }
   if (l_ind_counted_20 == 0) li_24 = iBars(NULL, a_timeframe_0) - ai_4;
   if (l_ind_counted_20 > 0) {
      while (li_28 < gi_324 && li_16 < 100) {
         ld_60 = gda_304[li_16];
         if (ld_60 != 0.0) li_28++;
         li_16++;
      }
      li_16--;
      li_24 = li_16;
      if (gda_312[li_16] != 0.0) {
         ld_68 = gda_312[li_16];
         li_32 = 1;
      } else {
         ld_76 = gda_308[li_16];
         li_32 = -1;
      }
      for (li_16 = li_24 - 1; li_16 >= 0; li_16--) {
         gda_304[li_16] = 0.0;
         gda_312[li_16] = 0.0;
         gda_308[li_16] = 0.0;
      }
   }
   for (int li_36 = li_24; li_36 >= 0; li_36--) {
      ld_52 = iLow(NULL, a_timeframe_0, iLowest(NULL, a_timeframe_0, MODE_LOW, ai_4, li_36));
      if (ld_52 == ld_92) ld_52 = 0.0;
      else {
         ld_92 = ld_52;
         if (iLow(NULL, a_timeframe_0, li_36) - ld_52 > ai_8 * Point) ld_52 = 0.0;
         else {
            for (int li_40 = 1; li_40 <= ai_12; li_40++) {
               ld_60 = gda_312[li_36 + li_40];
               if (ld_60 != 0.0 && ld_60 > ld_52) gda_312[li_36 + li_40] = 0.0;
            }
         }
      }
      if (iLow(NULL, a_timeframe_0, li_36) == ld_52) gda_312[li_36] = ld_52;
      else gda_312[li_36] = 0.0;
      ld_52 = iHigh(NULL, a_timeframe_0, iHighest(NULL, a_timeframe_0, MODE_HIGH, ai_4, li_36));
      if (ld_52 == ld_84) ld_52 = 0.0;
      else {
         ld_84 = ld_52;
         if (ld_52 - iHigh(NULL, a_timeframe_0, li_36) > ai_8 * Point) ld_52 = 0.0;
         else {
            for (li_40 = 1; li_40 <= ai_12; li_40++) {
               ld_60 = gda_308[li_36 + li_40];
               if (ld_60 != 0.0 && ld_60 < ld_52) gda_308[li_36 + li_40] = 0.0;
            }
         }
      }
      if (iHigh(NULL, a_timeframe_0, li_36) == ld_52) gda_308[li_36] = ld_52;
      else gda_308[li_36] = 0.0;
   }
   if (li_32 == 0) {
      ld_92 = 0;
      ld_84 = 0;
   } else {
      ld_92 = ld_68;
      ld_84 = ld_76;
   }
   for (li_36 = li_24; li_36 >= 0; li_36--) {
      ld_60 = 0.0;
      switch (li_32) {
      case 0:
         if (ld_92 == 0.0 && ld_84 == 0.0) {
            if (gda_308[li_36] != 0.0) {
               ld_84 = iHigh(NULL, a_timeframe_0, li_36);
               li_44 = li_36;
               li_32 = -1;
               gda_304[li_36] = ld_84;
               ld_60 = 1;
            }
            if (gda_312[li_36] != 0.0) {
               ld_92 = iLow(NULL, a_timeframe_0, li_36);
               li_48 = li_36;
               li_32 = 1;
               gda_304[li_36] = ld_92;
               ld_60 = 1;
            }
         }
         break;
      case 1:
         if (gda_312[li_36] != 0.0 && gda_312[li_36] < ld_92 && gda_308[li_36] == 0.0) {
            gda_304[li_48] = 0.0;
            li_48 = li_36;
            ld_92 = gda_312[li_36];
            gda_304[li_36] = ld_92;
            ld_60 = 1;
         }
         if (gda_308[li_36] != 0.0 && gda_312[li_36] == 0.0) {
            ld_84 = gda_308[li_36];
            li_44 = li_36;
            gda_304[li_36] = ld_84;
            li_32 = -1;
            ld_60 = 1;
         }
         break;
      case -1:
         if (gda_308[li_36] != 0.0 && gda_308[li_36] > ld_84 && gda_312[li_36] == 0.0) {
            gda_304[li_44] = 0.0;
            li_44 = li_36;
            ld_84 = gda_308[li_36];
            gda_304[li_36] = ld_84;
         }
         if (gda_312[li_36] != 0.0 && gda_308[li_36] == 0.0) {
            ld_92 = gda_312[li_36];
            li_48 = li_36;
            gda_304[li_36] = ld_92;
            li_32 = 1;
         }
         break;
      default:
         return/*(WARN)*/;
      }
   }
   return (0);
}

void CreateRectangle(string a_name_0, double ad_8, double ad_16, int a_datetime_24, int a_datetime_28, color a_color_32, int a_width_36 = 1, int a_style_40 = 0) {
   ObjectCreate(a_name_0, OBJ_RECTANGLE, 0, 0, 0, 0, 0);
   ObjectSet(a_name_0, OBJPROP_TIME1, a_datetime_24);
   ObjectSet(a_name_0, OBJPROP_TIME2, a_datetime_28);
   ObjectSet(a_name_0, OBJPROP_PRICE1, ad_8);
   ObjectSet(a_name_0, OBJPROP_PRICE2, ad_16);
   ObjectSet(a_name_0, OBJPROP_STYLE, a_style_40);
   ObjectSet(a_name_0, OBJPROP_WIDTH, a_width_36);
   ObjectSet(a_name_0, OBJPROP_COLOR, a_color_32);
   ObjectSet(a_name_0, OBJPROP_BACK, TRUE);
}
