#property indicator_chart_window
#property indicator_buffers 6
#property indicator_color1 Green
#property indicator_color2 Gray
#property indicator_color3 Green
#property indicator_color4 Gray
#property indicator_color5 Green
#property indicator_color6 Gray



int gperiod_76 = 30;
int gi_80 = 1;
double gd_84 = 1.0;
int gi_92 = 1;
int gi_96 = 1;
extern int Nbars = 1000;
extern bool eMailAlerts_On = FALSE;
double gibuf_108[];
double gibuf_112[];
double gibuf_116[];
double gibuf_120[];
double gibuf_124[];
double gibuf_128[];
extern bool SoundON = TRUE;
bool gi_136 = FALSE;
bool gi_140 = FALSE;

int init() {

   SetIndexBuffer(0, gibuf_108);
   SetIndexBuffer(1, gibuf_112);
   SetIndexBuffer(2, gibuf_116);
   SetIndexBuffer(3, gibuf_120);
   SetIndexBuffer(4, gibuf_124);
   SetIndexBuffer(5, gibuf_128);
   SetIndexStyle(0, DRAW_ARROW, STYLE_SOLID, 1);
   SetIndexStyle(1, DRAW_ARROW, STYLE_SOLID, 1);
   SetIndexStyle(2, DRAW_ARROW, STYLE_SOLID, 1);
   SetIndexStyle(3, DRAW_ARROW, STYLE_SOLID, 1);
   SetIndexStyle(4, DRAW_LINE, STYLE_SOLID, 1);
   SetIndexStyle(5, DRAW_LINE, STYLE_SOLID, 1);
   SetIndexArrow(0, 158);
   SetIndexArrow(1, 158);
   SetIndexArrow(2, 217);
   SetIndexArrow(3, 218);
   IndicatorDigits(MarketInfo(Symbol(), MODE_DIGITS));
   string ls_0 = "ProFX01(" + gperiod_76 + "," + gi_80 + ")";
   IndicatorShortName(ls_0);
   SetIndexLabel(0, "UpTrend Stop");
   SetIndexLabel(1, "DownTrend Stop");
   SetIndexLabel(2, "UpTrend Signal");
   SetIndexLabel(3, "DownTrend Signal");
   SetIndexLabel(4, "UpTrend Line");
   SetIndexLabel(5, "DownTrend Line");
   SetIndexDrawBegin(0, gperiod_76);
   SetIndexDrawBegin(1, gperiod_76);
   SetIndexDrawBegin(2, gperiod_76);
   SetIndexDrawBegin(3, gperiod_76);
   SetIndexDrawBegin(4, gperiod_76);
   SetIndexDrawBegin(5, gperiod_76);
   return (0);
}

string GetPeriodStr(int ai_0) {
   string ls_ret_4;
   if (ai_0 == 1) ls_ret_4 = "M1";
   if (ai_0 == 5) ls_ret_4 = "M5";
   if (ai_0 == 15) ls_ret_4 = "M15";
   if (ai_0 == 30) ls_ret_4 = "M30";
   if (ai_0 == 60) ls_ret_4 = "H1";
   if (ai_0 == 240) ls_ret_4 = "H4";
   if (ai_0 == 1440) ls_ret_4 = "D1";
   if (ai_0 == 10080) ls_ret_4 = "W1";
   if (ai_0 == 43200) ls_ret_4 = "MN1";
   return (ls_ret_4);
}

int start() {
   int li_12;
   double lda_16[25000];
   double lda_20[25000];
   double lda_24[25000];
   double lda_28[25000];

   ObjectCreate("IndName", OBJ_LABEL, 0, 0, 0);
   ObjectSet("IndName", OBJPROP_CORNER, 2);
   ObjectSet("IndName", OBJPROP_XDISTANCE, 3);
   ObjectSet("IndName", OBJPROP_YDISTANCE, 3);
   ObjectSet("IndName", OBJPROP_BACK, TRUE);
   ObjectSetText("IndName", "", 9, "Times New Roman", White);
   for (int lshift_8 = Nbars; lshift_8 >= 0; lshift_8--) {
      gibuf_108[lshift_8] = 0;
      gibuf_112[lshift_8] = 0;
      gibuf_116[lshift_8] = 0;
      gibuf_120[lshift_8] = 0;
      gibuf_124[lshift_8] = EMPTY_VALUE;
      gibuf_128[lshift_8] = EMPTY_VALUE;
   }
   for (lshift_8 = Nbars - gperiod_76 - 1; lshift_8 >= 0; lshift_8--) {
      lda_16[lshift_8] = iBands(NULL, 0, gperiod_76, gi_80, 0, PRICE_CLOSE, MODE_UPPER, lshift_8);
      lda_20[lshift_8] = iBands(NULL, 0, gperiod_76, gi_80, 0, PRICE_CLOSE, MODE_LOWER, lshift_8);
      if (Close[lshift_8] > lda_16[lshift_8 + 1]) li_12 = 1;
      if (Close[lshift_8] < lda_20[lshift_8 + 1]) li_12 = -1;
      if (li_12 > 0 && lda_20[lshift_8] < lda_20[lshift_8 + 1]) lda_20[lshift_8] = lda_20[lshift_8 + 1];
      if (li_12 < 0 && lda_16[lshift_8] > lda_16[lshift_8 + 1]) lda_16[lshift_8] = lda_16[lshift_8 + 1];
      lda_24[lshift_8] = lda_16[lshift_8] + (gd_84 - 1.0) / 2.0 * (lda_16[lshift_8] - lda_20[lshift_8]);
      lda_28[lshift_8] = lda_20[lshift_8] - (gd_84 - 1.0) / 2.0 * (lda_16[lshift_8] - lda_20[lshift_8]);
      if (li_12 > 0 && lda_28[lshift_8] < lda_28[lshift_8 + 1]) lda_28[lshift_8] = lda_28[lshift_8 + 1];
      if (li_12 < 0 && lda_24[lshift_8] > lda_24[lshift_8 + 1]) lda_24[lshift_8] = lda_24[lshift_8 + 1];
      if (li_12 > 0) {
         if (gi_92 > 0 && gibuf_108[lshift_8 + 1] == -1.0) {
            gibuf_116[lshift_8] = lda_28[lshift_8];
            gibuf_108[lshift_8] = lda_28[lshift_8];
            if (gi_96 > 0) gibuf_124[lshift_8] = lda_28[lshift_8];
            if (SoundON == TRUE && lshift_8 == 0 && !gi_136) {
               Alert("ProFx Alert UP", Symbol(), "-", Period());
               if (eMailAlerts_On) SendMail("ProFx Alert", "ProFx Alert UP - " + Symbol() + " - " + GetPeriodStr(Period()));
               gi_136 = TRUE;
               gi_140 = FALSE;
            }
         } else {
            gibuf_108[lshift_8] = lda_28[lshift_8];
            if (gi_96 > 0) gibuf_124[lshift_8] = lda_28[lshift_8];
            gibuf_116[lshift_8] = -1;
         }
         if (gi_92 == 2) gibuf_108[lshift_8] = 0;
         gibuf_120[lshift_8] = -1;
         gibuf_112[lshift_8] = -1.0;
         gibuf_128[lshift_8] = EMPTY_VALUE;
      }
      if (li_12 < 0) {
         if (gi_92 > 0 && gibuf_112[lshift_8 + 1] == -1.0) {
            gibuf_120[lshift_8] = lda_24[lshift_8];
            gibuf_112[lshift_8] = lda_24[lshift_8];
            if (gi_96 > 0) gibuf_128[lshift_8] = lda_24[lshift_8];
            if (SoundON == TRUE && lshift_8 == 0 && !gi_140) {
               Alert("ProFx Alert DOWN", Symbol(), "-", Period());
               if (eMailAlerts_On) SendMail("ProFx Alert", "ProFx Alert DOWN - " + Symbol() + " - " + GetPeriodStr(Period()));
               gi_140 = TRUE;
               gi_136 = FALSE;
            }
         } else {
            gibuf_112[lshift_8] = lda_24[lshift_8];
            if (gi_96 > 0) gibuf_128[lshift_8] = lda_24[lshift_8];
            gibuf_120[lshift_8] = -1;
         }
         if (gi_92 == 2) gibuf_112[lshift_8] = 0;
         gibuf_116[lshift_8] = -1;
         gibuf_108[lshift_8] = -1.0;
         gibuf_124[lshift_8] = EMPTY_VALUE;
      }
   }
   return (0);
}

int deinit() {
   ObjectDelete("IndName");

   return (0);
}