/*
   Generated by EX4-TO-MQ4 decompiler LITE V4.0.409.1m [-]
   Website: https://purebeam.biz
   E-mail : purebeam@gmail.com
*/
#property copyright "Copyright © 2011 Forex-indikatoren.com."
#property link      "http://www.forex-indikatoren.com"

#property indicator_separate_window
#property indicator_minimum 0.0
#property indicator_maximum 3.0
#property indicator_buffers 4
#property indicator_color1 Blue
#property indicator_color2 Red
#property indicator_color3 Blue
#property indicator_color4 Red

extern int M1 = 5;
extern int M5 = 5;
extern int M15 = 5;
extern int M30 = 5;
extern int H1 = 4;
extern int H4 = 3;
extern int D1 = 3;
int gi_104 = 3;
int gi_108 = 3;
int gi_112 = 14;
int gi_116 = 3;
int gi_120 = 3;
int gi_124 = MODE_SMA;
int gi_128 = 0;
int gi_132 = 0;
int gi_136 = 6;
int gi_140 = 12;
int gi_144 = 4;
int gi_148 = PRICE_CLOSE;
double gda_152[];
double gda_156[];
double gda_160[];
double gda_164[];
int gi_168 = 3;
int gi_172 = 3;
string gs_176 = "Filter System";
string gs_184 = "FPL2_";

int init() {
   IndicatorBuffers(6);
   SetIndexBuffer(0, gda_152);
   SetIndexStyle(0, DRAW_ARROW, EMPTY, 0);
   SetIndexArrow(0, 110);
   SetIndexBuffer(1, gda_156);
   SetIndexStyle(1, DRAW_ARROW, EMPTY, 0);
   SetIndexArrow(1, 110);
   SetIndexBuffer(2, gda_160);
   SetIndexStyle(2, DRAW_ARROW, EMPTY, 0);
   SetIndexArrow(2, 110);
   SetIndexBuffer(3, gda_164);
   SetIndexStyle(3, DRAW_ARROW, EMPTY, 0);
   SetIndexArrow(3, 110);
   IndicatorShortName("Filter System");
   IndicatorDigits(0);
   f0_2();
   f0_1(Period());
   return (0);
}

int deinit() {
   f0_2();
   return (0);
}

int start() {
   int lia_0[];
   int li_4;
   int li_8;
   int li_16;
   int li_12 = 0;
   int li_20 = 1440;
   int li_24 = 10080;
   if (f0_0()) {
      li_20 = f0_4(gi_168);
      li_24 = f0_4(gi_172);
      li_16 = IndicatorCounted();
      if (gi_132 == FALSE && li_16 > 1) li_16 = 0;
      ArrayCopySeries(lia_0, 5, Symbol(), li_20);
      li_8 = Bars - li_16 + li_20 / Period();
      li_4 = 0;
      for (li_12 = 0; li_4 < li_8; li_4++) {
         if (Time[li_4] < lia_0[li_12]) li_12++;
         if (iStochastic(NULL, li_20, gi_112, gi_116, gi_120, gi_124, gi_128, MODE_MAIN, li_12) > iStochastic(NULL, li_20, gi_112, gi_116, gi_120, gi_124, gi_128, MODE_SIGNAL,
            li_12)) {
            gda_152[li_4] = 2;
            gda_156[li_4] = EMPTY_VALUE;
         } else {
            gda_152[li_4] = EMPTY_VALUE;
            gda_156[li_4] = 2;
         }
      }
      ArrayInitialize(lia_0, 0);
      ArrayCopySeries(lia_0, 5, Symbol(), li_24);
      li_8 = Bars - li_16 + li_24 / Period();
      li_4 = 0;
      for (li_12 = 0; li_4 < li_8; li_4++) {
         if (Time[li_4] < lia_0[li_12]) li_12++;
         if (iMACD(NULL, li_24, gi_136, gi_140, gi_144, gi_148, MODE_MAIN, li_12) > iMACD(NULL, li_24, gi_136, gi_140, gi_144, gi_148, MODE_SIGNAL, li_12)) {
            gda_160[li_4] = 1;
            gda_164[li_4] = EMPTY_VALUE;
         } else {
            gda_160[li_4] = EMPTY_VALUE;
            gda_164[li_4] = 1;
         }
      }
      f0_2();
      ObjectCreate(gs_184 + "SF1", OBJ_TEXT, 1, f0_3(-2), 2.4);
      ObjectSetText(gs_184 + "SF1", "SF1", 8, "Arial", White);
      ObjectCreate(gs_184 + "SF2", OBJ_TEXT, 1, f0_3(-2), 1.4);
      ObjectSetText(gs_184 + "SF2", "SF2", 8, "Arial", White);
      gi_132 = TRUE;
   }
   return (0);
}

bool f0_0() {
   int li_0 = AccountNumber();
   if (AccountNumber() == li_0 || AccountNumber() == li_0) return (TRUE);
   return (FALSE);
}

void f0_2() {
   for (int li_0 = 0; li_0 < ObjectsTotal(); li_0++) {
      if (StringFind(ObjectName(li_0), gs_184) == 0) {
         ObjectDelete(ObjectName(li_0));
         li_0--;
      }
   }
}

int f0_3(int ai_0) {
   if (ai_0 < 0) return (Time[0] - 60 * (ai_0 * Period()));
   return (Time[ai_0]);
}

int f0_4(int ai_0) {
   int li_4;
   int lia_8[];
   int lia_12[] = {1, 5, 15, 30, 60, 240, 1440, 10080, 43200};
   int lia_16[] = {5, 15, 30, 60, 240, 1440, 10080, 43200};
   int lia_20[] = {15, 30, 60, 240, 1440, 10080, 43200};
   int lia_24[] = {30, 60, 240, 1440, 10080, 43200};
   int lia_28[] = {60, 240, 1440, 10080, 43200};
   int lia_32[] = {240, 1440, 10080, 43200};
   int lia_36[] = {1440, 10080, 43200};
   int lia_40[] = {10080, 43200};
   int lia_44[] = {43200};
   switch (Period()) {
   case PERIOD_M1:
      ArrayResize(lia_8, ArraySize(lia_12));
      ArrayCopy(lia_8, lia_12);
      break;
   case PERIOD_M5:
      ArrayResize(lia_8, ArraySize(lia_16));
      ArrayCopy(lia_8, lia_16);
      break;
   case PERIOD_M15:
      ArrayResize(lia_8, ArraySize(lia_20));
      ArrayCopy(lia_8, lia_20);
      break;
   case PERIOD_M30:
      ArrayResize(lia_8, ArraySize(lia_24));
      ArrayCopy(lia_8, lia_24);
      break;
   case PERIOD_H1:
      ArrayResize(lia_8, ArraySize(lia_28));
      ArrayCopy(lia_8, lia_28);
      break;
   case PERIOD_H4:
      ArrayResize(lia_8, ArraySize(lia_32));
      ArrayCopy(lia_8, lia_32);
      break;
   case PERIOD_D1:
      ArrayResize(lia_8, ArraySize(lia_36));
      ArrayCopy(lia_8, lia_36);
      break;
   case PERIOD_W1:
      ArrayResize(lia_8, ArraySize(lia_40));
      ArrayCopy(lia_8, lia_40);
      break;
   case PERIOD_MN1:
      ArrayResize(lia_8, ArraySize(lia_44));
      ArrayCopy(lia_8, lia_44);
   }
   if (ai_0 <= 0) li_4 = lia_8[0];
   else {
      if (ai_0 > ArraySize(lia_8)) li_4 = lia_8[ArraySize(lia_8) - 1];
      else li_4 = lia_8[ai_0 - 1];
   }
   return (li_4);
}

void f0_1(int ai_0) {
   switch (ai_0) {
   case 1:
      gi_168 = M1;
      gi_172 = M1;
      return;
   case 5:
      gi_168 = M5;
      gi_172 = M5;
      return;
   case 15:
      gi_168 = M15;
      gi_172 = M15;
      return;
   case 30:
      gi_168 = M30;
      gi_172 = M30;
      return;
   case 60:
      gi_168 = H1;
      gi_172 = H1;
      return;
   case 240:
      gi_168 = H4;
      gi_172 = H4;
      return;
   case 1440:
      gi_168 = D1;
      gi_172 = D1;
      return;
   case 10080:
      gi_168 = gi_104;
      gi_172 = gi_104;
      return;
   case 43200: break;
      break;
   default:
      break;
   }
   gi_168 = gi_108;
   gi_172 = gi_108;
}