/*
   Generated by EX4-TO-MQ4 decompiler V4.0.224.1 []
   Website: http://purebeam.biz
   E-mail : purebeam@gmail.com
*/

#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Lime
#property indicator_color2 Yellow
#property indicator_color3 Red

int gi_76 = 20;
int gi_80 = 0;
int g_ma_method_84 = MODE_LWMA;
int g_applied_price_88 = PRICE_CLOSE;
double gd_92 = 2.0;
bool gi_100 = TRUE;
int gi_104 = 48;
int gi_108 = 38;
bool gi_112 = FALSE;
bool gi_116 = FALSE;
bool gi_120 = FALSE;
bool gi_124 = FALSE;
double g_ibuf_128[];
double g_ibuf_132[];
double g_ibuf_136[];
double g_ibuf_140[];
int gi_144;
string gs_148;
int g_time_156 = 0;

string GetTimeFrameStr() {
   string l_timeframe_4;
   switch (Period()) {
   case PERIOD_M1:
      l_timeframe_4 = "M1";
      break;
   case PERIOD_M5:
      l_timeframe_4 = "M5";
      break;
   case PERIOD_M15:
      l_timeframe_4 = "M15";
      break;
   case PERIOD_M30:
      l_timeframe_4 = "M30";
      break;
   case PERIOD_H1:
      l_timeframe_4 = "H1";
      break;
   case PERIOD_H4:
      l_timeframe_4 = "H4";
      break;
   case PERIOD_D1:
      l_timeframe_4 = "D1";
      break;
   case PERIOD_W1:
      l_timeframe_4 = "W1";
      break;
   case PERIOD_MN1:
      l_timeframe_4 = "MN1";
      break;
   default:
      l_timeframe_4 = Period();
   }
   return (l_timeframe_4);
}

int init() {
   IndicatorBuffers(4);
   if (!SetIndexBuffer(0, g_ibuf_128) && !SetIndexBuffer(1, g_ibuf_132) && !SetIndexBuffer(2, g_ibuf_136) && !SetIndexBuffer(3, g_ibuf_140)) Print("cannot set indicator buffers!");
   if (gi_100) {
      SetIndexStyle(0, DRAW_ARROW);
      SetIndexStyle(1, DRAW_ARROW);
      SetIndexStyle(2, DRAW_ARROW);
      SetIndexArrow(0, 3);
      SetIndexArrow(1, 3);
      SetIndexArrow(2, 3);
   } else {
      SetIndexStyle(0, DRAW_LINE);
      SetIndexStyle(1, DRAW_LINE);
      SetIndexStyle(2, DRAW_LINE);
   }
   gi_144 = gi_76 + MathFloor(MathSqrt(gi_76));
   SetIndexDrawBegin(0, gi_144);
   SetIndexDrawBegin(1, gi_144);
   SetIndexDrawBegin(2, gi_144);
   IndicatorDigits(MarketInfo(Symbol(), MODE_DIGITS) + 1.0);
   IndicatorShortName("Trend(" + gi_76 + ")");
   SetIndexLabel(0, "Trend");
   gs_148 = Symbol() + " (" + GetTimeFrameStr() + "):  ";
   return (0);
}

int start() {
   double l_ima_on_arr_20;
   int li_8 = IndicatorCounted();
   if (li_8 < 1) {
      for (int li_4 = 1; li_4 <= gi_144; li_4++) g_ibuf_140[Bars - li_4] = 0;
      for (li_4 = 1; li_4 <= gi_76; li_4++) {
         g_ibuf_128[Bars - li_4] = 0;
         g_ibuf_132[Bars - li_4] = 0;
         g_ibuf_136[Bars - li_4] = 0;
      }
   }
   if (li_8 > 0) li_8--;
   int li_0 = Bars - li_8;
   for (li_4 = 0; li_4 < li_0; li_4++) g_ibuf_140[li_4] = 2.0 * iMA(NULL, 0, MathFloor(gi_76 / gd_92), gi_80, g_ma_method_84, g_applied_price_88, li_4) - iMA(NULL, 0, gi_76, gi_80, g_ma_method_84, g_applied_price_88, li_4);
   double l_ima_on_arr_12 = iMAOnArray(g_ibuf_140, 0, MathFloor(MathSqrt(gi_76)), 0, g_ma_method_84, 0);
   for (li_4 = 1; li_4 < li_0; li_4++) {
      l_ima_on_arr_20 = iMAOnArray(g_ibuf_140, 0, MathFloor(MathSqrt(gi_76)), 0, g_ma_method_84, li_4);
      if (l_ima_on_arr_20 > l_ima_on_arr_12) {
         g_ibuf_128[li_4] = EMPTY_VALUE;
         g_ibuf_132[li_4] = EMPTY_VALUE;
         g_ibuf_136[li_4] = l_ima_on_arr_20;
         g_ibuf_136[li_4 - 1] = l_ima_on_arr_12;
      } else {
         if (l_ima_on_arr_20 < l_ima_on_arr_12) {
            g_ibuf_128[li_4] = l_ima_on_arr_20;
            g_ibuf_128[li_4 - 1] = l_ima_on_arr_12;
            g_ibuf_132[li_4] = EMPTY_VALUE;
            g_ibuf_136[li_4] = EMPTY_VALUE;
         } else {
            g_ibuf_128[li_4] = -1;
            g_ibuf_132[li_4] = l_ima_on_arr_20;
            g_ibuf_136[li_4 - 1] = l_ima_on_arr_12;
            g_ibuf_136[li_4] = -1;
         }
      }
      if (gi_112) {
         if (l_ima_on_arr_20 < l_ima_on_arr_12) {
            if (!gi_120) {
               if (BarChanged()) {
                  Alert(gs_148 + "HMA " + aRperiodf() + " Alert\nBUY signal @ Ask = $", Ask, "; Bid = $", Bid, 
                  "\nDate & Time = ", TimeToStr(TimeCurrent(), TIME_DATE), " ", TimeHour(TimeCurrent()), ":", TimeMinute(TimeCurrent()));
                  PlaySound("alert.wav");
                  if (gi_116) {
                     SendMail(gs_148, "HMA Alert\nBUY signal @ Ask = $" + DoubleToStr(Ask, 4) + ", Bid = $" + DoubleToStr(Bid, 4) + ", Date & Time = " + TimeToStr(TimeCurrent(), TIME_DATE) +
                        " " + TimeHour(TimeCurrent()) + ":" + TimeMinute(TimeCurrent()) + "  Stop:  " + DoubleToStr(aGetSLl(), 4) + "  Limit:  " + DoubleToStr(aGetTPl(), 4));
                  }
               }
               gi_120 = TRUE;
               gi_124 = FALSE;
            }
         }
         if (l_ima_on_arr_20 > l_ima_on_arr_12) {
            if (!gi_124) {
               if (BarChanged()) {
                  Alert(gs_148 + "HMA Alert\nSELL signal @ Ask = $", Ask, "; Bid = $", Bid, 
                  "\nDate & Time = ", TimeToStr(TimeCurrent(), TIME_DATE), " ", TimeHour(TimeCurrent()), ":", TimeMinute(TimeCurrent()));
                  PlaySound("alert.wav");
                  if (gi_116) {
                     SendMail(gs_148, "HMA Alert\nSELL signal @ Ask = $" + DoubleToStr(Ask, 4) + ", Bid = $" + DoubleToStr(Bid, 4) + ", Date & Time = " + TimeToStr(TimeCurrent(), TIME_DATE) +
                        " " + TimeHour(TimeCurrent()) + ":" + TimeMinute(TimeCurrent()) + "  Stop:  " + DoubleToStr(aGetSLs(), 4) + "  Limit:  " + DoubleToStr(aGetTPs(), 4));
                  }
               }
               gi_124 = TRUE;
               gi_120 = FALSE;
            }
         }
      }
      l_ima_on_arr_12 = l_ima_on_arr_20;
   }
   return (0);
}

bool BarChanged() {
   if (g_time_156 != Time[0]) {
      g_time_156 = Time[0];
      return (TRUE);
   }
   return (FALSE);
}

double aGetTPs() {
   return (Bid - gi_104 * Point);
}

double aGetTPl() {
   return (Ask + gi_104 * Point);
}

double aGetSLs() {
   return (Bid + gi_108 * Point);
}

double aGetSLl() {
   return (Ask - gi_108 * Point);
}

int aRperiodf() {
   return (10000.0 * (gi_76 * Point));
}