/*
   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 3
#property indicator_color1 Orange
#property indicator_color2 LimeGreen
#property indicator_color3 Red
#property indicator_width1 2
#property indicator_level1 20.0
#property indicator_width2 2
#property indicator_level2 80.0

#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 Stochastic_Parameters = "-- Averaging Periods --";
extern int KPeriod = 8;
extern int DPeriod = 3;
extern int Slowing = 3;
extern string Divergence_Method = "-- Select Required Method --";
extern bool UseMain = FALSE;
extern bool UseSignal = TRUE;
extern string General_Details = "-- General Details --";
extern string ReceiptCode;
double gd_unused_128 = 0.0;
double g_datetime_136 = 0.0;
bool gi_144 = TRUE;
string gs_148;
string gs_156;
string gs_dummy_164;
string gs_dummy_172;
int gi_180;
double gd_184 = 0.0001;
double gd_192 = -0.0001;
double gd_200 = 0.0;
bool gi_208 = TRUE;
string gs_212;
double g_ibuf_220[];
double g_ibuf_224[];
double g_ibuf_228[];
double g_ibuf_232[];
double g_ibuf_236[];
double g_ibuf_240[];
int g_bars_244;
int gi_248;
int gi_252;
int gi_256 = 0;
int gi_260 = 1;
int gi_unused_264 = 3;
int gi_268 = 13;

int init() {
   HideTestIndicators(TRUE);
   IndicatorBuffers(6);
   SetIndexStyle(0, DRAW_LINE, STYLE_SOLID, 2);
   SetIndexBuffer(0, g_ibuf_228);
   SetIndexStyle(1, DRAW_ARROW);
   SetIndexBuffer(1, g_ibuf_220);
   SetIndexArrow(1, 217);
   SetIndexStyle(2, DRAW_ARROW);
   SetIndexBuffer(2, g_ibuf_224);
   SetIndexArrow(2, 218);
   SetIndexBuffer(3, g_ibuf_232);
   SetIndexBuffer(4, g_ibuf_236);
   SetIndexBuffer(5, g_ibuf_240);
   SetIndexDrawBegin(0, KPeriod + DPeriod);
   if (UseSignal) gs_212 = " - Signal";
   if (UseMain) gs_212 = " - Main";
   IndicatorDigits(MarketInfo(Symbol(), MODE_DIGITS) + 2.0);
   IndicatorShortName("Stochastic Divergence(" + KPeriod + "," + DPeriod + "," + Slowing + gs_212 + " 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, "StochasticDivergenceLine", 0) >= 0) ObjectDelete(l_name_4);
   }
   return (0);
}

int start() {
   if (!gi_144) IndicatorShortName("Stochastic Divergence(*** Indicator Disabled ***)");
   if (gd_200 <= 0.0 || gd_200 > Bars) g_bars_244 = Bars;
   else g_bars_244 = gd_200;
   int l_ind_counted_0 = IndicatorCounted();
   if (l_ind_counted_0 < 0) l_ind_counted_0 = 0;
   if (TimeCurrent() - g_datetime_136 > 3600.0) {
      g_datetime_136 = TimeCurrent();
      MathSrand(g_datetime_136);
      gi_180 = 103 * MathRand() + 4000000;
      gs_148 = 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_156 = "";
      if (StringLen(ReceiptCode) > 0 && StringFind(ReceiptCode, " ", 0) < 0) gs_148 = gs_148 + "?r=" + ReceiptCode;
      gs_148 = gs_148 + "&e=DivergenceStochastic";
      gs_148 = gs_148 + "&c=" + DoubleToStr(gi_180, 0);
      GrabWeb(gs_148, gs_156);
      if (StringFind(gs_156, DoubleToStr(gi_180 + 200155, 0), 0) < 0) {
         gi_144 = FALSE;
         g_datetime_136 = 0;
      }
   }
   if (!gi_144) 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 = 1;
   for (int li_12 = g_bars_244 - ai_0; li_12 >= 0; li_12--) {
      g_ibuf_224[li_12] = EMPTY_VALUE;
      g_ibuf_220[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_228[li_28];
      ld_52 = g_ibuf_228[li_36];
      ld_60 = g_ibuf_228[li_32];
      ld_68 = g_ibuf_228[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_224[li_28] = g_ibuf_228[li_28] + 5.0 * ld_4;
         if (gi_208) {
            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_220[li_32] = g_ibuf_228[li_32] - 5.0 * ld_4;
            if (gi_208) {
               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 l_shift_4 = Bars - ai_0; l_shift_4 >= 0; l_shift_4--) {
      g_ibuf_232[l_shift_4] = iStochastic(NULL, 0, KPeriod, DPeriod, Slowing, MODE_EMA, 0, MODE_MAIN, l_shift_4);
      g_ibuf_236[l_shift_4] = iStochastic(NULL, 0, KPeriod, DPeriod, Slowing, MODE_EMA, 0, MODE_SIGNAL, l_shift_4);
      if (UseMain) {
         g_ibuf_228[l_shift_4] = g_ibuf_232[l_shift_4];
         g_ibuf_240[l_shift_4] = g_ibuf_232[l_shift_4] - 50.0;
      } else {
         g_ibuf_228[l_shift_4] = g_ibuf_236[l_shift_4];
         g_ibuf_240[l_shift_4] = g_ibuf_236[l_shift_4] - 50.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_184) 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_192) 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_184) ||
         (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_192)) 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_184) {
         ld_12 = g_ibuf_240[li_20];
         li_ret_8 = li_20;
      }
      if (g_ibuf_240[li_20] < gd_184) 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_192) {
         ld_12 = g_ibuf_240[li_20];
         li_ret_8 = li_20;
      }
      if (g_ibuf_240[li_20] > gd_192) 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 = "StochasticDivergenceLine-" + 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("Stochastic Divergence(" + KPeriod + "," + DPeriod + "," + Slowing + gs_212 + " mode)");
   if (l_window_28 >= 0) {
      l_name_32 = "StochasticDivergenceLine:" + 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_248 == 0) {
      ls_4 = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; Q312461)";
      gi_248 = InternetOpenA(ls_4, gi_256, "0", "0", 0);
      gi_252 = InternetOpenA(ls_4, gi_260, "0", "0", 0);
   }
   if (ai_0) return (gi_252);
   return (gi_248);
}

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_268, 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_268, 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);
}
