/*
   Generated by EX4-TO-MQ4 decompiler LITE V4.0.409.1g [-]
   Website: https://purebeam.biz
   E-mail : purebeam@gmail.com
*/
#property copyright "Copyright @ Rita Lasker"
#property link      "www.ritalasker.com"

//#include <stdlib.mqh>
#import "stdlib.ex4"
   string ErrorDescription(int a0);
#import

int gi_76 = 0;
int gi_80 = 0;
int gi_84 = 59;
int gi_88 = 1;
int gi_92 = 5;
int gi_96 = 1;
int gi_100 = 5;
double gd_104 = 0.0;
double gda_112[1000];
double gda_116[1000];
double gda_120[1000];
double gda_124[1000];
double gda_128[1000];
int gi_132;
string gs_136;
string gs_144;
bool gi_152 = TRUE;
bool gi_156 = TRUE;
int gi_160 = 60;
int gi_164 = 40;
extern double LotSize = 0.1;
int gi_176 = 6;
int gi_180 = 5;
int gi_184 = 1;
extern int Magic = 731;
int gi_192 = 2;
int gi_196 = 255;
int gi_200 = 16711680;
int gi_204 = Crimson;
int gi_208 = BlueViolet;
int gi_212 = 32768;
bool gi_224 = TRUE;
string gs_228 = "best_secret_eurusd_v1_31";
int gi_236 = 1;
int gi_240 = 0;
int gi_244 = Red;
string gs_248 = "";
int gi_256 = 1;
int gi_260 = 4;
int gi_264 = 10;
bool gi_268 = FALSE;
string gs_272 = "alert.wav";
string gs_280 = "alert2.wav";
string gs_288 = "expert.wav";
double gd_304 = 0.0;
double gd_312 = 0.0;
double gd_320 = 0.0;
bool gi_328 = TRUE;
int gi_332;
int gi_336;
int gi_340;
bool gi_344 = FALSE;
bool gi_348 = FALSE;
bool gi_352 = TRUE;
bool gi_356 = TRUE;

void init() {
   gs_248 = Symbol();
   if (StringFind(gs_248, "JPY") < 0) {
      gd_320 = MarketInfo(gs_248, MODE_POINT);
      if (gd_320 - 0.0001 < 0.0) {
         gi_256 = 10;
         gi_260 = 5;
      } else {
         gi_256 = 1;
         gi_260 = 4;
      }
   } else {
      gd_320 = MarketInfo(gs_248, MODE_POINT);
      if (gd_320 - 0.01 < 0.0) {
         gi_256 = 10;
         gi_260 = 3;
      } else {
         gi_256 = 1;
         gi_260 = 2;
      }
   }
   gi_96 = gi_88 * gi_256;
   gi_100 = gi_92 * gi_256;
   if (IsTesting() == TRUE) {
      gi_132 = 1;
      f0_4("tStr1", 100, 15 * gi_132 + gi_240);
      gi_132++;
      f0_4("tStr2", 100, 15 * gi_132 + gi_240);
      gi_132++;
   }
   gi_332 = gi_176 * gi_256;
   if (gi_332 < MarketInfo(Symbol(), MODE_STOPLEVEL)) gi_332 = MarketInfo(Symbol(), MODE_STOPLEVEL) + 1.0;
   gi_336 = gi_180 * gi_256;
   if (gi_336 < MarketInfo(Symbol(), MODE_STOPLEVEL)) gi_336 = MarketInfo(Symbol(), MODE_STOPLEVEL) + 1.0;
   gi_340 = gi_184 * gi_256;
}

void deinit() {
   if (IsTesting() == FALSE) {
      ObjectDelete("tStr1");
      ObjectDelete("tStr2");
      for (int li_0 = 1; li_0 < 1000; li_0++) ObjectDelete("ARROW" + DoubleToStr(li_0, 0));
   }
}

void f0_4(string as_0, int ai_8, int ai_12) {
   ObjectCreate(as_0, OBJ_LABEL, 0, 0, 0);
   ObjectSet(as_0, OBJPROP_CORNER, gi_236);
   ObjectSet(as_0, OBJPROP_XDISTANCE, ai_8);
   ObjectSet(as_0, OBJPROP_YDISTANCE, ai_12);
   ObjectSet(as_0, OBJPROP_BACK, TRUE);
}

int start() {
   if (IsTesting() && (!gi_224)) {
      Comment("Режим тестирования запрещен!!!");
      return;
   }
   if (gi_344 == TRUE) f0_7(gs_248, OP_BUY, Magic + 1);
   if (gi_348 == TRUE) f0_7(gs_248, OP_SELL, Magic - 1);
   if (f0_0(gs_248, OP_BUY, Magic + 1, 0) == 0) {
      gi_344 = FALSE;
      gi_352 = FALSE;
   }
   if (f0_0(gs_248, OP_SELL, Magic - 1, 0) == 0) {
      gi_348 = FALSE;
      gi_356 = FALSE;
   }
   if (gi_76 != iTime(Symbol(), PERIOD_M15, 0) && gi_156 == TRUE) {
      gi_76 = iTime(Symbol(), PERIOD_M15, 0);
      gi_156 = FALSE;
      if (IsTesting()) {
         gs_136 = "Please Close";
         gs_144 = "Orders";
         ObjectSetText("tStr1", gs_136, 20, "Arial", gi_244);
         ObjectSetText("tStr2", gs_144, 16, "Arial", gi_244);
         PlaySound("alert.wav");
      }
   }
   if (gi_80 != iTime(Symbol(), PERIOD_H4, 0)) {
      gi_80 = iTime(Symbol(), PERIOD_H4, 0);
      if (f0_0(Symbol(), OP_BUY, Magic + 1, 0) == 1 && gi_352 == FALSE) f0_6(Symbol(), OP_BUY, Magic + 1);
      if (f0_0(Symbol(), OP_SELL, Magic - 1, 0) == 1 && gi_356 == FALSE) f0_6(Symbol(), OP_SELL, Magic - 1);
      ArrayInitialize(gda_112, EMPTY_VALUE);
      ArrayInitialize(gda_116, EMPTY_VALUE);
      ArraySetAsSeries(gda_124, TRUE);
      for (int li_0 = 0; li_0 < 1000; li_0++) gda_124[li_0] = iMA(Symbol(), PERIOD_H4, 5, 0, MODE_SMA, PRICE_MEDIAN, li_0) - iMA(Symbol(), PERIOD_H4, 34, 0, MODE_SMA, PRICE_MEDIAN, li_0);
      for (li_0 = 0; li_0 < 1000; li_0++) gda_128[li_0] = iMAOnArray(gda_124, 0, 5, 0, MODE_SMA, li_0);
      for (int li_4 = 0; li_4 < 1000; li_4++) {
         gd_104 = gda_124[li_4] - gda_128[li_4];
         gda_120[li_4] = gd_104;
      }
      for (li_4 = 0; li_4 < 1000; li_4++) {
         if (gda_120[li_4 + gi_84 - 1] < 0.0 && gda_120[li_4 + gi_84] > 0.0) {
            gda_112[li_4] = Low[li_4];
            if (IsTesting()) for (int li_8 = 1; li_8 < 1000; li_8++) ObjectDelete("ARROW" + DoubleToStr(li_8, 0));
            for (int li_12 = 0; li_12 < 1000; li_12++) {
               if (gda_112[li_12] > 0.0 && gda_112[li_12] < 10000.0) {
                  if (IsTesting()) {
                     ObjectCreate("ARROW" + DoubleToStr(li_12, 0), OBJ_ARROW, 0, Time[li_12], Low[li_12] - gi_96 * Point);
                     ObjectSet("ARROW" + DoubleToStr(li_12, 0), OBJPROP_ARROWCODE, SYMBOL_ARROWUP);
                     ObjectSet("ARROW" + DoubleToStr(li_12, 0), OBJPROP_COLOR, Red);
                     ObjectSet("ARROW" + DoubleToStr(li_12, 0), OBJPROP_WIDTH, 5);
                  }
               }
               if (gda_116[li_12] > 0.0 && gda_116[li_12] < 10000.0) {
                  if (IsTesting()) {
                     ObjectCreate("ARROW" + DoubleToStr(li_12, 0), OBJ_ARROW, 0, Time[li_12], High[li_12] + gi_100 * Point);
                     ObjectSet("ARROW" + DoubleToStr(li_12, 0), OBJPROP_ARROWCODE, SYMBOL_ARROWDOWN);
                     ObjectSet("ARROW" + DoubleToStr(li_12, 0), OBJPROP_COLOR, Red);
                     ObjectSet("ARROW" + DoubleToStr(li_12, 0), OBJPROP_WIDTH, 5);
                  }
               }
            }
         } else {
            if (gda_120[li_4 + gi_84 - 1] > 0.0 && gda_120[li_4 + gi_84] < 0.0) {
               gda_116[li_4] = High[li_4];
               if (IsTesting()) for (int li_16 = 1; li_16 < 1000; li_16++) ObjectDelete("ARROW" + DoubleToStr(li_16, 0));
               for (int li_20 = 0; li_20 < 1000; li_20++) {
                  if (gda_112[li_20] > 0.0 && gda_112[li_20] < 10000.0) {
                     if (IsTesting()) {
                        ObjectCreate("ARROW" + DoubleToStr(li_20, 0), OBJ_ARROW, 0, Time[li_20], Low[li_20] - gi_96 * Point);
                        ObjectSet("ARROW" + DoubleToStr(li_20, 0), OBJPROP_ARROWCODE, SYMBOL_ARROWUP);
                        ObjectSet("ARROW" + DoubleToStr(li_20, 0), OBJPROP_COLOR, Red);
                        ObjectSet("ARROW" + DoubleToStr(li_20, 0), OBJPROP_WIDTH, 5);
                     }
                  }
                  if (gda_116[li_20] > 0.0 && gda_116[li_20] < 10000.0) {
                     if (IsTesting()) {
                        ObjectCreate("ARROW" + DoubleToStr(li_20, 0), OBJ_ARROW, 0, Time[li_20], High[li_20] + gi_100 * Point);
                        ObjectSet("ARROW" + DoubleToStr(li_20, 0), OBJPROP_ARROWCODE, SYMBOL_ARROWDOWN);
                        ObjectSet("ARROW" + DoubleToStr(li_20, 0), OBJPROP_COLOR, Red);
                        ObjectSet("ARROW" + DoubleToStr(li_20, 0), OBJPROP_WIDTH, 5);
                     }
                  }
               }
            } else {
               if (gi_152 == FALSE) {
                  if (IsTesting()) {
                     gs_136 = "No trade";
                     gs_144 = " ";
                     ObjectSetText("tStr1", gs_136, 20, "Arial", gi_244);
                     ObjectSetText("tStr2", gs_144, 16, "Arial", gi_244);
                  }
               }
            }
         }
      }
      if ((gda_120[gi_84 - 1] < 0.0 && gda_120[gi_84] > 0.0) || (gda_120[gi_84 - 1] > 0.0 && gda_120[gi_84] < 0.0)) PlaySound("alert.wav");
      if (gda_120[gi_84 - 1] < 0.0 && gda_120[gi_84] > 0.0) {
         RefreshRates();
         gd_304 = MarketInfo(gs_248, MODE_BID);
         gd_312 = MarketInfo(gs_248, MODE_ASK);
         gd_320 = MarketInfo(gs_248, MODE_POINT);
         if (IsTesting() == TRUE) f0_1(gs_248, OP_BUY, LotSize, gi_196, gi_200, gi_192 * gi_256, gd_304 - gd_320 * gi_160 * gi_256, 0, Magic + 1);
         if (IsTesting() == FALSE) f0_2(gs_248, OP_BUY, LotSize, 0, gi_196, gi_200, gi_192 * gi_256, gi_264, gi_268, gs_288, NormalizeDouble(gd_304 - Point * gi_160 * gi_256, Digits), 0, Magic + 1);
         gi_344 = TRUE;
      }
      if (gda_120[gi_84 - 1] > 0.0 && gda_120[gi_84] < 0.0) {
         RefreshRates();
         gd_304 = MarketInfo(gs_248, MODE_BID);
         gd_312 = MarketInfo(gs_248, MODE_ASK);
         gd_320 = MarketInfo(gs_248, MODE_POINT);
         if (IsTesting() == TRUE) f0_1(gs_248, OP_SELL, LotSize, gi_196, gi_200, gi_192 * gi_256, gd_312 + gd_320 * gi_164 * gi_256, 0, Magic - 1);
         if (IsTesting() == FALSE) f0_2(gs_248, OP_SELL, LotSize, 0, gi_196, gi_200, gi_192 * gi_256, gi_264, gi_268, gs_288, NormalizeDouble(gd_312 + Point * gi_164 * gi_256, Digits), 0, Magic - 1);
         gi_348 = TRUE;
      }
      if ((gda_120[gi_84 - 1 - 1] < 0.0 && gda_120[gi_84 - 1] > 0.0) || (gda_120[gi_84 - 1 - 1] > 0.0 && gda_120[gi_84 - 1] < 0.0)) {
         gi_156 = TRUE;
         gi_152 = TRUE;
      } else gi_152 = FALSE;
   }
   return (0);
}

int f0_2(string as_0, int ai_8, double ad_12, int ai_20, int ai_24, int ai_28, int ai_32, int ai_36, bool ai_40, string as_44, double ad_52 = 0.0, double ad_60 = 0.0, int ai_68 = 0) {
   color li_72;
   int li_76;
   double ld_80;
   double ld_88;
   double ld_96;
   int li_104;
   int li_108;
   int li_116 = 0;
   string ls_120 = gs_228;
   if (as_0 == "" || as_0 == "0") as_0 = Symbol();
   if (ai_8 == OP_BUY) li_72 = ai_24;
   else li_72 = ai_28;
   for (int li_112 = 1; li_112 <= ai_36; li_112++) {
      if (!IsTesting() && (!IsExpertEnabled()) || IsStopped()) {
         Print("OpenPosition(): Остановка работы функции");
         break;
      }
      while (!IsTradeAllowed()) Sleep(5000);
      RefreshRates();
      li_104 = MarketInfo(as_0, MODE_DIGITS);
      ld_88 = MarketInfo(as_0, MODE_ASK);
      ld_96 = MarketInfo(as_0, MODE_BID);
      if (ai_8 == OP_BUY) ld_80 = ld_88;
      else ld_80 = ld_96;
      ld_80 = NormalizeDouble(ld_80, li_104);
      li_76 = TimeCurrent();
      li_116 = OrderSend(as_0, ai_8, ad_12, ld_80, ai_32, 0, 0, ls_120, ai_68, 0, li_72);
      if (li_116 > 0) {
         if (OrderSelect(li_116, SELECT_BY_TICKET)) OrderModify(li_116, OrderOpenPrice(), ad_52, ad_60, OrderExpiration(), CLR_NONE);
         if (!(ai_40)) break;
         PlaySound(as_44);
         break;
      }
      li_108 = GetLastError();
      if (ld_88 == 0.0 && ld_96 == 0.0) Print("Проверьте в Обзоре рынка наличие символа " + as_0);
      Print("Error(", li_108, ") opening position: ", ErrorDescription(li_108), ", try ", li_112);
      Print("Ask=", ld_88, " Bid=", ld_96, " sSym=", as_0, " dLotSize=", ad_12, " iTradeOperation=", f0_5(ai_8), " dPrice=", ld_80, " dStopLoss=", ad_52, " dTakeProfit=",
         ad_60, " iMagic=", ai_68);
      if (li_108 == 2/* COMMON_ERROR */ || li_108 == 64/* ACCOUNT_DISABLED */ || li_108 == 65/* INVALID_ACCOUNT */ || li_108 == 133/* TRADE_DISABLED */) {
         ai_20 = 1;
         break;
      }
      if (li_108 == 4/* SERVER_BUSY */ || li_108 == 131/* INVALID_TRADE_VOLUME */ || li_108 == 132/* MARKET_CLOSED */) {
         Sleep(300000);
         break;
      }
      if (li_108 == 128/* TRADE_TIMEOUT */ || li_108 == 142 || li_108 == 143) {
         Sleep(66666.0);
         if (f0_0(as_0, ai_8, ai_68, li_76)) {
            if (!(ai_40)) break;
            PlaySound(as_44);
            break;
         }
      }
      if (li_108 == 140/* LONG_POSITIONS_ONLY_ALLOWED */ || li_108 == 148/* TRADE_TOO_MANY_ORDERS */ || li_108 == 4110/* LONGS__NOT_ALLOWED */ || li_108 == 4111/* SHORTS_NOT_ALLOWED */) break;
      if (li_108 == 141/* TOO_MANY_REQUESTS */) Sleep(100000);
      if (li_108 == 145/* TRADE_MODIFY_DENIED */) Sleep(17000);
      if (li_108 == 146/* TRADE_CONTEXT_BUSY */) while (IsTradeContextBusy()) Sleep(11000);
      if (li_108 != 135/* PRICE_CHANGED */) Sleep(7700.0);
   }
   return (li_116);
}

void f0_1(string as_0, int ai_8, double ad_12, int ai_20, int ai_24, int ai_28, double ad_32, double ad_40, int ai_48 = 0) {
   color li_52;
   double ld_56;
   int li_64;
   string ls_72 = gs_228;
   if (as_0 == "") as_0 = Symbol();
   if (ai_8 == OP_BUY) {
      ld_56 = MarketInfo(as_0, MODE_ASK);
      li_52 = ai_20;
   } else {
      ld_56 = MarketInfo(as_0, MODE_BID);
      li_52 = ai_24;
   }
   int li_68 = OrderSend(as_0, ai_8, ad_12, ld_56, ai_28, ad_32, ad_40, ls_72, ai_48, 0, li_52);
   if (li_68 < 0) {
      li_64 = GetLastError();
      Print("Error(", li_64, ") open ", f0_5(ai_8), ": ", ErrorDescription(li_64));
      Print("Ask=", Ask, " Bid=", Bid, " sSym=", as_0, " dLotSize=", ad_12, " dPrice=", ld_56, " dStopLoss=", ad_32, " dTakeProfit=", ad_40, " iMagic=", ai_48);
   }
}

int f0_0(string as_0, int ai_8, int ai_12, int ai_16 = 0) {
   int li_24 = OrdersTotal();
   if (as_0 == "0") as_0 = Symbol();
   for (int li_20 = 0; li_20 < li_24; li_20++) {
      if (OrderSelect(li_20, SELECT_BY_POS, MODE_TRADES)) {
         if (OrderSymbol() == as_0 || as_0 == "") {
            if (OrderType() == OP_BUY || OrderType() == OP_SELL) {
               if (ai_8 < OP_BUY || OrderType() == ai_8) {
                  if (ai_12 < 0 || OrderMagicNumber() == ai_12)
                     if (ai_16 <= OrderOpenTime()) return (1);
               }
            }
         }
      }
   }
   return (0);
}

string f0_5(int ai_0) {
   switch (ai_0) {
   case 0:
      return ("Buy");
   case 1:
      return ("Sell");
   case 2:
      return ("Buy Limit");
   case 3:
      return ("Sell Limit");
   case 4:
      return ("Buy Stop");
   case 5:
      return ("Sell Stop");
   }
   return ("Unknown Operation");
}

void f0_7(string as_0, int ai_8, int ai_12) {
   for (int li_16 = OrdersTotal() - 1; li_16 >= 0; li_16--) {
      if (OrderSelect(li_16, SELECT_BY_POS, MODE_TRADES)) {
         if (OrderSymbol() == Symbol() && ai_8 < OP_BUY || OrderType() == ai_8) {
            if (ai_12 < 0 || OrderMagicNumber() == ai_12) {
               if (OrderType() == OP_BUY) {
                  if (!gi_328 || Bid - OrderOpenPrice() > gi_332 * Point) {
                     if (OrderStopLoss() < Bid - (gi_332 + gi_340 - 1) * Point) {
                        Comment(NormalizeDouble(Bid - gi_332 * Point, Digits), 
                           "\n", DoubleToStr(Point, Digits), 
                           "\n", Digits, 
                        "\n", gi_332);
                        OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Bid - gi_332 * Point, Digits), OrderTakeProfit(), 0, CLR_NONE);
                        gi_352 = TRUE;
                     }
                  }
               }
               if (OrderType() == OP_SELL) {
                  if (!gi_328 || OrderOpenPrice() - Ask > gi_336 * Point) {
                     if (OrderStopLoss() > Ask + (gi_336 + gi_340 - 1) * Point || OrderStopLoss() == 0.0) {
                        Comment(NormalizeDouble(Ask + gi_336 * Point, Digits), 
                           "\n", DoubleToStr(Point, Digits), 
                           "\n", Digits, 
                        "\n", gi_336);
                        OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Ask + gi_336 * Point, Digits), OrderTakeProfit(), 0, CLR_NONE);
                        gi_356 = TRUE;
                     }
                  }
               }
            }
         }
      }
   }
}

void f0_6(string as_0, int ai_8, int ai_12) {
   int li_20 = OrdersTotal();
   if (as_0 == "0") as_0 = Symbol();
   for (int li_16 = li_20 - 1; li_16 >= 0; li_16--) {
      if (OrderSelect(li_16, SELECT_BY_POS, MODE_TRADES)) {
         if (OrderSymbol() == as_0 || as_0 == "" && ai_8 < OP_BUY || OrderType() == ai_8) {
            if (OrderType() == OP_BUY || OrderType() == OP_SELL)
               if (ai_12 < 0 || OrderMagicNumber() == ai_12) f0_3();
         }
      }
   }
}

void f0_3() {
   bool li_0;
   color li_4;
   double ld_8;
   double ld_16;
   double ld_24;
   double ld_32;
   int li_44;
   int li_40 = MarketInfo(OrderSymbol(), MODE_DIGITS);
   if (OrderType() == OP_BUY || OrderType() == OP_SELL) {
      for (int li_48 = 1; li_48 <= gi_264; li_48++) {
         if (!IsTesting() && (!IsExpertEnabled()) || IsStopped()) break;
         while (!IsTradeAllowed()) Sleep(5000);
         RefreshRates();
         ld_16 = MarketInfo(OrderSymbol(), MODE_ASK);
         ld_24 = MarketInfo(OrderSymbol(), MODE_BID);
         if (OrderType() == OP_BUY) {
            ld_32 = ld_24;
            li_4 = gi_204;
         } else {
            ld_32 = ld_16;
            li_4 = gi_208;
         }
         ld_8 = OrderLots();
         ld_32 = NormalizeDouble(ld_32, li_40);
         li_0 = OrderClose(OrderTicket(), ld_8, ld_32, gi_192, li_4);
         if (li_0) {
            if (!(gi_268)) break;
            PlaySound(gs_272);
            return;
         }
         li_44 = GetLastError();
         if (gi_268) PlaySound(gs_280);
         if (li_44 == 146/* TRADE_CONTEXT_BUSY */) while (IsTradeContextBusy()) Sleep(11000);
         Print("Error(", li_44, ") Close ", f0_5(OrderType()), " ", ErrorDescription(li_44), ", try ", li_48);
         Print(OrderTicket(), "  Ask=", ld_24, "  Bid=", ld_24, "  dPrice=", ld_32);
         Print("Sym=", OrderSymbol(), "  ll=", ld_8, "  sl=", OrderStopLoss(), "  tp=", OrderTakeProfit(), "  iMagicNumber=", OrderMagicNumber());
         Sleep(5000);
      }
   }
}