#property copyright "Copyright © 2009."
#property link      "http://www.iforex-indicators.com"

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 White
#property indicator_color2 White

extern bool Show_Alert = TRUE;
extern bool Display_Bearish_Engulfing = TRUE;
extern bool Display_Three_Outside_Down = TRUE;
extern bool Display_Three_Inside_Down = TRUE;
extern bool Display_Dark_Cloud_Cover = TRUE;
extern bool Display_Three_Black_Crows = TRUE;
extern bool Display_Bullish_Engulfing = TRUE;
extern bool Display_Three_Outside_Up = TRUE;
extern bool Display_Three_Inside_Up = TRUE;
extern bool Display_Piercing_Line = TRUE;
extern bool Display_Three_White_Soldiers = TRUE;
extern bool Display_Stars = TRUE;
extern bool Display_Harami = TRUE;
double G_ibuf_128[];
double G_ibuf_132[];
string Gsa_136[5000];
datetime G_time_140 = 0;

int init() {
   SetIndexStyle(0, DRAW_ARROW, STYLE_SOLID, 1);
   SetIndexArrow(0, SYMBOL_ARROWDOWN);
   SetIndexBuffer(0, G_ibuf_132);
   SetIndexStyle(1, DRAW_ARROW, STYLE_SOLID, 1);
   SetIndexArrow(1, SYMBOL_ARROWUP);
   SetIndexBuffer(1, G_ibuf_128);
   return (0);
}

int deinit() {
   ObjectsDeleteAll(0, OBJ_TEXT);
   return (0);
}

int start() {
   double Ld_0;
   double Ld_8;
   int Li_16;
   bool Li_20;
   int Li_28;
   int Li_32;
   int Li_36;
   string Ls_40;
   string Ls_48;
   double open_72;
   double open_80;
   double open_88;
   double close_96;
   double close_104;
   double close_112;
   double low_120;
   double low_128;
   double low_136;
   double high_144;
   double high_152;
   double high_160;
   int Li_unused_56 = 0;
   int Li_unused_60 = 0;
   if (G_time_140 == Time[0]) return (0);
   G_time_140 = Time[0];
   switch (Period()) {
   case PERIOD_M1:
      Ls_48 = "M1";
      break;
   case PERIOD_M5:
      Ls_48 = "M5";
      break;
   case PERIOD_M15:
      Ls_48 = "M15";
      break;
   case PERIOD_M30:
      Ls_48 = "M30";
      break;
   case PERIOD_H1:
      Ls_48 = "H1";
      break;
   case PERIOD_H4:
      Ls_48 = "H4";
      break;
   case PERIOD_D1:
      Ls_48 = "D1";
      break;
   case PERIOD_W1:
      Ls_48 = "W1";
      break;
   case PERIOD_MN1:
      Ls_48 = "MN";
   }
   for (int index_172 = 0; index_172 < Bars; index_172++) Gsa_136[index_172] = "pattern-" + index_172;
   for (int index_24 = 0; index_24 < Bars; index_24++) {
      Li_20 = FALSE;
      Li_16 = index_24;
      Ld_0 = 0;
      Ld_8 = 0;
      for (Li_16 = index_24; Li_16 <= index_24 + 9; Li_16++) Ld_8 += MathAbs(High[Li_16] - Low[Li_16]);
      Ld_0 = Ld_8 / 10.0;
      Li_28 = index_24 + 1;
      Li_32 = index_24 + 2;
      Li_36 = index_24 + 3;
      open_72 = Open[Li_28];
      open_80 = Open[Li_32];
      open_88 = Open[Li_36];
      high_144 = High[Li_28];
      high_152 = High[Li_32];
      high_160 = High[Li_36];
      low_120 = Low[Li_28];
      low_128 = Low[Li_32];
      low_136 = Low[Li_36];
      close_96 = Close[Li_28];
      close_104 = Close[Li_32];
      close_112 = Close[Li_36];
      if (close_104 > open_80 && open_72 > close_96 && open_72 >= close_104 && open_80 >= close_96 && open_72 - close_96 > close_104 - open_80) {
         if (Display_Bearish_Engulfing == TRUE) {
            ObjectCreate(Gsa_136[index_24], OBJ_TEXT, 0, Time[Li_28], High[Li_28] + 1.5 * Ld_0);
            ObjectSetText(Gsa_136[index_24], "Bearish Engulfing pattern", 10, "Arial", White);
            G_ibuf_132[Li_28] = High[Li_28] + Ld_0 / 2.0;
         }
         if (Li_20 == FALSE && Show_Alert == TRUE) {
            Ls_40 = "Bearish Engulfing pattern";
            Li_20 = TRUE;
         }
      }
      if (close_112 > open_88 && open_80 > close_104 && open_80 >= close_112 && open_88 >= close_104 && open_80 - close_104 > close_112 - open_88 && open_72 > close_96 &&
         close_96 < close_104) {
         if (Display_Three_Outside_Down == TRUE) {
            ObjectCreate(Gsa_136[index_24], OBJ_TEXT, 0, Time[Li_28], Low[Li_28] - 1.5 * Ld_0);
            ObjectSetText(Gsa_136[index_24], "Three Outside Down pattern", 10, "Arial", White);
            G_ibuf_128[Li_28] = Low[Li_28] - Ld_0 / 2.0;
         }
         if (Li_20 == FALSE && Show_Alert == TRUE) {
            Ls_40 = "Three Outside Down pattern";
            Li_20 = TRUE;
         }
      }
      if (close_104 > open_80 && (close_104 + open_80) / 2.0 > close_96 && open_72 > close_96 && open_72 > close_104 && close_96 > open_80 && (open_72 - close_96) / (high_144 - low_120 +
         0.001) > 0.6) {
         if (Display_Dark_Cloud_Cover == TRUE) {
            ObjectCreate(Gsa_136[index_24], OBJ_TEXT, 0, Time[Li_28], High[Li_28] + 1.5 * Ld_0);
            ObjectSetText(Gsa_136[index_24], "Dark Cloud Cover pattern", 10, "Arial", White);
            G_ibuf_132[Li_28] = High[Li_28] + Ld_0 / 2.0;
         }
         if (Li_20 == FALSE && Show_Alert == TRUE) {
            Ls_40 = "Dark Cloud Cover pattern";
            Li_20 = TRUE;
         }
      }
      if (close_112 > open_88 && (close_112 - open_88) / (high_160 + 0.001 - low_136) > 0.6 && close_112 < open_80 && close_104 > open_80 && high_152 - low_128 > 3.0 * (close_104 - open_80) &&
         open_72 > close_96 && open_72 < open_80) {
         if (Display_Stars == TRUE) {
            ObjectCreate(Gsa_136[index_24], OBJ_TEXT, 0, Time[Li_28], High[Li_28] + 1.5 * Ld_0);
            ObjectSetText(Gsa_136[index_24], "Evening Doji Star pattern", 10, "Arial", White);
            G_ibuf_132[Li_28] = High[Li_28] + Ld_0 / 2.0;
         }
         if (Li_20 == FALSE && Show_Alert == TRUE) {
            Ls_40 = "Evening Doji Star pattern";
            Li_20 = TRUE;
         }
      }
      if (close_104 > open_80 && open_72 > close_96 && open_72 <= close_104 && open_80 <= close_96 && open_72 - close_96 < close_104 - open_80) {
         if (Display_Harami == TRUE) {
            ObjectCreate(Gsa_136[index_24], OBJ_TEXT, 0, Time[Li_28], High[Li_28] + 1.5 * Ld_0);
            ObjectSetText(Gsa_136[index_24], "Bearish Harami pattern", 10, "Arial", White);
            G_ibuf_132[Li_28] = High[Li_28] + Ld_0 / 2.0;
         }
         if (index_24 == 0 && Show_Alert == TRUE) {
            Ls_40 = "Bearish Harami pattern";
            Li_20 = TRUE;
         }
      }
      if (close_112 > open_88 && open_80 > close_104 && open_80 <= close_112 && open_88 <= close_104 && open_80 - close_104 < close_112 - open_88 && open_72 > close_96 &&
         close_96 < close_104 && open_72 < open_80) {
         if (Display_Three_Inside_Down == TRUE) {
            ObjectCreate(Gsa_136[index_24], OBJ_TEXT, 0, Time[Li_28], High[Li_28] + 1.5 * Ld_0);
            ObjectSetText(Gsa_136[index_24], "Three Inside Down pattern", 10, "Arial", White);
            G_ibuf_132[Li_28] = High[Li_28] + Ld_0 / 2.0;
         }
         if (index_24 == 0 && Show_Alert == TRUE) {
            Ls_40 = "Three Inside Down pattern";
            Li_20 = TRUE;
         }
      }
      if (open_72 > 1.01 * close_96 && open_80 > 1.01 * close_104 && open_88 > 1.01 * close_112 && close_96 < close_104 && close_104 < close_112 && open_72 > close_104 &&
         open_72 < open_80 && open_80 > close_112 && open_80 < open_88 && (close_96 - low_120) / (high_144 - low_120) < 0.2 && (close_104 - low_128) / (high_152 - low_128) < 0.2 && (close_112 - low_136) / (high_160 - low_136) < 0.2) {
         if (Display_Three_Black_Crows == TRUE) {
            ObjectCreate(Gsa_136[index_24], OBJ_TEXT, 0, Time[Li_28], High[Li_28] + 1.5 * Ld_0);
            ObjectSetText(Gsa_136[index_24], "Three Black Crows pattern", 10, "Arial", White);
            G_ibuf_132[Li_28] = High[Li_28] + Ld_0 / 2.0;
         }
         if (index_24 == 0 && Show_Alert == TRUE) {
            Ls_40 = "Three Black Crows pattern";
            Li_20 = TRUE;
         }
      }
      if (close_112 > open_88 && (close_112 - open_88) / (high_160 + 0.001 - low_136) > 0.6 && close_112 < open_80 && close_104 > open_80 && high_152 - low_128 > 3.0 * (close_104 - open_80) &&
         open_72 > close_96 && open_72 < open_80) {
         if (Display_Stars == TRUE) {
            ObjectCreate(Gsa_136[index_24], OBJ_TEXT, 0, Time[Li_28], High[Li_28] + 1.5 * Ld_0);
            ObjectSetText(Gsa_136[index_24], "Evening Star Pattern", 10, "Arial", White);
            G_ibuf_132[Li_28] = High[Li_28] + Ld_0 / 2.0;
         }
         if (index_24 == 0 && Show_Alert == TRUE) {
            Ls_40 = "Evening Star Pattern";
            Li_20 = TRUE;
         }
      }
      if (open_80 > close_104 && close_96 > open_72 && close_96 >= open_80 && close_104 >= open_72 && close_96 - open_72 > open_80 - close_104) {
         if (Display_Bullish_Engulfing) {
            ObjectCreate(Gsa_136[index_24], OBJ_TEXT, 0, Time[Li_28], Low[Li_28] - 1.5 * Ld_0);
            ObjectSetText(Gsa_136[index_24], "Bullish Engulfing pattern", 10, "Arial", White);
            G_ibuf_128[Li_28] = Low[Li_28] - Ld_0 / 2.0;
         }
         if (index_24 == 0 && Show_Alert == TRUE) {
            Ls_40 = "Bullish Engulfing pattern";
            Li_20 = TRUE;
         }
      }
      if (open_88 > close_112 && close_104 > open_80 && close_104 >= open_88 && close_112 >= open_80 && close_104 - open_80 > open_88 - close_112 && close_96 > open_72 &&
         close_96 > close_104) {
         if (Display_Three_Outside_Up == TRUE) {
            ObjectCreate(Gsa_136[index_24], OBJ_TEXT, 0, Time[Li_28], Low[Li_28] - 1.5 * Ld_0);
            ObjectSetText(Gsa_136[index_24], "Three Outside Up pattern", 10, "Arial", White);
            G_ibuf_128[Li_28] = Low[Li_28] - Ld_0 / 2.0;
         }
         if (index_24 == 0 && Show_Alert == TRUE) {
            Ls_40 = "Three Outside Up pattern";
            Li_20 = TRUE;
         }
      }
      if (open_80 > close_104 && close_96 > open_72 && close_96 <= open_80 && close_104 <= open_72 && close_96 - open_72 < open_80 - close_104) {
         if (Display_Harami == TRUE) {
            ObjectCreate(Gsa_136[index_24], OBJ_TEXT, 0, Time[Li_28], Low[Li_28] - 1.5 * Ld_0);
            ObjectSetText(Gsa_136[index_24], "Bullish Harami pattern", 10, "Arial", White);
            G_ibuf_128[Li_28] = Low[Li_28] - Ld_0 / 2.0;
         }
         if (index_24 == 0 && Show_Alert == TRUE) {
            Ls_40 = "Bullish Harami pattern";
            Li_20 = TRUE;
         }
      }
      if (open_88 > close_112 && close_104 > open_80 && close_104 <= open_88 && close_112 <= open_80 && close_104 - open_80 < open_88 - close_112 && close_96 > open_72 &&
         close_96 > close_104 && open_72 > open_80) {
         if (Display_Three_Inside_Up == TRUE) {
            ObjectCreate(Gsa_136[index_24], OBJ_TEXT, 0, Time[Li_28], Low[Li_28] - 1.5 * Ld_0);
            ObjectSetText(Gsa_136[index_24], "Three Inside Up pattern", 10, "Arial", White);
            G_ibuf_128[Li_28] = Low[Li_28] - Ld_0 / 2.0;
         }
         if (index_24 == 0 && Show_Alert == TRUE) {
            Ls_40 = "Three Inside Up pattern";
            Li_20 = TRUE;
         }
      }
      if (close_104 < open_80 && (open_80 + close_104) / 2.0 < close_96 && open_72 < close_96 && open_72 < close_104 && close_96 < open_80 && (close_96 - open_72) / (high_144 - low_120 +
         0.001) > 0.6) {
         if (Display_Piercing_Line == TRUE) {
            ObjectCreate(Gsa_136[index_24], OBJ_TEXT, 0, Time[Li_28], Low[Li_28] - 1.5 * Ld_0);
            ObjectSetText(Gsa_136[index_24], "Piercing Line pattern", 10, "Arial", White);
            G_ibuf_128[Li_28] = Low[Li_28] - Ld_0 / 2.0;
         }
         if (index_24 == 0 && Show_Alert == TRUE) {
            Ls_40 = "Piercing Line pattern";
            Li_20 = TRUE;
         }
      }
      if (close_96 > 1.01 * open_72 && close_104 > 1.01 * open_80 && close_112 > 1.01 * open_88 && close_96 > close_104 && close_104 > close_112 && open_72 < close_104 &&
         open_72 > open_80 && open_80 < close_112 && open_80 > open_88 && (high_144 - close_96) / (high_144 - low_120) < 0.2 && (high_152 - close_104) / (high_152 - low_128) < 0.2 && (high_160 - close_112) / (high_160 - low_136) < 0.2) {
         if (Display_Three_White_Soldiers == TRUE) {
            ObjectCreate(Gsa_136[index_24], OBJ_TEXT, 0, Time[Li_28], Low[Li_28] - 1.5 * Ld_0);
            ObjectSetText(Gsa_136[index_24], "Three White Soldiers pattern", 10, "Arial", White);
            G_ibuf_128[Li_28] = Low[Li_28] - Ld_0 / 2.0;
         }
         if (index_24 == 0 && Show_Alert == TRUE) {
            Ls_40 = "Three White Soldiers pattern";
            Li_20 = TRUE;
         }
      }
      if (open_88 > close_112 && (open_88 - close_112) / (high_160 + 0.001 - low_136) > 0.6 && close_112 > open_80 && open_80 > close_104 && high_152 - low_128 > 3.0 * (close_104 - open_80) &&
         close_96 > open_72 && open_72 > open_80) {
         if (Display_Stars == TRUE) {
            ObjectCreate(Gsa_136[index_24], OBJ_TEXT, 0, Time[Li_28], Low[Li_28] - 1.5 * Ld_0);
            ObjectSetText(Gsa_136[index_24], "Morning Doji Star", 10, "Arial", White);
            G_ibuf_128[Li_28] = Low[Li_28] - Ld_0 / 2.0;
         }
         if (index_24 == 0 && Show_Alert == TRUE) {
            Ls_40 = "Morning Doji Star";
            Li_20 = TRUE;
         }
      }
      if (Li_20 == TRUE && index_24 == 0) {
         Alert(Symbol(), " ", Ls_48, " ", Ls_40);
         Li_20 = FALSE;
      }
   }
   return (0);
}