/*
   Generated by EX4-TO-MQ4 decompiler V4.0.224.1 []
   Website: http://purebeam.biz
   E-mail : purebeam@gmail.com
*/

#property indicator_separate_window
#property indicator_maximum 1.2
#property indicator_buffers 6
#property indicator_color1 Black
#property indicator_color2 Lime
#property indicator_color3 Red
#property indicator_color4 Black
#property indicator_color5 Black
#property indicator_color6 Black

extern int PriceActionFilter = 1;
extern int Length = 3;
extern int MajorCycleStrength = 4;
extern bool UseCycleFilter = FALSE;
extern int UseFilterSMAorRSI = 1;
extern int FilterStrengthSMA = 12;
extern int FilterStrengthRSI = 21;
extern bool SoundAlert = TRUE;
extern bool WaitForClose = TRUE;
extern string note1 = "alert all = 0";
extern string note2 = "buy only = 1, sell only = 2";
extern int alertsOption = 0;
double g_ibuf_132[];
double g_ibuf_136[];
double g_ibuf_140[];
double g_ibuf_144[];
double g_ima_148 = 0.0;
double gd_156 = 0.0;
double gd_164 = 0.0;
double gd_172 = 0.0;
int gi_180 = 0;
int gi_184 = 0;
int gi_188 = 0;
int gi_192 = 0;
int gi_196 = 0;
int gi_unused_200 = 0;
int gi_unused_204 = 0;
int gi_unused_208 = 0;
int gi_unused_212 = 0;
double g_applied_price_216 = 0.0;
double g_applied_price_224 = 0.0;
int gi_232 = 1;
int gi_236 = 1;
double g_applied_price_240 = 0.0;
double g_applied_price_248 = 0.0;
int gi_256 = 0;
int gi_260 = 0;
bool gi_264 = TRUE;
bool gi_268 = FALSE;
bool gi_272 = FALSE;
bool gi_276 = FALSE;
bool gi_280 = FALSE;
int gi_284 = 1;
int gi_288;
int gi_300;
int gi_304;
int gi_308;
int gi_312 = 0;

int init() {
   IndicatorShortName("Bat");
   SetIndexStyle(0, DRAW_LINE, STYLE_SOLID, 2);
   SetIndexBuffer(0, g_ibuf_132);
   SetIndexStyle(1, DRAW_HISTOGRAM, STYLE_SOLID, 3);
   SetIndexBuffer(1, g_ibuf_136);
   SetIndexStyle(2, DRAW_HISTOGRAM, STYLE_SOLID, 3);
   SetIndexBuffer(2, g_ibuf_140);
   SetIndexStyle(3, DRAW_HISTOGRAM, STYLE_SOLID, 3);
   SetIndexStyle(4, DRAW_HISTOGRAM, STYLE_SOLID, 3);
   SetIndexStyle(5, DRAW_NONE);
   SetIndexBuffer(5, g_ibuf_144);
   SetIndexEmptyValue(1, 0.0);
   SetIndexEmptyValue(2, 0.0);
   SetIndexEmptyValue(3, 0.0);
   SetIndexEmptyValue(4, 0.0);
   SetIndexEmptyValue(5, 0.0);
   gi_304 = 0;
   gi_308 = 0;
   if (WaitForClose) gi_312 = 1;
   else gi_312 = 0;
   return (0);
}

int deinit() {
   return (0);
}

int start() {
   int l_count_32;
   int li_40;
   int li_44;
   double l_ima_48;
   double l_ima_56;
   double l_ima_64;
   double l_ima_72;
   string ls_80;
   int l_ind_counted_0 = IndicatorCounted();
   if (l_ind_counted_0 < 0) return (-1);
   int li_4 = Bars - l_ind_counted_0;
   if (li_4 < 0) li_4 = 0;
   int li_8 = 250;
   double ld_12 = 0.0;
   double ld_20 = 0.0;
   for (int li_28 = li_4; li_28 >= 0; li_28--) {
      ld_20 = 0.0;
      l_count_32 = 0;
      for (int l_count_36 = 0; l_count_36 < li_8; l_count_36++) {
         l_count_32++;
         li_40 = li_28 + l_count_36;
         if (li_40 >= Bars) break;
         ld_20 += High[li_40] - Low[li_40];
      }
      ld_12 = ld_20 / l_count_32 * Length;
      li_44 = Bars - li_28;
      if (li_44 < 0) li_44 = 0;
      g_ima_148 = iMA(NULL, 0, PriceActionFilter, 0, MODE_SMMA, PRICE_CLOSE, li_28);
      if (UseFilterSMAorRSI == 1) g_ibuf_144[li_28] = ZeroLag(g_ima_148, FilterStrengthSMA, li_28);
      if (UseFilterSMAorRSI == 2) g_ibuf_144[li_28] = ZeroLag(iRSI(NULL, 0, 14, g_ima_148, FilterStrengthRSI), FilterStrengthRSI, li_28);
      if (g_ibuf_144[li_28] > g_ibuf_144[li_28 + 1]) gi_196 = 1;
      if (g_ibuf_144[li_28] < g_ibuf_144[li_28 + 1]) gi_196 = 2;
      if (li_44 <= 1) {
         if (gd_156 == 0.0) gd_164 = ld_12;
         else gd_164 = gd_156;
         g_applied_price_216 = g_ima_148;
         g_applied_price_240 = g_ima_148;
      }
      if (li_44 > 1) {
         if (gi_180 > -1) {
            if (g_ima_148 < g_applied_price_216) {
               if (UseCycleFilter && gi_196 == 2 && gi_268) g_ibuf_132[li_28 + li_44 - gi_232] = 0;
               if (!UseCycleFilter && gi_268) g_ibuf_132[li_28 + li_44 - gi_232] = 0;
               g_applied_price_216 = g_ima_148;
               gi_232 = li_44;
               gi_268 = TRUE;
            } else {
               if (g_ima_148 > g_applied_price_216) {
                  gi_188 = li_44 - gi_232;
                  if (!UseCycleFilter) g_ibuf_132[li_28 + gi_188] = -1;
                  if (UseCycleFilter && gi_196 == 1) {
                     g_ibuf_132[li_28 + gi_188] = -1;
                     gi_unused_200 = 1;
                  } else gi_unused_200 = 0;
                  gi_268 = TRUE;
                  l_ima_48 = iMA(NULL, 0, PriceActionFilter, 0, MODE_SMMA, PRICE_CLOSE, li_28 + gi_188);
                  if (gi_264) gi_288 = g_ima_148 - l_ima_48 >= gd_164;
                  else gi_288 = g_ima_148 >= l_ima_48 * (gd_164 / 1000.0 + 1.0);
                  if (gi_288 && gi_188 >= gi_284) {
                     gi_180 = -1;
                     g_applied_price_240 = g_ima_148;
                     gi_256 = li_44;
                     gi_276 = FALSE;
                     gi_268 = FALSE;
                  }
               }
            }
         }
         if (gi_180 < 1) {
            if (g_ima_148 > g_applied_price_240) {
               if (UseCycleFilter && gi_196 == 1 && gi_276) g_ibuf_132[li_28 + li_44 - gi_256] = 0;
               if (!UseCycleFilter && gi_276) g_ibuf_132[li_28 + li_44 - gi_256] = 0;
               g_applied_price_240 = g_ima_148;
               gi_256 = li_44;
               gi_276 = TRUE;
            } else {
               if (g_ima_148 < g_applied_price_240) {
                  gi_188 = li_44 - gi_256;
                  if (!UseCycleFilter) g_ibuf_132[li_28 + gi_188] = 1;
                  if (UseCycleFilter && gi_196 == 2) {
                     g_ibuf_132[li_28 + gi_188] = 1;
                     gi_unused_200 = 2;
                  } else gi_unused_200 = 0;
                  gi_276 = TRUE;
                  l_ima_56 = iMA(NULL, 0, PriceActionFilter, 0, MODE_SMMA, PRICE_CLOSE, li_28 + gi_188);
                  if (gi_264) gi_288 = l_ima_56 - g_ima_148 >= gd_164;
                  else gi_288 = g_ima_148 <= l_ima_56 * (1 - gd_164 / 1000.0);
                  if (gi_288 && gi_188 >= gi_284) {
                     gi_180 = 1;
                     g_applied_price_216 = g_ima_148;
                     gi_232 = li_44;
                     gi_276 = FALSE;
                     gi_268 = FALSE;
                  }
               }
            }
         }
      }
      g_ibuf_132[li_28] = 0;
      if (li_44 == 1) {
         if (gd_156 == 0.0) gd_172 = ld_12 * MajorCycleStrength;
         else gd_172 = gd_156 * MajorCycleStrength;
         g_applied_price_224 = g_ima_148;
         g_applied_price_248 = g_ima_148;
      }
      if (li_44 > 1) {
         if (gi_184 > -1) {
            if (g_ima_148 < g_applied_price_224) {
               if (UseCycleFilter && gi_196 == 2 && gi_272) g_ibuf_136[li_28 + li_44 - gi_236] = 0;
               if (!UseCycleFilter && gi_272) g_ibuf_136[li_28 + li_44 - gi_236] = 0;
               g_applied_price_224 = g_ima_148;
               gi_236 = li_44;
               gi_272 = TRUE;
            } else {
               if (g_ima_148 > g_applied_price_224) {
                  gi_192 = li_44 - gi_236;
                  if (!UseCycleFilter) g_ibuf_136[li_28 + gi_192] = -1;
                  if (UseCycleFilter && gi_196 == 1) {
                     g_ibuf_136[li_28 + gi_192] = -1;
                     gi_unused_204 = 1;
                  } else gi_unused_204 = 0;
                  gi_272 = TRUE;
                  l_ima_64 = iMA(NULL, 0, PriceActionFilter, 0, MODE_SMMA, PRICE_CLOSE, li_28 + gi_192);
                  if (gi_264) gi_300 = g_ima_148 - l_ima_64 >= gd_172;
                  else gi_300 = g_ima_148 >= l_ima_64 * (gd_172 / 1000.0 + 1.0);
                  if (gi_300 && gi_192 >= gi_284) {
                     gi_184 = -1;
                     g_applied_price_248 = g_ima_148;
                     gi_260 = li_44;
                     gi_280 = FALSE;
                     gi_272 = FALSE;
                  }
               }
            }
         }
         if (gi_184 < 1) {
            if (g_ima_148 > g_applied_price_248) {
               if (UseCycleFilter && gi_196 == 1 && gi_280) g_ibuf_140[li_28 + li_44 - gi_260] = 0;
               if (!UseCycleFilter && gi_280) g_ibuf_140[li_28 + li_44 - gi_260] = 0;
               g_applied_price_248 = g_ima_148;
               gi_260 = li_44;
               gi_280 = TRUE;
            } else {
               if (g_ima_148 < g_applied_price_248) {
                  gi_192 = li_44 - gi_260;
                  if (!UseCycleFilter) g_ibuf_140[li_28 + gi_192] = 1;
                  if (UseCycleFilter && gi_196 == 2) {
                     g_ibuf_140[li_28 + gi_192] = 1;
                     gi_unused_204 = 2;
                  } else gi_unused_204 = 0;
                  gi_280 = TRUE;
                  l_ima_72 = iMA(NULL, 0, PriceActionFilter, 0, MODE_SMMA, PRICE_CLOSE, li_28 + gi_192);
                  if (gi_264) gi_300 = l_ima_72 - g_ima_148 >= gd_172;
                  else gi_300 = g_ima_148 <= l_ima_72 * (1.0 - gd_172 / 1000.0);
                  if (gi_300 && gi_192 >= gi_284) {
                     gi_184 = 1;
                     g_applied_price_224 = g_ima_148;
                     gi_236 = li_44;
                     gi_280 = FALSE;
                     gi_272 = FALSE;
                  }
               }
            }
         }
      }
      g_ibuf_132[li_28] = 0;
      g_ibuf_140[li_28] = 0;
      g_ibuf_136[li_28] = 0;
   }
   if (SoundAlert) {
      if (Period() == PERIOD_M1) ls_80 = "1 MIN";
      if (Period() == PERIOD_M5) ls_80 = "5 MIN";
      if (Period() == PERIOD_M15) ls_80 = "15 MIN";
      if (Period() == PERIOD_M30) ls_80 = "30 MIN";
      if (Period() == PERIOD_H1) ls_80 = "1 HR";
      if (Period() == PERIOD_H4) ls_80 = "4 HR";
      if (Period() == PERIOD_D1) ls_80 = "DAILY";
      if (Period() == PERIOD_W1) ls_80 = "WEEKLY";
      if (Period() == PERIOD_MN1) ls_80 = "MONTHLY";
      if (alertsOption == 0) {
         if (g_ibuf_132[gi_312] == 1.0 && gi_304 < Time[gi_312]) {
            Alert(Symbol(), ls_80, ", Cycle Top Detected");
            gi_304 = Time[gi_312];
         }
      }
      if (g_ibuf_132[gi_312] == -1.0 && gi_308 < Time[gi_312]) {
         Alert(Symbol(), ls_80, ", Cycle Bottom Detected");
         gi_308 = Time[gi_312];
      }
      if (alertsOption == 1) {
         if (g_ibuf_132[gi_312] == -1.0 && gi_308 < Time[gi_312]) {
            Alert(Symbol(), ls_80, ", Cycle Bottom Detected");
            gi_308 = Time[gi_312];
         }
      }
      if (alertsOption == 2) {
         if (g_ibuf_132[gi_312] == 1.0 && gi_304 < Time[gi_312]) {
            Alert(Symbol(), ls_80, ", Cycle Top Detected");
            gi_304 = Time[gi_312];
         }
      }
   }
   return (0);
}

double ZeroLag(double ad_0, int ai_8, int ai_12) {
   if (ai_8 < 3) return (ad_0);
   double ld_16 = MathExp(-4.44220826 / ai_8);
   double ld_24 = 2.0 * ld_16 * MathCos(254.52 / ai_8);
   double ld_32 = ld_24;
   double ld_40 = (-ld_16) * ld_16;
   double ld_48 = 1 - ld_32 - ld_40;
   double ld_ret_56 = ld_48 * ad_0 + ld_32 * (g_ibuf_144[ai_12 + 1]) + ld_40 * (g_ibuf_144[ai_12 + 2]);
   return (ld_ret_56);
}