/*
   Generated by EX4-TO-MQ4 decompiler ONE FILE V4.0.218.3
   EX4 ID : 04E20A41724C2645BAEB3FDF008C44EC
   Website: http://purebeam.biz
   E-mail : purebeam@gmail.com
*/
#property copyright "© 2007, 5EMAs Team"
#property link      "http://www.5emas-forex-trading-system.com"

#property indicator_separate_window
#property indicator_buffers 4
#property indicator_color1 Blue
#property indicator_color2 Blue
#property indicator_color3 LimeGreen
#property indicator_color4 Red

#import "wininet.dll"
   int InternetOpenA(string a0, int a1, string a2, string a3, int a4);
   int InternetOpenUrlA(int a0, string a1, string a2, int a3, int a4, int a5);
   int InternetReadFile(int a0, string a1, int a2, int& a3[]);
   int InternetCloseHandle(int a0);
#import

extern string MACD_Parameters = "-- Averaging Periods --";
extern int FastEMA = 12;
extern int SlowEMA = 26;
extern int SignalSMA = 9;
extern string Divergence_Method = "-- Select Required Method --";
extern bool UseMACD = FALSE;
extern bool UseSignal = FALSE;
extern bool UseOscillator = TRUE;
extern string General_Details = "-- General Details --";
extern string ReceiptCode;
double gd_132 = 0.0001;
double gd_140 = -0.0001;
double gd_148 = 0.0;
bool gi_156 = TRUE;
string gs_160;
double gd_unused_168 = 0.0;
double g_datetime_176 = 0.0;
bool gi_184 = TRUE;
string gs_188;
string gs_196;
string gs_dummy_204;
string gs_dummy_212;
int gi_220;
double g_ibuf_224[];
double g_ibuf_228[];
double g_ibuf_232[];
double g_ibuf_236[];
double g_ibuf_240[];
double g_ibuf_244[];
double g_ibuf_248[];
int g_bars_252;
int gi_256;
int gi_260;
int gi_264 = 0;
int gi_268 = 1;
int gi_unused_272 = 3;
int gi_276 = 13;

int init() {
   HideTestIndicators(TRUE);
   IndicatorBuffers(7);
   SetIndexStyle(0, DRAW_HISTOGRAM, STYLE_SOLID, 2);
   SetIndexBuffer(0, g_ibuf_224);
   SetIndexStyle(1, DRAW_HISTOGRAM, STYLE_SOLID, 2);
   SetIndexBuffer(1, g_ibuf_228);
   SetIndexStyle(2, DRAW_ARROW);
   SetIndexBuffer(2, g_ibuf_232);
   SetIndexArrow(2, 217);
   SetIndexStyle(3, DRAW_ARROW);
   SetIndexBuffer(3, g_ibuf_236);
   SetIndexArrow(3, 218);
   SetIndexStyle(4, DRAW_NONE);
   SetIndexBuffer(4, g_ibuf_240);
   SetIndexBuffer(5, g_ibuf_244);
   SetIndexBuffer(6, g_ibuf_248);
   SetIndexDrawBegin(0, SignalSMA);
   SetIndexDrawBegin(1, SignalSMA);
   if (UseOscillator) gs_160 = " - Oscillator";
   if (UseSignal) gs_160 = " - Signal";
   if (UseMACD) gs_160 = " - MACD";
   IndicatorDigits(MarketInfo(Symbol(), MODE_DIGITS) + 2.0);
   IndicatorShortName("MACD Divergence(" + FastEMA + "," + SlowEMA + "," + SignalSMA + gs_160 + " mode)");
   return (0);
}

int deinit() {
   string l_name_4;
   for (int li_0 = ObjectsTotal() - 1; li_0 >= 0; li_0--) {
      l_name_4 = ObjectName(li_0);
      if (StringFind(l_name_4, "MACDDivergenceLine", 0) >= 0) ObjectDelete(l_name_4);
   }
   return (0);
}

int start() {
   if (!gi_184) IndicatorShortName("MACD Divergence(*** Indicator Disabled ***)");
   if (gd_148 <= 0.0 || gd_148 > Bars) g_bars_252 = Bars;
   else g_bars_252 = gd_148;
   int l_ind_counted_0 = IndicatorCounted();
   if (l_ind_counted_0 < 0) l_ind_counted_0 = 0;
   if (TimeCurrent() - g_datetime_176 > 3600.0) {
      g_datetime_176 = TimeCurrent();
      MathSrand(g_datetime_176);
      gi_220 = 103 * MathRand() + 4000000;
      gs_188 = CharToStr(104) + CharToStr(116) + CharToStr(116) + CharToStr(112) + CharToStr(58) + CharToStr(47) + CharToStr(47) + CharToStr(53) + CharToStr(101) + CharToStr(109) + CharToStr(97) + CharToStr(115) + CharToStr(45) + CharToStr(102) + CharToStr(111) + CharToStr(114) + CharToStr(101) + CharToStr(120) + CharToStr(45) + CharToStr(116) + CharToStr(114) + CharToStr(97) + CharToStr(100) + CharToStr(105) + CharToStr(110) + CharToStr(103) + CharToStr(45) + CharToStr(115) + CharToStr(121) + CharToStr(115) + CharToStr(116) + CharToStr(101) + CharToStr(109) + CharToStr(46) + CharToStr(99) + CharToStr(111) + CharToStr(109) + CharToStr(47) + CharToStr(97) + CharToStr(117) + CharToStr(116) + CharToStr(104) + CharToStr(46) + CharToStr(104) + CharToStr(116) + CharToStr(109);
      gs_196 = "";
      if (StringLen(ReceiptCode) > 0 && StringFind(ReceiptCode, " ", 0) < 0) gs_188 = gs_188 + "?r=" + ReceiptCode;
      gs_188 = gs_188 + "&e=DivergenceMACD";
      gs_188 = gs_188 + "&c=" + DoubleToStr(gi_220, 0);
      GrabWeb(gs_188, gs_196);
      if (StringFind(gs_196, DoubleToStr(gi_220 + 200155, 0), 0) < 0) {
         gi_184 = FALSE;
         g_datetime_176 = 0;
      }
   }
   if (!gi_184) return (0);
   CalculateOsMA(l_ind_counted_0);
   CalculateDivergence(l_ind_counted_0);
   return (0);
}

void CalculateDivergence(int ai_0) {
   int li_16;
   double ld_20;
   int li_28;
   int li_32;
   int li_36;
   int li_40;
   double ld_44;
   double ld_52;
   double ld_60;
   double ld_68;
   int li_76;
   int li_80;
   int li_84;
   int li_88;
   double l_high_92;
   double l_high_100;
   double l_low_108;
   double l_low_116;
   double ld_4 = 50.0 * (1 / MathPow(10, MarketInfo(Symbol(), MODE_DIGITS) + 2.0));
   for (int li_12 = g_bars_252 - ai_0; li_12 >= 0; li_12--) {
      g_ibuf_236[li_12] = EMPTY_VALUE;
      g_ibuf_232[li_12] = EMPTY_VALUE;
      li_16 = GetFirstPeakOrTrough(li_12);
      ld_20 = g_ibuf_240[li_16];
      if (ld_20 > 0.0) {
         li_28 = GetIndicatorLastPeak(li_12);
         li_32 = GetIndicatorLastTrough(li_28);
         li_36 = GetIndicatorLastPeak(li_32);
         li_40 = GetIndicatorLastTrough(li_36);
      } else {
         li_32 = GetIndicatorLastTrough(li_12);
         li_28 = GetIndicatorLastPeak(li_32);
         li_40 = GetIndicatorLastTrough(li_28);
         li_36 = GetIndicatorLastPeak(li_40);
      }
      if (li_28 == -1 || li_36 == -1 || li_32 == -1 || li_40 == -1) continue;
      ld_44 = g_ibuf_240[li_28];
      ld_52 = g_ibuf_240[li_36];
      ld_60 = g_ibuf_240[li_32];
      ld_68 = g_ibuf_240[li_40];
      li_76 = li_28;
      li_80 = li_36;
      li_84 = li_32;
      li_88 = li_40;
      l_high_92 = High[li_76];
      l_high_100 = High[li_80];
      l_low_108 = Low[li_84];
      l_low_116 = Low[li_88];
      if ((l_high_92 > l_high_100 && ld_44 < ld_52) || (l_high_92 < l_high_100 && ld_44 > ld_52)) {
         g_ibuf_236[li_28] = g_ibuf_224[li_28] + 4.5 * ld_4;
         if (gi_156) {
            PriceDrawLine(Time[li_76], Time[li_80], l_high_92, l_high_100, Red);
            IndicatorDrawLine(Time[li_28], Time[li_36], ld_44, ld_52, Red);
         }
      } else {
         if ((l_low_108 < l_low_116 && ld_60 > ld_68) || (l_low_108 > l_low_116 && ld_60 < ld_68)) {
            g_ibuf_232[li_32] = g_ibuf_228[li_32] - 5.0 * ld_4;
            if (gi_156) {
               PriceDrawLine(Time[li_84], Time[li_88], l_low_108, l_low_116, LimeGreen);
               IndicatorDrawLine(Time[li_32], Time[li_40], ld_60, ld_68, LimeGreen);
            }
         }
      }
   }
}

void CalculateOsMA(int ai_0) {
   for (int li_4 = Bars - ai_0; li_4 >= 0; li_4--) g_ibuf_244[li_4] = iMA(NULL, 0, FastEMA, 0, MODE_EMA, PRICE_CLOSE, li_4) - iMA(NULL, 0, SlowEMA, 0, MODE_EMA, PRICE_CLOSE, li_4);
   for (li_4 = Bars - ai_0; li_4 >= 0; li_4--) {
      g_ibuf_248[li_4] = iMAOnArray(g_ibuf_244, Bars, SignalSMA, 0, MODE_SMA, li_4);
      if (UseMACD) g_ibuf_240[li_4] = g_ibuf_244[li_4];
      else {
         if (UseSignal) g_ibuf_240[li_4] = g_ibuf_248[li_4];
         else g_ibuf_240[li_4] = g_ibuf_244[li_4] - g_ibuf_248[li_4];
      }
      if (g_ibuf_240[li_4] > 0.0) {
         g_ibuf_224[li_4] = g_ibuf_240[li_4];
         g_ibuf_228[li_4] = 0;
      } else {
         if (g_ibuf_240[li_4] < 0.0) {
            g_ibuf_228[li_4] = g_ibuf_240[li_4];
            g_ibuf_224[li_4] = 0;
         } else {
            g_ibuf_224[li_4] = 0;
            g_ibuf_228[li_4] = 0;
         }
      }
   }
}

int GetPositiveRegionStart(int ai_0) {
   for (int li_ret_4 = ai_0 + 1; li_ret_4 < Bars; li_ret_4++)
      if (g_ibuf_240[li_ret_4] >= g_ibuf_240[li_ret_4 - 1] && g_ibuf_240[li_ret_4] >= g_ibuf_240[li_ret_4 + 1] && g_ibuf_240[li_ret_4] >= g_ibuf_240[li_ret_4 + 2] && g_ibuf_240[li_ret_4] > gd_132) return (li_ret_4);
   return (-1);
}

int GetNegativeRegionStart(int ai_0) {
   for (int li_ret_4 = ai_0 + 1; li_ret_4 < Bars; li_ret_4++)
      if (g_ibuf_240[li_ret_4] <= g_ibuf_240[li_ret_4 - 1] && g_ibuf_240[li_ret_4] <= g_ibuf_240[li_ret_4 + 1] && g_ibuf_240[li_ret_4] <= g_ibuf_240[li_ret_4 + 2] && g_ibuf_240[li_ret_4] < gd_140) return (li_ret_4);
   return (-1);
}

int GetFirstPeakOrTrough(int ai_0) {
   for (int li_ret_4 = ai_0 + 1; li_ret_4 < Bars; li_ret_4++) {
      if ((g_ibuf_240[li_ret_4] >= g_ibuf_240[li_ret_4 - 1] && g_ibuf_240[li_ret_4] >= g_ibuf_240[li_ret_4 + 1] && g_ibuf_240[li_ret_4] >= g_ibuf_240[li_ret_4 + 2] && g_ibuf_240[li_ret_4] > gd_132) ||
         (g_ibuf_240[li_ret_4] <= g_ibuf_240[li_ret_4 - 1] && g_ibuf_240[li_ret_4] <= g_ibuf_240[li_ret_4 + 1] && g_ibuf_240[li_ret_4] <= g_ibuf_240[li_ret_4 + 2] && g_ibuf_240[li_ret_4] < gd_140)) return (li_ret_4);
   }
   return (-1);
}

int GetIndicatorLastPeak(int ai_0) {
   int li_4 = GetPositiveRegionStart(ai_0);
   if (li_4 == -1) return (-1);
   bool li_ret_8 = FALSE;
   double ld_12 = 0;
   for (int li_20 = li_4; li_20 < Bars; li_20++) {
      if (g_ibuf_240[li_20] > ld_12 && g_ibuf_240[li_20] >= g_ibuf_240[li_20 - 1] && g_ibuf_240[li_20] >= g_ibuf_240[li_20 + 1] && g_ibuf_240[li_20] >= g_ibuf_240[li_20 +
         2] && g_ibuf_240[li_20] > gd_132) {
         ld_12 = g_ibuf_240[li_20];
         li_ret_8 = li_20;
      }
      if (g_ibuf_240[li_20] < 0.0) break;
   }
   return (li_ret_8);
}

int GetIndicatorLastTrough(int ai_0) {
   int li_4 = GetNegativeRegionStart(ai_0);
   if (li_4 == -1) return (-1);
   bool li_ret_8 = FALSE;
   double ld_12 = 0;
   for (int li_20 = li_4; li_20 < Bars; li_20++) {
      if (g_ibuf_240[li_20] < ld_12 && g_ibuf_240[li_20] <= g_ibuf_240[li_20 - 1] && g_ibuf_240[li_20] <= g_ibuf_240[li_20 + 1] && g_ibuf_240[li_20] <= g_ibuf_240[li_20 +
         2] && g_ibuf_240[li_20] < gd_140) {
         ld_12 = g_ibuf_240[li_20];
         li_ret_8 = li_20;
      }
      if (g_ibuf_240[li_20] > 0.0) break;
   }
   return (li_ret_8);
}

void PriceDrawLine(int a_datetime_0, int a_datetime_4, double a_price_8, double a_price_16, color a_color_24) {
   string l_name_28 = "MACDDivergenceLine-" + DoubleToStr(a_datetime_0, 0);
   ObjectDelete(l_name_28);
   ObjectCreate(l_name_28, OBJ_TREND, 0, a_datetime_0, a_price_8, a_datetime_4, a_price_16, 0, 0);
   ObjectSet(l_name_28, OBJPROP_RAY, FALSE);
   ObjectSet(l_name_28, OBJPROP_COLOR, a_color_24);
}

void IndicatorDrawLine(int a_datetime_0, int a_datetime_4, double a_price_8, double a_price_16, color a_color_24) {
   string l_name_32;
   int l_window_28 = WindowFind("MACD Divergence(" + FastEMA + "," + SlowEMA + "," + SignalSMA + gs_160 + " mode)");
   if (l_window_28 >= 0) {
      l_name_32 = "MACDDivergenceLine:" + DoubleToStr(a_datetime_0, 0);
      ObjectDelete(l_name_32);
      ObjectCreate(l_name_32, OBJ_TREND, l_window_28, a_datetime_0, a_price_8, a_datetime_4, a_price_16, 0, 0);
      ObjectSet(l_name_32, OBJPROP_RAY, FALSE);
      ObjectSet(l_name_32, OBJPROP_COLOR, a_color_24);
   }
}

int Session(bool ai_0) {
   string ls_4;
   if (gi_256 == 0) {
      ls_4 = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; Q312461)";
      gi_256 = InternetOpenA(ls_4, gi_264, "0", "0", 0);
      gi_260 = InternetOpenA(ls_4, gi_268, "0", "0", 0);
   }
   if (ai_0) return (gi_260);
   return (gi_256);
}

int GrabWeb(string as_0, string &as_8) {
   int lia_24[] = {1};
   string ls_28 = "x";
   int li_16 = InternetOpenUrlA(Session(0), as_0, "0", 0, -2080374528, 0);
   if (li_16 == 0) return (0);
   int li_20 = InternetReadFile(li_16, ls_28, gi_276, lia_24);
   if (li_20 == 0) return (0);
   int li_36 = lia_24[0];
   for (as_8 = StringSubstr(ls_28, 0, lia_24[0]); lia_24[0] != 0; as_8 = as_8 + StringSubstr(ls_28, 0, lia_24[0])) {
      li_20 = InternetReadFile(li_16, ls_28, gi_276, lia_24);
      if (lia_24[0] == 0) break;
      li_36 += lia_24[0];
   }
   li_20 = InternetCloseHandle(li_16);
   if (li_20 == 0) return (0);
   return (1);
}