#property copyright "Old Tree Publishing"
#property link      "http://www.forexmastermethod.com/"

/*#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 note = " ======= Authentication SETTINGS ======";
extern string username = "";
extern string password = "";
extern string StochName = "Stoch(8,3,5)";
extern int StochKPeriod = 8;
extern int StochDPeriod = 3;
extern int StochSlowing = 5;
extern string MACDName = "MACD(12,26,9)";
extern string sTextPar = " ==== DIVERGENCE PAINTING SETTINGS ====";
extern bool StochBearish = TRUE;
extern bool StochBullish = TRUE;
extern bool MACDBearish = TRUE;
extern bool MACDBullish = TRUE;
extern bool ShowOnlyDouble = FALSE;
extern bool OnDoubleAlert = FALSE;
extern bool HiddenBearishAlert = FALSE;
extern bool RegularBearishAlert = FALSE;
extern bool HiddenBullishAlert = FALSE;
extern bool RegularBullishAlert = FALSE;
extern bool CustomStyles = FALSE;
extern color RegularBearish = Aqua;
extern int RegularBearishStyle = 0;
extern color HiddenBearish = Blue;
extern int HiddenBearishStyle = 1;
extern color RegularBullish = Red;
extern int RegularBullishStyle = 0;
extern color HiddenBullish = Orange;
extern int HiddenBullishStyle = 1;
extern color DoubleText = Yellow;
extern double MACDPickDif = 2.0;
extern string sTextv3 = " ====== V3 Settings ====== ";
extern int NrLoad = 10;
extern bool UseLineTrader = FALSE;
extern string sTextlt = " ====== LineTrader Settings ====== ";
extern string BuyAboveLineName = "BA";
extern color BuyAboveLineColor = Blue;
extern string BuyBelowLineName = "BB";
extern color BuyBelowLineColor = Blue;
extern string SellAboveLineName = "SA";
extern color SellAboveLineColor = Red;
extern string SellBelowLineName = "SB";
extern color SellBelowLineColor = Red;
extern color OnCompleteColor = Yellow;
extern string OnCompleteText = "DONE";
extern int PipsRangeFromLine = 3;
extern bool CheckAfterClose = TRUE;
extern bool OpenOrders = TRUE;
extern double LotSize = 0.1;
extern int StopLoss = 50;
extern int TakeProfit = 100;
extern int Slippage = 3;
extern int MagicNumber = 3596;
extern bool NotifyByAlert = TRUE;
int gio348 = 5;
int gio352 = 23;
int gio356 = 75;
bool gio360 = FALSE;
bool gio364 = FALSE;
int gio368 = 7;
int gocounto372 = 7;
int gio376 = 7;
int gio380 = 7;
int gio384 = 7;
int gio388 = 7;
int gocounto392 = 7;
int gocounto396 = 7;
int gocounto400 = 7;
int gocounto404 = 7;
int giao408[];
int giao412[];
int giao416[];
int giao420[];
int giao424[];
int giao428[];
int giao432[][4];
int giao436[][4];
double gopointo440;
double gdo448;
string gso456 = "";
string gso464 = "";
int goslippageo472;
int gostr2into476 = 0;
bool gio480 = FALSE;
bool gio484 = TRUE;
int giao488[64] = {65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47};
int gio492 = 1;
string gsodummyo496;
int gio504 = 0;
int gio508 = 0;
int gocounto512 = 0;
string gso516;
int giao524[1];
string gso532 = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000";
int goindexo540 = 0;
int goindexo544 = 0;
int gotimeo548 = 0;

int init() {
   int loobjsototalo4;
   string lonameo8;
   bool lio16;
   deleteoobjects();
   if (NrLoad > 80) NrLoad = 80;
   if (NrLoad < 7) NrLoad = 7;
   ArrayResize(giao408, NrLoad);
   ArrayResize(giao412, NrLoad);
   ArrayResize(giao416, NrLoad);
   ArrayResize(giao420, NrLoad);
   ArrayResize(giao424, NrLoad);
   ArrayResize(giao428, NrLoad);
   ArrayResize(giao432, NrLoad);
   ArrayResize(giao436, NrLoad);
   gostr2into476 = 0;
   gio480 = FALSE;
   gio484 = TRUE;
   if (Point == 0.00001) gopointo440 = 0.0001;
   else {
      if (Point == 0.001) gopointo440 = 0.01;
      else gopointo440 = Point;
   }
   goslippageo472 = Slippage * gopointo440 / Point;
   gdo448 = PipsRangeFromLine * gopointo440;
   if (gio484 == TRUE && gostr2into476 == 0) {
      gso456 = "\nTrade Locator v3\n authenticating...";
      Comment(gso456);
     
         gio480 = TRUE;
         gso456 = "\nTrade Locator v3\n working...";
      
         Comment(gso456);
    
      gio484 = FALSE;
   }
   if (gio480 == TRUE) {
      updateostockopicks(1, "stck_max", Blue);
      updateostockopicks(2, "stck_min", Red);
      updateomacdopicks(1, "macd_max", Blue);
      updateomacdopicks(2, "macd_min", Red);
      addBearish(0, 0, 0, 0, 1);
      addBullish(0, 0, 0, 0, 1);
      for (int lio0 = 0; lio0 < NrLoad - 3; lio0++) {
         if (StochBearish) {
            if (checkoSTDivobear(lio0, lio0 + 1) == 0) {
               if (checkoSTDivobear(lio0, lio0 + 2) == 0)
                  if (checkoSTDivobear(lio0, lio0 + 3) == 0) checkoSTDivobear(lio0, lio0 + 4);
            }
         }
         if (StochBullish) {
            if (checkoSTDivobull(lio0, lio0 + 1) == 0)
               if (checkoSTDivobull(lio0, lio0 + 2) == 0) checkoSTDivobull(lio0, lio0 + 3);
         }
         if (MACDBearish) {
            if (checkoMacdDivobear(lio0, lio0 + 1, 1, giao416) == 0)
               if (checkoMacdDivobear(lio0, lio0 + 2, 1, giao416) == 0) checkoMacdDivobear(lio0, lio0 + 3, 1, giao416);
         }
         if (MACDBullish) {
            if (checkoMacdDivobull(lio0, lio0 + 1, 1, giao420) == 0)
               if (checkoMacdDivobull(lio0, lio0 + 2, 1, giao420) == 0) checkoMacdDivobull(lio0, lio0 + 3, 1, giao420);
         }
      }
      checkHiddenBearish();
      checkBullish();
      if (ShowOnlyDouble) {
         lonameo8 = "";
         lio16 = TRUE;
         while (lio16) {
            lio16 = FALSE;
            loobjsototalo4 = ObjectsTotal();
            for (lio0 = 0; lio0 < loobjsototalo4; lio0++) {
               lonameo8 = ObjectName(lio0);
               if (StringFind(lonameo8, "RHMM") != -1 && StringFind(lonameo8, "RHMMDbl") == -1 && StringFind(lonameo8, "Macd") == -1 && StringFind(lonameo8, "Sto") == -1) {
                  ObjectDelete(lonameo8);
                  lio16 = TRUE;
               }
            }
         }
      }
   }
   return (0);
}

void updateostockopicks(int aio0, string aso4, color aocoloro12) {
   string lonameo16;
   int lowindowo24 = 0;
   lowindowo24 = WindowFind(StochName);
   int lio28 = 1;
   for (int loindexo32 = 0; loindexo32 < NrLoad; loindexo32++) {
      while (stockopeak(lio28) != aio0) lio28++;
      if (aio0 == 1) giao408[loindexo32] = lio28;
      if (aio0 == 2) giao412[loindexo32] = lio28;
      if (gio360) {
         lonameo16 = "RHMM" + aso4 + lio28;
         ObjectDelete(lonameo16);
         ObjectCreate(lonameo16, OBJ_ARROW, lowindowo24, Time[lio28], dStock(lio28));
         ObjectSet(lonameo16, OBJPROP_COLOR, aocoloro12);
         ObjectSet(lonameo16, OBJPROP_ARROWCODE, 119);
      }
      lio28 += 2;
   }
}

void updateomacdopicks(int aio0, string aso4, color aocoloro12) {
   string lonameo16;
   int lowindowo24 = WindowFind(MACDName);
   int lio28 = 1;
   bool lio36 = TRUE;
   int lio40 = aio0;
   if (aio0 > 2) {
      lio36 = FALSE;
      lio40 = aio0 - 2;
   }
   for (int loindexo32 = 0; loindexo32 < NrLoad; loindexo32++) {
      while (macdopeak(lio28, lio36) != lio40) lio28++;
      if (aio0 == 1) giao416[loindexo32] = lio28;
      if (aio0 == 2) giao420[loindexo32] = lio28;
      if (aio0 == 3) giao424[loindexo32] = lio28;
      if (aio0 == 4) giao428[loindexo32] = lio28;
      if (gio360) {
         lonameo16 = "RHMM" + aso4 + lio28;
         ObjectDelete(lonameo16);
         ObjectCreate(lonameo16, OBJ_ARROW, lowindowo24, Time[lio28], dMACD(lio28, lio36));
         ObjectSet(lonameo16, OBJPROP_COLOR, aocoloro12);
         ObjectSet(lonameo16, OBJPROP_ARROWCODE, 119);
      }
      lio28 += 2;
   }
}

double dMACD(int aio0, int aio4) {
   if (aio4 == 0) return (iCustom(Symbol(), 0, "MACD 2Line", 12, 26, 9, 0, aio0));
   if (aio4 == 1) {
      if (iCustom(Symbol(), 0, "MACD 2Line", 12, 26, 9, 2, aio0) != 0.0) return (iCustom(Symbol(), 0, "MACD 2Line", 12, 26, 9, 2, aio0));
      return (iCustom(Symbol(), 0, "MACD 2Line", 12, 26, 9, 3, aio0));
   }
   return (0.0);
}

int macdopeak(int aio0, int aio4) {
   double ldo8 = dMACD(aio0 - 1, aio4);
   double ldo16 = dMACD(aio0, aio4);
   double ldo24 = dMACD(aio0 + 1, aio4);
   double ldo32 = dMACD(aio0 + 2, aio4);
   if (ldo16 > ldo8 && ldo16 > ldo24 && ldo16 > ldo32) return (1);
   if (ldo16 < ldo8 && ldo16 < ldo24 && ldo16 < ldo32) return (2);
   return (0);
}

int checkoMacdDivobull(int aio0, int aio4, int aio8, int aiao12[]) {
   int lio16 = 0;
   int lio20 = 0;
   if (aiao12[aio4] - aiao12[aio0] < 5) return (0);
   if (MathAbs(dMACD(aiao12[aio0], aio8) - dMACD(aiao12[aio4], aio8)) < MACDPickDif * gopointo440) return (0);
   if (aio4 - aio0 > 1) {
      for (int lio24 = aio0 + 1; lio24 < aio4; lio24++) {
         if (dMACD(aiao12[aio0], aio8) > dMACD(aiao12[aio4], aio8) && dMACD(aiao12[lio24], aio8) < dMACD(aiao12[aio4], aio8)) return (0);
         if (dMACD(aiao12[aio0], aio8) > dMACD(aiao12[aio4], aio8) && dMACD(aiao12[lio24], aio8) < dMACD(aiao12[aio0], aio8)) return (0);
         if (dMACD(aiao12[aio0], aio8) < dMACD(aiao12[aio4], aio8) && dMACD(aiao12[lio24], aio8) < dMACD(aiao12[aio0], aio8)) return (0);
         if (dMACD(aiao12[aio0], aio8) < dMACD(aiao12[aio4], aio8) && dMACD(aiao12[lio24], aio8) < dMACD(aiao12[aio4], aio8)) return (0);
      }
   }
   int lio28 = WindowFind(MACDName);
   if (dMACD(aiao12[aio0], aio8) < dMACD(aiao12[aio4], aio8) && Low[aiao12[aio0]] > Low[aiao12[aio4]]) {
      lio16 = getominolow(aiao12[aio0]);
      lio20 = getominolow(aiao12[aio4]);
      if (Low[lio16] < Low[lio20]) return (0);
      if (lio20 - lio16 < 5) return (0);
      drawolineoind(aiao12[aio0], dMACD(aiao12[aio0], aio8), aiao12[aio4], dMACD(aiao12[aio4], aio8), "RHMM" + aio8 + "MacdSupport" + aiao12[aio0], HiddenBullish, 2, lio28, HiddenBullishStyle);
      drawoline(lio16, Low[lio16], lio20, Low[lio20], "RHMM" + aio8 + "MSupport_chart" + lio16, HiddenBullish, 2, HiddenBullishStyle);
      addBullish(lio16, lio20, aio8 + 1, 1);
      return (3);
   }
   if (dMACD(aiao12[aio0], aio8) > dMACD(aiao12[aio4], aio8) && Low[aiao12[aio0]] < Low[aiao12[aio4]]) {
      lio16 = getominolow(aiao12[aio0]);
      lio20 = getominolow(aiao12[aio4]);
      if (Low[lio16] > Low[lio20]) return (0);
      if (lio20 - lio16 < 5) return (0);
      drawolineoind(aiao12[aio0], dMACD(aiao12[aio0], aio8), aiao12[aio4], dMACD(aiao12[aio4], aio8), "RHMM" + aio8 + "Macd2Support" + aiao12[aio0], RegularBullish, 3, lio28, RegularBullishStyle);
      drawoline(lio16, Low[lio16], lio20, Low[lio20], "RHMM" + aio8 + "MSupport_chart" + lio16, RegularBullish, 3, RegularBullishStyle);
      addBullish(lio16, lio20, aio8 + 1, 3);
      return (4);
   }
   return (0);
}

int checkoMacdDivobear(int aio0, int aio4, int aio8, int aiao12[]) {
   int lio16 = 0;
   int lio20 = 0;
   if (aiao12[aio4] - aiao12[aio0] < 7) return (0);
   if (MathAbs(dMACD(aiao12[aio0], aio8) - dMACD(aiao12[aio4], aio8)) < MACDPickDif * gopointo440) return (0);
   if (aio4 - aio0 > 1) {
      for (int lio24 = aio0 + 1; lio24 < aio4; lio24++) {
         if (dMACD(aiao12[aio0], aio8) > dMACD(aiao12[aio4], aio8) && dMACD(aiao12[lio24], aio8) > dMACD(aiao12[aio4], aio8)) return (0);
         if (dMACD(aiao12[aio0], aio8) < dMACD(aiao12[aio4], aio8) && dMACD(aiao12[lio24], aio8) > dMACD(aiao12[aio0], aio8)) return (0);
      }
   }
   int lio28 = WindowFind(MACDName);
   if (dMACD(aiao12[aio0], aio8) < dMACD(aiao12[aio4], aio8) && High[aiao12[aio0]] > High[aiao12[aio4]]) {
      lio16 = getomaxohigh(aiao12[aio0]);
      lio20 = getomaxohigh(aiao12[aio4]);
      if (High[lio16] < High[lio20]) return (0);
      drawolineoind(aiao12[aio0], dMACD(aiao12[aio0], aio8), aiao12[aio4], dMACD(aiao12[aio4], aio8), "RHMMMacd" + aio8 + "Resistance" + aiao12[aio0], RegularBearish, 2, lio28, RegularBearishStyle);
      drawoline(lio16, High[lio16], lio20, High[lio20], "RHMMMResistance" + aio8 + "_chart" + lio16, RegularBearish, 2, RegularBearishStyle);
      addBearish(lio16, lio20, aio8 + 1, 1);
      return (1);
   }
   if (dMACD(aiao12[aio0], aio8) > dMACD(aiao12[aio4], aio8) && High[aiao12[aio0]] < High[aiao12[aio4]]) {
      lio16 = getomaxohigh(aiao12[aio0]);
      lio20 = getomaxohigh(aiao12[aio4]);
      if (High[lio16] > High[lio20]) return (0);
      drawolineoind(aiao12[aio0], dMACD(aiao12[aio0], aio8), aiao12[aio4], dMACD(aiao12[aio4], aio8), "RHMM" + aio8 + "Macd2Resistance" + aiao12[aio0], HiddenBearish, 3, lio28, HiddenBearishStyle);
      drawoline(lio16, High[lio16], lio20, High[lio20], "RHMMMResistance" + aio8 + "_chart" + lio16, HiddenBearish, 3, HiddenBearishStyle);
      addBearish(lio16, lio20, aio8 + 1, 3);
      return (2);
   }
   return (0);
}

int checkoSTDivobear(int aio0, int aio4) {
   int lio8 = 0;
   int lio12 = 0;
   if (giao408[aio4] - giao408[aio0] < 5) return (0);
   if (MathAbs(dStock(giao408[aio0]) - dStock(giao408[aio4])) < gio348) return (0);
   if (dStock(giao408[aio0]) < gio352 || dStock(giao408[aio4]) < gio352) return (0);
   if (aio4 - aio0 > 1) {
      for (int lio16 = aio0 + 1; lio16 < aio4; lio16++) {
         if (dStock(giao408[aio0]) > dStock(giao408[aio4]) && dStock(giao408[lio16]) > dStock(giao408[aio4])) return (0);
         if (dStock(giao408[aio0]) < dStock(giao408[aio4]) && dStock(giao408[lio16]) > dStock(giao408[aio0])) return (0);
      }
   }
   int lio20 = WindowFind(StochName);
   if (dStock(giao408[aio0]) < dStock(giao408[aio4]) && High[giao408[aio0]] > High[giao408[aio4]]) {
      lio8 = getomaxohigh(giao408[aio0]);
      lio12 = getomaxohigh(giao408[aio4]);
      if (High[lio8] < High[lio12]) return (0);
      drawolineoind(giao408[aio0], dStock(giao408[aio0]), giao408[aio4], dStock(giao408[aio4]), "RHMMStoResistance" + giao408[aio0], RegularBearish, 2, lio20, RegularBearishStyle);
      drawoline(lio8, High[lio8], lio12, High[lio12], "RHMMResistanceochart" + lio8, RegularBearish, 2, RegularBearishStyle);
      addBearish(lio8, lio12, 3, 1);
      return (1);
   }
   if (dStock(giao408[aio0]) > dStock(giao408[aio4]) && High[giao408[aio0]] < High[giao408[aio4]]) {
      lio8 = getomaxohigh(giao408[aio0]);
      lio12 = getomaxohigh(giao408[aio4]);
      if (High[lio8] > High[lio12]) return (0);
      drawolineoind(giao408[aio0], dStock(giao408[aio0]), giao408[aio4], dStock(giao408[aio4]), "RHMMStoResistance" + giao408[aio0], HiddenBearish, 3, lio20, HiddenBearishStyle);
      drawoline(lio8, High[lio8], lio12, High[lio12], "RHMMResistanceochart" + lio8, HiddenBearish, 3, HiddenBearishStyle);
      addBearish(lio8, lio12, 3, 3);
      return (2);
   }
   return (0);
}

int getomaxohigh(int aio0) {
   double lohigho4 = High[aio0 + 2];
   int lioreto12 = aio0 + 2;
   for (int lio16 = aio0 - 2; lio16 < aio0 + 2; lio16++) {
      if (lio16 > 0 && High[lio16] > lohigho4) {
         lohigho4 = High[lio16];
         lioreto12 = lio16;
      }
   }
   return (lioreto12);
}

int checkoSTDivobull(int aio0, int aio4) {
   int lio8 = 0;
   int lio12 = 0;
   if (giao412[aio4] - giao412[aio0] < 5) return (0);
   if (MathAbs(dStock(giao412[aio0]) - dStock(giao412[aio4])) < gio348) return (0);
   if (dStock(giao412[aio0]) > gio356 || dStock(giao412[aio4]) > gio356) return (0);
   if (aio4 - aio0 > 1) {
      for (int lio16 = aio0 + 1; lio16 < aio4; lio16++) {
         if (dStock(giao412[aio0]) > dStock(giao412[aio4]) && dStock(giao412[lio16]) < dStock(giao412[aio4])) return (0);
         if (dStock(giao412[aio0]) > dStock(giao412[aio4]) && dStock(giao412[lio16]) < dStock(giao412[aio0])) return (0);
         if (dStock(giao412[aio0]) < dStock(giao412[aio4]) && dStock(giao412[lio16]) < dStock(giao412[aio0])) return (0);
         if (dStock(giao412[aio0]) < dStock(giao412[aio4]) && dStock(giao412[lio16]) < dStock(giao412[aio4])) return (0);
      }
   }
   int lio20 = WindowFind(StochName);
   if (dStock(giao412[aio0]) < dStock(giao412[aio4]) && Low[giao412[aio0]] > Low[giao412[aio4]]) {
      lio8 = getominolow(giao412[aio0]);
      lio12 = getominolow(giao412[aio4]);
      if (Low[lio8] < Low[lio12]) return (0);
      if (lio12 - lio8 < 5) return (0);
      drawolineoind(giao412[aio0], dStock(giao412[aio0]), giao412[aio4], dStock(giao412[aio4]), "RHMMStoSupport" + giao412[aio0], HiddenBullish, 2, lio20, HiddenBullishStyle);
      drawoline(lio8, Low[lio8], lio12, Low[lio12], "RHMMSupportochart" + lio8, HiddenBullish, 2, HiddenBullishStyle);
      addBullish(lio8, lio12, 3, 1);
      return (3);
   }
   if (dStock(giao412[aio0]) > dStock(giao412[aio4]) && Low[giao412[aio0]] < Low[giao412[aio4]]) {
      lio8 = getominolow(giao412[aio0]);
      lio12 = getominolow(giao412[aio4]);
      if (Low[lio8] > Low[lio12]) return (0);
      if (lio12 - lio8 < 5) return (0);
      drawolineoind(giao412[aio0], dStock(giao412[aio0]), giao412[aio4], dStock(giao412[aio4]), "RHMMStoSupport" + giao412[aio0], RegularBullish, 3, lio20, RegularBullishStyle);
      drawoline(lio8, Low[lio8], lio12, Low[lio12], "RHMMSupportochart" + lio8, RegularBullish, 3, RegularBullishStyle);
      addBullish(lio8, lio12, 3, 3);
      return (4);
   }
   return (0);
}

int getominolow(int aio0) {
   double lolowo4 = Low[aio0 + 2];
   int lioreto12 = aio0 + 2;
   for (int lio16 = aio0 - 2; lio16 < aio0 + 2; lio16++) {
      if (lio16 > 0 && Low[lio16] < lolowo4) {
         lolowo4 = Low[lio16];
         lioreto12 = lio16;
      }
   }
   return (lioreto12);
}

double dStock(int aoshifto0) {
   return (iStochastic(Symbol(), 0, StochKPeriod, StochDPeriod, StochSlowing, MODE_SMA, 0, MODE_MAIN, aoshifto0));
}

int deinit() {
   gso456 = "";
   Comment(gso456);
   deleteoobjects();
   return (0);
}

void deleteoobjects() {
   int loobjsototalo0;
   string lonameo4 = "";
   bool lio12 = TRUE;
   while (lio12) {
      lio12 = FALSE;
      loobjsototalo0 = ObjectsTotal();
      for (int lio16 = 0; lio16 < loobjsototalo0; lio16++) {
         lonameo4 = ObjectName(lio16);
         if (StringFind(lonameo4, "RHMM") != -1) {
            ObjectDelete(lonameo4);
            lio12 = TRUE;
         }
      }
   }
}

int addBearish(int aio0, int aio4, int aio8, int aio12, bool aio16 = FALSE) {
   string lso20;
   if (aio16) {
      ArrayInitialize(giao432, 0);
      goindexo540 = 0;
      return (0);
   }
   giao432[goindexo540][0] = aio0;
   giao432[goindexo540][1] = aio4;
   giao432[goindexo540][2] = aio8;
   giao432[goindexo540][3] = aio12;
   goindexo540++;
   if (aio0 < 5) {
      lso20 = "Stochastic";
      if (aio8 == 2) lso20 = "MACD";
      if (gio376 != aio0 && RegularBearishAlert && aio12 == 1) {
         if (gocounto392 != 1) Alert("Regular Bearish on " + Symbol() + " " + Period() + " min chart from " + lso20 + " bar " + aio0);
         gio376 = aio0;
         gocounto392 = 0;
      }
      if (gio380 != aio0 && HiddenBearishAlert && aio12 == 3) {
         if (gocounto396 != 1) Alert("Hidden Bearish on " + Symbol() + " " + Period() + " min chart from " + lso20 + " bar " + aio0);
         gio380 = aio0;
         gocounto396 = 0;
      }
   }
   return (0);
}

int checkHiddenBearish() {
   int lio0;
   int lio4;
   bool locoloro8 = Black;
   bool lio12 = FALSE;
   int lio16 = 0;
   for (int loindexo20 = 0; loindexo20 < NrLoad - 2; loindexo20++) {
      if (giao432[loindexo20][2] == 0) break;
      lio16 = giao432[loindexo20][1] - giao432[loindexo20][0];
      for (int lio24 = loindexo20 + 1; lio24 < NrLoad - 2; lio24++) {
         if (MathAbs(giao432[lio24][1] - giao432[loindexo20][1]) < lio16 / 2 && MathAbs(giao432[lio24][0] - giao432[loindexo20][0]) < lio16 / 2 && giao432[lio24][3] == giao432[loindexo20][3]) {
            lio0 = MathMin(giao432[lio24][0], giao432[loindexo20][0]);
            lio4 = MathMax(giao432[lio24][1], giao432[loindexo20][1]);
            if (giao432[lio24][2] == 3) ObjectDelete("RHMMResistanceochart" + giao432[lio24][0]);
            else ObjectDelete("RHMMMResistance1ochart" + giao432[lio24][0]);
            if (giao432[loindexo20][2] == 3) ObjectDelete("RHMMResistanceochart" + giao432[loindexo20][0]);
            else ObjectDelete("RHMMMResistance1ochart" + giao432[loindexo20][0]);
            if (giao432[lio24][3] == 3) {
               locoloro8 = HiddenBearish;
               lio12 = HiddenBearishStyle;
            } else {
               locoloro8 = RegularBearish;
               lio12 = RegularBearishStyle;
            }
            drawoline(lio0, High[lio0], lio4, High[lio4], "RHMMDblResisstanceochart" + lio0, locoloro8, 3, lio12);
            if (lio0 < 5 && gio368 != lio0 && OnDoubleAlert) {
               if (gocounto372 != 1) Alert("Double BEAR on " + Symbol() + " " + Period() + " minute chart");
               gio368 = lio0;
               gocounto372 = 0;
            }
            ObjectCreate("RHMMxdt" + loindexo20, OBJ_TEXT, 0, Time[(giao432[lio24][1] + giao432[lio24][0]) / 2], (High[giao432[lio24][1]] + High[giao432[lio24][0]]) / 2.0);
            ObjectSetText("RHMMxdt" + loindexo20, "DOUBLE BEAR", 9, "Lucida Console", DoubleText);
            fixBearish(lio24);
            lio24--;
         }
      }
   }
   return (0);
}

int addBullish(int aio0, int aio4, int aio8, int aio12, bool aio16 = FALSE) {
   string lso20;
   if (aio16) {
      ArrayInitialize(giao436, 0);
      goindexo544 = 0;
      return (0);
   }
   giao436[goindexo544][0] = aio0;
   giao436[goindexo544][1] = aio4;
   giao436[goindexo544][2] = aio8;
   giao436[goindexo544][3] = aio12;
   goindexo544++;
   if (aio0 < 5) {
      lso20 = "Stochastic";
      if (aio8 == 2) lso20 = "MACD";
      if (gio384 != aio0 && RegularBullishAlert && aio12 == 1) {
         if (gocounto400 != 1) Alert("Regular Bullish on " + Symbol() + " " + Period() + " min chart from " + lso20 + " bar " + aio0);
         gio384 = aio0;
         gocounto400 = 0;
      }
      if (gio388 != aio0 && HiddenBullishAlert && aio12 == 3) {
         if (gocounto404 != 1) Alert("Hidden Bullish on " + Symbol() + " " + Period() + " min chart from " + lso20 + " bar " + aio0);
         gio388 = aio0;
         gocounto404 = 0;
      }
   }
   return (0);
}

int fixBearish(int aio0) {
   while (giao432[aio0][3] != 0) {
      giao432[aio0][0] = giao432[aio0 + 1][0];
      giao432[aio0][1] = giao432[aio0 + 1][1];
      giao432[aio0][2] = giao432[aio0 + 1][2];
      giao432[aio0][3] = giao432[aio0 + 1][3];
      aio0++;
      if (aio0 > NrLoad) break;
   }
   return (0);
}

int fixBullish(int aio0) {
   while (giao436[aio0][3] != 0) {
      giao436[aio0][0] = giao436[aio0 + 1][0];
      giao436[aio0][1] = giao436[aio0 + 1][1];
      giao436[aio0][2] = giao436[aio0 + 1][2];
      giao436[aio0][3] = giao436[aio0 + 1][3];
      aio0++;
      if (aio0 > NrLoad) break;
   }
   return (0);
}

int checkBullish() {
   int lio12;
   int lio16;
   int lio0 = 0;
   bool locoloro20 = Black;
   bool lio24 = FALSE;
   for (int loindexo4 = 0; loindexo4 < NrLoad - 2; loindexo4++) {
      if (giao436[loindexo4][2] == 0) break;
      lio0 = giao436[loindexo4][1] - giao436[loindexo4][0];
      for (int lio8 = loindexo4 + 1; lio8 < NrLoad - 2; lio8++) {
         if (MathAbs(giao436[lio8][1] - giao436[loindexo4][1]) < lio0 / 2 && MathAbs(giao436[lio8][0] - giao436[loindexo4][0]) < lio0 / 2 && giao436[lio8][3] == giao436[loindexo4][3]) {
            lio12 = MathMin(giao436[lio8][0], giao436[loindexo4][0]);
            lio16 = MathMax(giao436[lio8][1], giao436[loindexo4][1]);
            if (giao436[lio8][2] == 3) ObjectDelete("RHMMSupportochart" + giao436[lio8][0]);
            else ObjectDelete("RHMM1MSupportochart" + giao436[lio8][0]);
            if (giao436[loindexo4][2] == 3) ObjectDelete("RHMMSupportochart" + giao436[loindexo4][0]);
            else ObjectDelete("RHMM1MSupportochart" + giao436[loindexo4][0]);
            if (giao436[lio8][3] == 3) {
               locoloro20 = RegularBullish;
               lio24 = RegularBullishStyle;
            } else {
               locoloro20 = HiddenBullish;
               lio24 = HiddenBullishStyle;
            }
            drawoline(lio12, Low[lio12], lio16, Low[lio16], "RHMMDblSupportochart" + lio12, locoloro20, 3, lio24);
            if (lio12 < 5 && gio368 != lio12 && OnDoubleAlert) {
               if (gocounto372 != 1) Alert("Double BULL on " + Symbol() + " " + Period() + " minute chart");
               gio368 = lio12;
               gocounto372 = 0;
            }
            ObjectCreate("RHMMxdtf" + loindexo4, OBJ_TEXT, 0, Time[(lio12 + lio16) / 2], (Low[lio12] + Low[lio16]) / 2.0);
            ObjectSetText("RHMMxdtf" + loindexo4, "DOUBLE BULL", 9, "Lucida Console", DoubleText);
            fixBullish(lio8);
            lio8--;
         }
      }
   }
   return (0);
}

int start() {
   int loobjsototalo4;
   string lonameo8;
   bool lio16;
   if (gio480 == TRUE) {
      if (NewBar()) {
         deleteoobjects();
         gio368++;
         gocounto372++;
         gio376++;
         gio380++;
         gocounto392++;
         gocounto396++;
         gio384++;
         gio388++;
         gocounto400++;
         gocounto404++;
         updateostockopicks(1, "stckomax", Blue);
         updateostockopicks(2, "stckomin", Red);
         updateomacdopicks(1, "macdomax", Blue);
         updateomacdopicks(2, "macdomin", Red);
         addBearish(0, 0, 0, 0, 1);
         addBullish(0, 0, 0, 0, 1);
         for (int lio0 = 0; lio0 < NrLoad - 3; lio0++) {
            if (StochBearish) {
               if (checkoSTDivobear(lio0, lio0 + 1) == 0) {
                  if (checkoSTDivobear(lio0, lio0 + 2) == 0)
                     if (checkoSTDivobear(lio0, lio0 + 3) == 0) checkoSTDivobear(lio0, lio0 + 4);
               }
            }
            if (StochBullish) {
               if (checkoSTDivobull(lio0, lio0 + 1) == 0)
                  if (checkoSTDivobull(lio0, lio0 + 2) == 0) checkoSTDivobull(lio0, lio0 + 3);
            }
            if (MACDBearish) {
               if (checkoMacdDivobear(lio0, lio0 + 1, 1, giao416) == 0)
                  if (checkoMacdDivobear(lio0, lio0 + 2, 1, giao416) == 0) checkoMacdDivobear(lio0, lio0 + 3, 1, giao416);
            }
            if (MACDBullish) {
               if (checkoMacdDivobull(lio0, lio0 + 1, 1, giao420) == 0)
                  if (checkoMacdDivobull(lio0, lio0 + 2, 1, giao420) == 0) checkoMacdDivobull(lio0, lio0 + 3, 1, giao420);
            }
         }
         checkHiddenBearish();
         checkBullish();
         if (ShowOnlyDouble) {
            lonameo8 = "";
            lio16 = TRUE;
            while (lio16) {
               lio16 = FALSE;
               loobjsototalo4 = ObjectsTotal();
               for (lio0 = 0; lio0 < loobjsototalo4; lio0++) {
                  lonameo8 = ObjectName(lio0);
                  if (StringFind(lonameo8, "RHMM") != -1 && StringFind(lonameo8, "RHMMDbl") == -1 && StringFind(lonameo8, "Macd") == -1 && StringFind(lonameo8, "Sto") == -1) {
                     ObjectDelete(lonameo8);
                     lio16 = TRUE;
                  }
               }
            }
         }
      }
      if (UseLineTrader) linetrader();
   }
   return (0);
}

int stockopeak(int aoshifto0) {
   double loistochastico4 = iStochastic(Symbol(), 0, StochKPeriod, StochDPeriod, StochSlowing, MODE_SMA, 0, MODE_MAIN, aoshifto0 - 1);
   double loistochastico12 = iStochastic(Symbol(), 0, StochKPeriod, StochDPeriod, StochSlowing, MODE_SMA, 0, MODE_MAIN, aoshifto0);
   double loistochastico20 = iStochastic(Symbol(), 0, StochKPeriod, StochDPeriod, StochSlowing, MODE_SMA, 0, MODE_MAIN, aoshifto0 + 1);
   double loistochastico28 = iStochastic(Symbol(), 0, StochKPeriod, StochDPeriod, StochSlowing, MODE_SMA, 0, MODE_MAIN, aoshifto0 + 2);
   if (loistochastico12 > loistochastico4 && loistochastico12 > loistochastico20 && loistochastico12 > loistochastico28) return (1);
   if (loistochastico12 < loistochastico4 && loistochastico12 < loistochastico20 && loistochastico12 < loistochastico28) return (2);
   return (0);
}

void drawoline(int aio0, double aopriceo4, int aio12, double aopriceo16, string aonameo24, color aocoloro32, int aowidtho36, int aostyleo40) {
   double ldo44;
   ObjectDelete(aonameo24);
   if (gio364) {
      ldo44 = 10.0 * MathArctan((aopriceo4 - aopriceo16) / ((-aio0) + aio12)) / gopointo440;
      ObjectCreate(aonameo24 + "txt", OBJ_TEXT, 0, Time[aio0], aopriceo4);
      ObjectSetText(aonameo24 + "txt", DoubleToStr(ldo44, 1), 9, "Lucida Console", Yellow);
   }
   ObjectCreate(aonameo24, OBJ_TREND, 0, Time[aio0], aopriceo4, Time[aio12], aopriceo16);
   ObjectSet(aonameo24, OBJPROP_COLOR, aocoloro32);
   ObjectSet(aonameo24, OBJPROP_RAY, FALSE);
   if (CustomStyles) {
      ObjectSet(aonameo24, OBJPROP_STYLE, aostyleo40);
      return;
   }
   ObjectSet(aonameo24, OBJPROP_WIDTH, aowidtho36);
}

void drawolineoind(int aio0, double aopriceo4, int aio12, double aopriceo16, string aonameo24, color aocoloro32, int aowidtho36, int aowindowo40, int aostyleo44) {
   double ldo48;
   ObjectDelete(aonameo24);
   if (gio364) {
      ldo48 = 50.0 * MathArctan((aopriceo4 - aopriceo16) / ((-aio0) + aio12));
      if (WindowFind(MACDName) == aowindowo40) ldo48 = 200.0 * (MathArctan((aopriceo4 - aopriceo16) / ((-aio0) + aio12)) / gopointo440);
      ObjectCreate(aonameo24 + "txt", OBJ_TEXT, aowindowo40, Time[aio0], aopriceo4);
      ObjectSetText(aonameo24 + "txt", DoubleToStr(ldo48, 1), 9, "Lucida Console", Yellow);
   }
   if (aowindowo40 != -1) {
      ObjectCreate(aonameo24, OBJ_TREND, aowindowo40, Time[aio0], aopriceo4, Time[aio12], aopriceo16);
      ObjectSet(aonameo24, OBJPROP_COLOR, aocoloro32);
      ObjectSet(aonameo24, OBJPROP_RAY, FALSE);
      if (CustomStyles) ObjectSet(aonameo24, OBJPROP_STYLE, aostyleo44);
      else ObjectSet(aonameo24, OBJPROP_WIDTH, aowidtho36);
   }
}

bool NewBar() {
   if (gotimeo548 == 0) gotimeo548 = Time[0];
   if (gotimeo548 != Time[0]) {
      gotimeo548 = Time[0];
      return (TRUE);
   }
   return (FALSE);
}

/*
string authentication(string aso0, string as_8) {
   string ls_24;
   string ls_unused_32;
   string ls_16 = "mode=authenticate&username=" + as_0 + "&password=" + as_8;
   Base64Encode(ls_16, ls_24);
   return (LoadURL(ProcessURL("http://www.forexmastermethod.com/authea/tradeloc_auth.php?encoded=" + ls_24)));
}

string latest_version() {
   string ls_unused_0;
   string ls_unused_8;
   string ls_unused_16;
   return (LoadURL(ProcessURL("http://www.forexmastermethod.com/authea/tradeloc_version.php")));
}

void Base64Encode(string as_0, string &as_8) {
   int li_28;
   int li_32;
   int li_36;
   int li_40;
   int li_44;
   int li_48;
   int li_52;
   int li_16 = 0;
   int li_20 = 0;
   int l_str_len_24 = StringLen(as_0);
   while (li_16 < l_str_len_24) {
      li_36 = StringGetChar(as_0, li_16);
      li_16++;
      if (li_16 >= l_str_len_24) {
         li_32 = 0;
         li_28 = 0;
         li_20 = 2;
      } else {
         li_32 = StringGetChar(as_0, li_16);
         li_16++;
         if (li_16 >= l_str_len_24) {
            li_28 = 0;
            li_20 = 1;
         } else {
            li_28 = StringGetChar(as_0, li_16);
            li_16++;
         }
      }
      li_40 = li_36 >> 2;
      li_44 = (li_36 & 3 * 16) | li_32 >> 4;
      li_48 = (li_32 & 15 * 4) | li_28 >> 6;
      li_52 = li_28 & 63;
      as_8 = as_8 + CharToStr(gia_488[li_40]);
      as_8 = as_8 + CharToStr(gia_488[li_44]);
      switch (li_20) {
      case 0:
         as_8 = as_8 + CharToStr(gia_488[li_48]);
         as_8 = as_8 + CharToStr(gia_488[li_52]);
         break;
      case 1:
         as_8 = as_8 + CharToStr(gia_488[li_48]);
         as_8 = as_8 + "=";
         break;
      case 2:
         as_8 = as_8 + "==";
      }
   }
}

string LoadURL(string as_0) {
   g_count_512 = 0;
   for (gi_504 = FALSE; g_count_512 < 3 && gi_504 == FALSE; g_count_512++) {
      if (gi_508 != 0) gi_504 = InternetOpenUrlA(gi_508, as_0, 0, 0, -2079850240, 0);
      if (gi_504 == FALSE) {
         InternetCloseHandle(gi_508);
         gi_508 = InternetOpenA("mymt4InetSession", gi_492, 0, 0, 0);
      }
   }
   gs_516 = "";
   gia_524[0] = 1;
   while (gia_524[0] > 0) {
      InternetReadFile(gi_504, gs_532, 200, gia_524);
      if (gia_524[0] > 0) gs_516 = gs_516 + StringSubstr(gs_532, 0, gia_524[0]);
      if (StringSubstr(gs_532, 0, gia_524[0]) == "0") break;
      if (StringSubstr(gs_532, 0, gia_524[0]) == "4") break;
      if (StringSubstr(gs_532, 0, gia_524[0]) == "1") break;
   }
   InternetCloseHandle(gi_504);
   return (gs_516);
}

string ProcessURL(string as_0) {
   string ls_12;
   string ls_20;
   for (int li_8 = StringFind(as_0, " "); li_8 != -1; li_8 = StringFind(as_0, " ")) {
      ls_12 = StringTrimLeft(StringTrimRight(StringSubstr(as_0, 0, StringFind(as_0, " ", 0))));
      ls_20 = StringTrimLeft(StringTrimRight(StringSubstr(as_0, StringFind(as_0, " ", 0))));
      as_0 = ls_12 + "%20" + ls_20;
   }
   return (as_0);
}*/

void linetrader() {
   string lonameo0 = "";
   int lio8 = -1;
   gso464 = gso456 
      + "\n\n    Line Trader is Running .... \n Stop Loss: " + StopLoss 
      + "\n Take Profit: " + TakeProfit 
   + "\n PipsRangeFromLine: " + PipsRangeFromLine;
   if (CheckAfterClose) {
      gso464 = gso464 
      + "\n\n Tracks only on Candle CLOSE \n\n Tracking: ";
   } else {
      gso464 = gso464 
      + "\n Tracks REAL Time \n\n Tracking: ";
   }
   for (int lio16 = 0; lio16 < ObjectsTotal(); lio16++) {
      lonameo0 = ObjectName(lio16);
      lio8 = MyObject(lonameo0);
      if (lio8 != -1) {
         if (MyOpenTime(lonameo0, lio8)) {
            if (OpenOrders) OpenTrade(lio8);
            ObjectSet(lonameo0, OBJPROP_COLOR, OnCompleteColor);
            ObjectSetText(lonameo0, lonameo0 + " " + OnCompleteText, 10);
            if (NotifyByAlert) Alert("Work for " + lonameo0 + " COMPLETED on " + Symbol() + " at price" + Bid);
         }
      }
   }
   Comment(gso464);
}

bool MyOpenTime(string aonameo0, int aio8) {
   double ldo12 = 0;
   if (ObjectType(aonameo0) == 1) ldo12 = ObjectGet(aonameo0, OBJPROP_PRICE1);
   else ldo12 = ObjectGetValueByShift(aonameo0, 0);
   if (ldo12 == 0.0) return (FALSE);
   gso464 = gso464 
   + "\n  " + aonameo0 + " at Price: " + DoubleToStr(ldo12, Digits);
   if (CheckAfterClose) {
      if (Close[1] > ldo12 + gdo448 && Bid > ldo12 + gdo448 && aio8 == 1 || aio8 == 3) return (TRUE);
      if (Close[1] < ldo12 - gdo448 && Bid < ldo12 - gdo448 && aio8 == 2 || aio8 == 4) return (TRUE);
      return (FALSE);
   }
   if (Bid > ldo12 + gdo448 && aio8 == 1 || aio8 == 3) return (TRUE);
   if (Bid < ldo12 - gdo448 && aio8 == 2 || aio8 == 4) return (TRUE);
   return (FALSE);
}

int MyObject(string aonameo0) {
   int lio8 = ObjectGet(aonameo0, OBJPROP_COLOR);
   if (lio8 == BuyAboveLineColor && StringFind(aonameo0, BuyAboveLineName) != -1) return (1);
   if (lio8 == BuyBelowLineColor && StringFind(aonameo0, BuyBelowLineName) != -1) return (2);
   if (lio8 == SellAboveLineColor && StringFind(aonameo0, SellAboveLineName) != -1) return (3);
   if (lio8 == SellBelowLineColor && StringFind(aonameo0, SellBelowLineName) != -1) return (4);
   return (-1);
}

int OpenTrade(int aio0) {
   double lopriceo4;
   double lopriceo24;
   double lopriceo32;
   int lio12 = 1;
   RefreshRates();
   int locmdo16 = -1;
   if (aio0 < 3) {
      lopriceo4 = Ask;
      locmdo16 = 0;
   } else {
      lopriceo4 = Bid;
      lio12 = -1;
      locmdo16 = 1;
   }
   int loticketo20 = OrderSend(Symbol(), locmdo16, LotSize, lopriceo4, goslippageo472, 0, 0, 0, MagicNumber);
   if (loticketo20 < 0) {
      Print("Error opening Order " + GetLastError());
      return (0);
   }
   if (OrderSelect(loticketo20, SELECT_BY_TICKET) != FALSE) {
      lopriceo24 = 0;
      lopriceo32 = 0;
      if (StopLoss != 0) lopriceo24 = OrderOpenPrice() - lio12 * gopointo440 * StopLoss;
      if (TakeProfit != 0) lopriceo32 = OrderOpenPrice() + lio12 * gopointo440 * TakeProfit;
      OrderModify(loticketo20, OrderOpenPrice(), lopriceo24, lopriceo32, OrderExpiration());
   }
   return (1);
}