/*
   Generated by EX4-TO-MQ4 decompiler V4.0.224.1 []
   Website: http://purebeam.biz
   E-mail : purebeam@gmail.com
*/
#property link      "http://forexultimatebot.com"

extern string Version = "Forex Ultimate Bot v1.4";
extern double Lots = 0.1;
extern bool MM = FALSE;
extern bool In_BUY = TRUE;
extern bool In_SELL = TRUE;
extern int Aggr_level = 1;
extern double f1 = 0.18;
extern double f2 = 0.18;
extern int Period_Filtring = 3;
extern int SL_bs = 122;
extern bool RecoveryMode = FALSE;
extern bool StealthMode = TRUE;
extern bool TradeOnFridays = FALSE;
extern bool Modify_SL_TP = TRUE;
extern int Modify_SL_TP_Seconds = 10;
extern bool UseSignalRefreshRate = FALSE;
extern int SignalRefreshRate = 1;
 string password = "12345";
int gi_168 = 0;
int gi_172 = 2;
int gi_176 = 1;
string gs_180 = "";
int gi_188 = 0;
int g_ticket_192 = 0;
int g_magic_196 = 144;
int g_magic_200 = 233;
double g_lots_204;
bool gi_212;

int init() {
   g_lots_204 = Lots;
   if (Digits == 5) {
      gi_172 = 10 * gi_172;
      gi_176 = 10 * gi_176;
   }
   return (0);
}

int deinit() {
   return (0);
}

void LotHandle() {
   if (MM == TRUE) {
      gi_212 = AccountBalance() / 1000.0;
      if (gi_212 == FALSE) gi_212 = TRUE;
   } else gi_212 = TRUE;
   if (RecoveryMode == TRUE) {
      if (LastClosedProfit() < 0.0) {
         Lots = 2.0 * g_lots_204 * gi_212;
         return;
      }
      Lots = g_lots_204 * gi_212;
      return;
   }
   Lots = g_lots_204 * gi_212;
}

int start() {
   int li_0;
   gs_180 = AccountNumber() + IsDemo() + 1000;
   if (MD5(gs_180) != password) {
     /* Alert("Password is incorrect: " + password);
      Print("=========================================");
      Print("Password is incorrect");
      Print("AccountNumber: " + AccountNumber());
      Print("AccountNumber IsDemo: " + "2B" + gs_180 + "AH");
      Print("Password: <" + password + ">");
      Print("=========================================");*/
     }
   if (Aggr_level == 0) Aggr_level = 24;
   else {
      if (Aggr_level == 1) Aggr_level = 5;
      else Aggr_level = 24;
   }
   LotHandle();
   if (StealthMode == TRUE || StealthMode == FALSE) {
      if (TimeCurrent() <= gi_188) return (0);
      li_0 = 57;
      if (UseSignalRefreshRate == TRUE) li_0 = SignalRefreshRate;
      gi_188 = TimeCurrent() + 60 * li_0;
   } else {
      if (Time[0] == gi_188) return (0);
      gi_188 = Time[0];
      if (!IsTradeAllowed()) {
         gi_188 = Time[1];
         MathSrand(TimeCurrent());
         Sleep(MathRand() + 30000);
      }
   }
   if (TradeOnFridays == FALSE && TimeDayOfWeek(TimeCurrent()) == 5) return (0);
   if (In_BUY && MA_Signal() == 1) Trade_BUY();
   if (In_SELL && MA_Signal() == 2) Trade_SELL();
   return (0);
}

int MA_Signal() {
   double l_ima_0 = iMA(Symbol(), 0, Period_Filtring, 0, MODE_EMA, PRICE_CLOSE, 1);
   double l_ima_8 = iMA(Symbol(), 0, Period_Filtring, 0, MODE_EMA, PRICE_CLOSE, 2);
   if (l_ima_0 > l_ima_8) return (1);
   if (l_ima_0 < l_ima_8) return (2);
   return (0);
}

void Trade_BUY() {
   int l_ord_total_0 = OrdersTotal();
   for (int l_pos_4 = 0; l_pos_4 < l_ord_total_0; l_pos_4++) {
      OrderSelect(l_pos_4, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == g_magic_196) return;
   }
   g_ticket_192 = -1;
   double l_price_8 = Out(Aggr_level, f1);
   if (l_price_8 > Bid + 15 * gi_172 * Point && IsTradeAllowed()) {
      if (Modify_SL_TP == FALSE) g_ticket_192 = OrderSend(Symbol(), OP_BUY, lot(gi_168), Ask, 8, Bid - gi_176 * SL_bs * Point, l_price_8, 0, g_magic_196, 0, Blue);
      else {
         g_ticket_192 = OrderSend(Symbol(), OP_BUY, lot(gi_168), Ask, 8, 0, 0, 0, g_magic_196, 0, Blue);
         Sleep(1000 * Modify_SL_TP_Seconds);
         OrderSelect(g_ticket_192, SELECT_BY_TICKET);
         OrderModify(OrderTicket(), OrderOpenPrice(), Bid - gi_176 * SL_bs * Point, l_price_8, OrderExpiration(), CLR_NONE);
      }
      RefreshRates();
      if (g_ticket_192 < 0) {
         Sleep(30000);
         gi_188 = Time[1];
      }
   }
}

void Trade_SELL() {
   int l_ord_total_0 = OrdersTotal();
   for (int l_pos_4 = 0; l_pos_4 < l_ord_total_0; l_pos_4++) {
      OrderSelect(l_pos_4, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == g_magic_200) return;
   }
   g_ticket_192 = -1;
   double l_price_8 = Out(Aggr_level, f2);
   if (l_price_8 < Ask - 15 * gi_172 * Point && IsTradeAllowed()) {
      if (Modify_SL_TP == FALSE) g_ticket_192 = OrderSend(Symbol(), OP_SELL, lot(gi_168), Bid, 8, Ask + gi_176 * SL_bs * Point, l_price_8, 0, g_magic_200, 0, Red);
      else {
         g_ticket_192 = OrderSend(Symbol(), OP_SELL, lot(gi_168), Bid, 8, 0, 0, 0, g_magic_200, 0, Red);
         Sleep(1000 * Modify_SL_TP_Seconds);
         OrderSelect(g_ticket_192, SELECT_BY_TICKET);
         OrderModify(OrderTicket(), OrderOpenPrice(), Ask + gi_176 * SL_bs * Point, l_price_8, OrderExpiration(), CLR_NONE);
      }
      RefreshRates();
      if (g_ticket_192 < 0) {
         Sleep(30000);
         gi_188 = Time[1];
      }
   }
}

double Out(int a_period_0, double ad_4) {
   double lda_12[1000];
   double lda_16[1000];
   double l_ima_20 = iMA(NULL, 0, a_period_0, 0, MODE_LWMA, PRICE_CLOSE, 1);
   double l_ima_28 = iMA(NULL, 0, a_period_0, 0, MODE_SMA, PRICE_CLOSE, 1);
   lda_12[a_period_0] = (6.0 * l_ima_20 - 6.0 * l_ima_28) / (a_period_0 - 1);
   lda_16[a_period_0] = 4.0 * l_ima_28 - 3.0 * l_ima_20 - lda_12[a_period_0];
   for (int li_36 = a_period_0 - 1; li_36 > 0; li_36--) {
      lda_16[li_36] = ad_4 * Close[li_36] + (1 - ad_4) * (lda_16[li_36 + 1] + (lda_12[li_36 + 1]));
      lda_12[li_36] = ad_4 * (lda_16[li_36] - (lda_16[li_36 + 1])) + (1 - ad_4) * (lda_12[li_36 + 1]);
   }
   return (NormalizeDouble(lda_16[1] + lda_12[1], MarketInfo(Symbol(), MODE_DIGITS)));
}

double lot(int ai_0) {
   int li_20;
   double l_lots_24;
   double l_minlot_4 = MarketInfo(Symbol(), MODE_MINLOT);
   double l_maxlot_12 = MarketInfo(Symbol(), MODE_MAXLOT);
   if (Lots == 0.0) {
      li_20 = MathAbs(MathLog(l_minlot_4) / 2.0) + 0.5;
      l_lots_24 = NormalizeDouble(0.00001 * AccountFreeMargin() * ai_0, li_20);
      if (AccountFreeMargin() < l_lots_24 * MarketInfo(Symbol(), MODE_MARGINREQUIRED)) l_lots_24 = NormalizeDouble(AccountFreeMargin() / MarketInfo(Symbol(), MODE_MARGINREQUIRED), li_20);
   } else l_lots_24 = Lots;
   return (MathMax(MathMin(l_lots_24, l_maxlot_12), l_minlot_4));
}

double LastClosedProfit() {
   int l_ticket_0 = LastClosedTicket();
   if (l_ticket_0 > 0)
      if (OrderSelect(l_ticket_0, SELECT_BY_TICKET, MODE_HISTORY)) return (OrderProfit());
   return (0.0);
}

int LastClosedTicket() {
   int l_datetime_0 = 0;
   int l_ticket_4 = -1;
   for (int l_pos_8 = 0; l_pos_8 < OrdersHistoryTotal(); l_pos_8++) {
      if (OrderSelect(l_pos_8, SELECT_BY_POS, MODE_HISTORY)) {
         if (OrderType() <= OP_SELL) {
            if (OrderCloseTime() > l_datetime_0) {
               l_datetime_0 = OrderCloseTime();
               l_ticket_4 = OrderTicket();
            }
         }
      }
   }
   return (l_ticket_4);
}

string MD5(string as_0) {
   int lia_36[16];
   int lia_40[16];
   int lia_52[4];
   string ls_64;
   int li_72;
   int l_str_len_8 = StringLen(as_0);
   int li_12 = l_str_len_8 % 64;
   int li_16 = (l_str_len_8 - li_12) / 64;
   int li_20 = 1732584193;
   int li_24 = -271733879;
   int li_28 = -1732584194;
   int li_32 = 271733878;
   for (int l_count_44 = 0; l_count_44 < li_16; l_count_44++) {
      ls_64 = StringSubstr(as_0, l_count_44 << 6, 64);
      StringToIntegerArray(lia_36, ls_64);
      MD5Transform(li_20, li_24, li_28, li_32, lia_36);
   }
   ArrayInitialize(lia_40, 0);
   ArrayInitialize(lia_52, 0);
   int li_56 = 0;
   if (li_12 > 0) {
      li_72 = li_12 % 4;
      li_16 = li_12 - li_72;
      if (li_16 > 0) {
         ls_64 = StringSubstr(as_0, l_count_44 << 6, li_16);
         li_56 = StringToIntegerArray(lia_40, ls_64);
      }
      for (int l_index_48 = 0; l_index_48 < li_72; l_index_48++) lia_52[l_index_48] = StringGetChar(as_0, l_count_44 << 6 + li_16 + l_index_48);
   }
   lia_52[l_index_48] = 128;
   lia_40[li_56] = CharToInteger(lia_52);
   if (li_12 >= 56) {
      MD5Transform(li_20, li_24, li_28, li_32, lia_40);
      ArrayInitialize(lia_40, 0);
   }
   lia_40[14] = l_str_len_8 << 3;
   lia_40[15] = l_str_len_8 >> 1 & EMPTY_VALUE >> 28;
   MD5Transform(li_20, li_24, li_28, li_32, lia_40);
   return (StringConcatenate(IntegerToString(li_20), IntegerToString(li_24), IntegerToString(li_28), IntegerToString(li_32)));
}

int F(int ai_0, int ai_4, int ai_8) {
   return (ai_0 & ai_4 | ai_0 & ai_8);
}

int G(int ai_0, int ai_4, int ai_8) {
   return (ai_0 & ai_8 | ai_4 & ai_8);
}

int H(int ai_0, int ai_4, int ai_8) {
   return (ai_0 ^ ai_4 ^ ai_8);
}

int I(int ai_0, int ai_4, int ai_8) {
   return (ai_4 ^ ai_0 | ai_8);
}

int AddUnsigned(int ai_0, int ai_4) {
   int li_ret_8 = ai_0 + ai_4;
   return (li_ret_8);
}

int FF(int ai_0, int ai_4, int ai_8, int ai_12, int ai_16, int ai_20, int ai_24) {
   ai_0 = AddUnsigned(ai_0, AddUnsigned(AddUnsigned(F(ai_4, ai_8, ai_12), ai_16), ai_24));
   return (AddUnsigned(RotateLeft(ai_0, ai_20), ai_4));
}

int GG(int ai_0, int ai_4, int ai_8, int ai_12, int ai_16, int ai_20, int ai_24) {
   ai_0 = AddUnsigned(ai_0, AddUnsigned(AddUnsigned(G(ai_4, ai_8, ai_12), ai_16), ai_24));
   return (AddUnsigned(RotateLeft(ai_0, ai_20), ai_4));
}

int HH(int ai_0, int ai_4, int ai_8, int ai_12, int ai_16, int ai_20, int ai_24) {
   ai_0 = AddUnsigned(ai_0, AddUnsigned(AddUnsigned(H(ai_4, ai_8, ai_12), ai_16), ai_24));
   return (AddUnsigned(RotateLeft(ai_0, ai_20), ai_4));
}

int II(int ai_0, int ai_4, int ai_8, int ai_12, int ai_16, int ai_20, int ai_24) {
   ai_0 = AddUnsigned(ai_0, AddUnsigned(AddUnsigned(I(ai_4, ai_8, ai_12), ai_16), ai_24));
   return (AddUnsigned(RotateLeft(ai_0, ai_20), ai_4));
}

int RotateLeft(int ai_0, int ai_4) {
   if (ai_4 == 32) return (ai_0);
   int li_ret_8 = ai_0 << ai_4 | ai_0 >> 1 & EMPTY_VALUE >> (31 - ai_4);
   return (li_ret_8);
}

int StringToIntegerArray(int &aia_0[16], string as_4) {
   int li_12 = StringLen(as_4);
   if (li_12 % 4 != 0) li_12 -= li_12 % 4;
   int l_arr_size_24 = ArraySize(aia_0);
   if (l_arr_size_24 < li_12 / 4) ArrayResize(aia_0, li_12 / 4);
   int l_index_16 = 0;
   for (int li_20 = 0; li_20 < li_12; li_20 += 4) {
      aia_0[l_index_16] = StringGetChar(as_4, li_20) | StringGetChar(as_4, li_20 + 1) << 8 | StringGetChar(as_4, li_20 + 2) << 16 | StringGetChar(as_4, li_20 + 3) << 24;
      l_index_16++;
   }
   return (li_12 / 4);
}

string IntegerToString(int ai_0) {
   string ls_12;
   int lia_20[4];
   string l_str_concat_4 = "";
   lia_20[0] = ai_0 & 255;
   for (int li_24 = 1; li_24 < 4; li_24++) lia_20[li_24] = ai_0 >> 1 & EMPTY_VALUE >> (li_24 << 3 - 1) & 255;
   for (int l_index_28 = 0; l_index_28 < 4; l_index_28++) {
      ls_12 = Dec2Hex(lia_20[l_index_28]);
      l_str_concat_4 = StringConcatenate(l_str_concat_4, ls_12);
   }
   return (l_str_concat_4);
}

string Dec2Hex(int ai_0) {
   int li_4;
   string l_str_concat_8;
   for (int l_count_16 = 0; l_count_16 < 2; l_count_16++) {
      li_4 = ai_0 % 16;
      ai_0 = (ai_0 - li_4) / 16;
      l_str_concat_8 = StringConcatenate(IntToHexString(li_4), l_str_concat_8);
   }
   return (l_str_concat_8);
}

string IntToHexString(int ai_0) {
   int li_12;
   string ls_4 = "0";
   if (ai_0 < 10) li_12 = ai_0 + 48;
   else li_12 = ai_0 + 97 - 10;
   return (StringSetChar(ls_4, 0, li_12));
}

int CharToInteger(int aia_0[4]) {
   return (aia_0[0] | aia_0[1] << 8 | aia_0[2] << 16 | aia_0[3] << 24);
}

void MD5Transform(int &ai_0, int &ai_4, int &ai_8, int &ai_12, int aia_16[16]) {
   int li_36 = 7;
   int li_40 = 12;
   int li_44 = 17;
   int li_48 = 22;
   int li_52 = 5;
   int li_56 = 9;
   int li_60 = 14;
   int li_64 = 20;
   int li_68 = 4;
   int li_72 = 11;
   int li_76 = 16;
   int li_80 = 23;
   int li_84 = 6;
   int li_88 = 10;
   int li_92 = 15;
   int li_96 = 21;
   int li_20 = ai_0;
   int li_24 = ai_4;
   int li_28 = ai_8;
   int li_32 = ai_12;
   ai_0 = FF(ai_0, ai_4, ai_8, ai_12, aia_16[0], li_36, -680876936);
   ai_12 = FF(ai_12, ai_0, ai_4, ai_8, aia_16[1], li_40, -389564586);
   ai_8 = FF(ai_8, ai_12, ai_0, ai_4, aia_16[2], li_44, 606105819);
   ai_4 = FF(ai_4, ai_8, ai_12, ai_0, aia_16[3], li_48, -1044525330);
   ai_0 = FF(ai_0, ai_4, ai_8, ai_12, aia_16[4], li_36, -176418897);
   ai_12 = FF(ai_12, ai_0, ai_4, ai_8, aia_16[5], li_40, D'12.01.2008 01:10:26');
   ai_8 = FF(ai_8, ai_12, ai_0, ai_4, aia_16[6], li_44, -1473231341);
   ai_4 = FF(ai_4, ai_8, ai_12, ai_0, aia_16[7], li_48, -45705983);
   ai_0 = FF(ai_0, ai_4, ai_8, ai_12, aia_16[8], li_36, 1770035416);
   ai_12 = FF(ai_12, ai_0, ai_4, ai_8, aia_16[9], li_40, -1958414417);
   ai_8 = FF(ai_8, ai_12, ai_0, ai_4, aia_16[10], li_44, -42063);
   ai_4 = FF(ai_4, ai_8, ai_12, ai_0, aia_16[11], li_48, -1990404162);
   ai_0 = FF(ai_0, ai_4, ai_8, ai_12, aia_16[12], li_36, 1804603682);
   ai_12 = FF(ai_12, ai_0, ai_4, ai_8, aia_16[13], li_40, -40341101);
   ai_8 = FF(ai_8, ai_12, ai_0, ai_4, aia_16[14], li_44, -1502002290);
   ai_4 = FF(ai_4, ai_8, ai_12, ai_0, aia_16[15], li_48, D'08.03.2009 23:32:09');
   ai_0 = GG(ai_0, ai_4, ai_8, ai_12, aia_16[1], li_52, -165796510);
   ai_12 = GG(ai_12, ai_0, ai_4, ai_8, aia_16[6], li_56, -1069501632);
   ai_8 = GG(ai_8, ai_12, ai_0, ai_4, aia_16[11], li_60, 643717713);
   ai_4 = GG(ai_4, ai_8, ai_12, ai_0, aia_16[0], li_64, -373897302);
   ai_0 = GG(ai_0, ai_4, ai_8, ai_12, aia_16[5], li_52, -701558691);
   ai_12 = GG(ai_12, ai_0, ai_4, ai_8, aia_16[10], li_56, 38016083);
   ai_8 = GG(ai_8, ai_12, ai_0, ai_4, aia_16[15], li_60, -660478335);
   ai_4 = GG(ai_4, ai_8, ai_12, ai_0, aia_16[4], li_64, -405537848);
   ai_0 = GG(ai_0, ai_4, ai_8, ai_12, aia_16[9], li_52, 568446438);
   ai_12 = GG(ai_12, ai_0, ai_4, ai_8, aia_16[14], li_56, -1019803690);
   ai_8 = GG(ai_8, ai_12, ai_0, ai_4, aia_16[3], li_60, -187363961);
   ai_4 = GG(ai_4, ai_8, ai_12, ai_0, aia_16[8], li_64, D'15.11.2006 00:41:41');
   ai_0 = GG(ai_0, ai_4, ai_8, ai_12, aia_16[13], li_52, -1444681467);
   ai_12 = GG(ai_12, ai_0, ai_4, ai_8, aia_16[2], li_56, -51403784);
   ai_8 = GG(ai_8, ai_12, ai_0, ai_4, aia_16[7], li_60, 1735328473);
   ai_4 = GG(ai_4, ai_8, ai_12, ai_0, aia_16[12], li_64, -1926607734);
   ai_0 = HH(ai_0, ai_4, ai_8, ai_12, aia_16[5], li_68, -378558);
   ai_12 = HH(ai_12, ai_0, ai_4, ai_8, aia_16[8], li_72, -2022574463);
   ai_8 = HH(ai_8, ai_12, ai_0, ai_4, aia_16[11], li_76, 1839030562);
   ai_4 = HH(ai_4, ai_8, ai_12, ai_0, aia_16[14], li_80, -35309556);
   ai_0 = HH(ai_0, ai_4, ai_8, ai_12, aia_16[1], li_68, -1530992060);
   ai_12 = HH(ai_12, ai_0, ai_4, ai_8, aia_16[4], li_72, D'03.05.2010 18:59:13');
   ai_8 = HH(ai_8, ai_12, ai_0, ai_4, aia_16[7], li_76, -155497632);
   ai_4 = HH(ai_4, ai_8, ai_12, ai_0, aia_16[10], li_80, -1094730640);
   ai_0 = HH(ai_0, ai_4, ai_8, ai_12, aia_16[13], li_68, 681279174);
   ai_12 = HH(ai_12, ai_0, ai_4, ai_8, aia_16[0], li_72, -358537222);
   ai_8 = HH(ai_8, ai_12, ai_0, ai_4, aia_16[3], li_76, -722521979);
   ai_4 = HH(ai_4, ai_8, ai_12, ai_0, aia_16[6], li_80, 76029189);
   ai_0 = HH(ai_0, ai_4, ai_8, ai_12, aia_16[9], li_68, -640364487);
   ai_12 = HH(ai_12, ai_0, ai_4, ai_8, aia_16[12], li_72, -421815835);
   ai_8 = HH(ai_8, ai_12, ai_0, ai_4, aia_16[15], li_76, 530742520);
   ai_4 = HH(ai_4, ai_8, ai_12, ai_0, aia_16[2], li_80, -995338651);
   ai_0 = II(ai_0, ai_4, ai_8, ai_12, aia_16[0], li_84, -198630844);
   ai_12 = II(ai_12, ai_0, ai_4, ai_8, aia_16[7], li_88, D'16.09.2005 22:53:35');
   ai_8 = II(ai_8, ai_12, ai_0, ai_4, aia_16[14], li_92, -1416354905);
   ai_4 = II(ai_4, ai_8, ai_12, ai_0, aia_16[5], li_96, -57434055);
   ai_0 = II(ai_0, ai_4, ai_8, ai_12, aia_16[12], li_84, 1700485571);
   ai_12 = II(ai_12, ai_0, ai_4, ai_8, aia_16[3], li_88, -1894986606);
   ai_8 = II(ai_8, ai_12, ai_0, ai_4, aia_16[10], li_92, -1051523);
   ai_4 = II(ai_4, ai_8, ai_12, ai_0, aia_16[1], li_96, -2054922799);
   ai_0 = II(ai_0, ai_4, ai_8, ai_12, aia_16[8], li_84, 1873313359);
   ai_12 = II(ai_12, ai_0, ai_4, ai_8, aia_16[15], li_88, -30611744);
   ai_8 = II(ai_8, ai_12, ai_0, ai_4, aia_16[6], li_92, -1560198380);
   ai_4 = II(ai_4, ai_8, ai_12, ai_0, aia_16[13], li_96, 1309151649);
   ai_0 = II(ai_0, ai_4, ai_8, ai_12, aia_16[4], li_84, -145523070);
   ai_12 = II(ai_12, ai_0, ai_4, ai_8, aia_16[11], li_88, -1120210379);
   ai_8 = II(ai_8, ai_12, ai_0, ai_4, aia_16[2], li_92, 718787259);
   ai_4 = II(ai_4, ai_8, ai_12, ai_0, aia_16[9], li_96, -343485551);
   ai_0 = AddUnsigned(ai_0, li_20);
   ai_4 = AddUnsigned(ai_4, li_24);
   ai_8 = AddUnsigned(ai_8, li_28);
   ai_12 = AddUnsigned(ai_12, li_32);
}