extern bool Buy = TRUE;
extern bool Sell = FALSE;
extern double Lots = 0.01;
extern double TakeProfit = 24.0;
extern int MaxCountOrders = 10;
extern bool SafeEquity = FALSE;
extern double SafeEquityRisk = 10.0;
extern double slippage = 3.0;
extern int MagicNumber = 12469;
extern int MagicLoc = 221691;
extern double Delta = 5.0;
extern int TF = 15;
extern bool lock = TRUE;
extern int lockdistans = 40;
extern double lockPlusLot = 2.0;
extern int lockcloseloss = 20;
extern int lockzero = 10;
extern double lockcloseprofit = 10.0;
extern int lockreplay = 20;
int gi_184 = 100;
extern double MaxLots = 1000.0;
extern bool MACD = TRUE;
extern int TF_MACD = 15;
double gd_212 = 1.6;
bool gi_220 = FALSE;
double gd_224 = 48.0;
double g_pips_232 = 500.0;
double gd_240 = 0.0;
bool gi_248 = TRUE;
bool gi_252 = FALSE;
int gi_256 = 1;
double g_price_260;
double gd_268;
double gd_unused_276;
double gd_unused_284;
double g_price_292;
double g_bid_300;
double g_ask_308;
double gd_316;
double gd_324;
double gd_332;
bool gi_340;
string gs_344 = "Forex trade";
int g_datetime_352 = 0;
int gi_356;
int gi_360 = 0;
double gd_364;
int g_pos_372 = 0;
int gi_376;
double gd_384 = 0.0;
bool gi_392 = FALSE;
bool gi_396 = FALSE;
bool gi_400 = FALSE;
int gi_404;
bool gi_408 = FALSE;
int g_datetime_412 = 0;
int g_datetime_416 = 0;
double gd_420;
double gd_428;
bool g_bool_436;
int g_acc_number_444;

int init() {
   gd_332 = MarketInfo(Symbol(), MODE_SPREAD) * Point;
   g_acc_number_444 = AccountNumber();
   switch (MarketInfo(Symbol(), MODE_MINLOT)) {
   case 0.001:
      gd_240 = 3;
      break;
   case 0.01:
      gd_240 = 2;
      break;
   case 0.1:
      gd_240 = 1;
      break;
   case 1.0:
      gd_240 = 0;
   }
   g_bool_436 = (!IsDemo()) && !IsTesting();
   return (0);
}

int deinit() {
   return (0);
}

int start() {
   double order_lots_0;
   double order_lots_8;
   double iclose_16;
   double iclose_24;
   double ld_32;
   double order_lots_40;
   double ld_48;
   double ld_56;
   double price_64;
   double price_72;
   double price_80;
   double ld_88;
   double ld_96;
   bool li_108;
   int cmd_112;
   int li_116;
   int li_120;
   int magic_124;
   int ticket_132;
   double price_136;
   double ld_144;
   if (gi_220) {
      if (TimeCurrent() >= gi_356) {
         f0_3();
         Print("Closed All due to TimeOut");
      }
   }
   int stoplevel_104 = MarketInfo(Symbol(), MODE_STOPLEVEL);
   int ticket_128 = 0;
   for (g_pos_372 = OrdersTotal() - 1; g_pos_372 >= 0; g_pos_372--) {
      OrderSelect(g_pos_372, SELECT_BY_POS, MODE_TRADES);
      price_64 = NormalizeDouble(OrderOpenPrice(), Digits);
      magic_124 = OrderMagicNumber();
      cmd_112 = OrderType();
      order_lots_40 = OrderLots();
      if (OrderSymbol() == Symbol()) {
         if (magic_124 == MagicNumber) {
            if (cmd_112 < OP_BUYLIMIT) ld_32 += OrderProfit();
            if (lock) {
               if (cmd_112 == OP_BUY) {
                  li_116++;
                  ld_56 += order_lots_40;
                  if (price_80 > price_64 || price_80 == 0.0) price_80 = price_64;
               }
               if (cmd_112 == OP_SELL) {
                  li_120++;
                  ld_48 += order_lots_40;
                  if (price_72 < price_64 || price_72 == 0.0) price_72 = price_64;
               }
            }
         }
         if (lock && magic_124 == MagicLoc) {
            li_108 = TRUE;
            ld_88 += OrderProfit();
            ticket_132 = OrderTicket();
            if (cmd_112 > OP_SELL) ticket_128 = ticket_132;
            if (lockzero >= stoplevel_104 && lockzero != 0 && cmd_112 < OP_BUYLIMIT) {
               ld_96 = NormalizeDouble(OrderStopLoss(), Digits);
               if (cmd_112 == OP_BUY) {
                  if (NormalizeDouble(Bid - lockzero * Point, Digits) >= price_64) {
                     if (price_64 > ld_96)
                        if (OrderModify(ticket_132, price_64, price_64, OrderTakeProfit(), 0, White)) Print("������� �������� -------------------- ������� lockzero");
                  }
               }
               if (cmd_112 == OP_SELL) {
                  if (NormalizeDouble(Ask + lockzero * Point, Digits) <= price_64) {
                     if (price_64 < ld_96 || ld_96 == 0.0)
                        if (OrderModify(ticket_132, price_64, price_64, OrderTakeProfit(), 0, White)) Print("������� �������� -------------------- ������� lockzero");
                  }
               }
            }
         }
      }
   }
   Comment("Profit ", DoubleToStr(ld_32, 2), 
      "\nProfitLoc ", DoubleToStr(ld_88, 2), 
   "\nSum ", DoubleToStr(ld_88 + ld_32, 2));
   if (ld_88 + ld_32 >= lockcloseprofit) {
      Print("����� ������� �������� ", DoubleToStr(ld_88 + ld_32, 2), " ��������� ������ ");
      f0_3();
      return;
   }
   if (lock) {
      if (!li_108) {
         if (li_120 >= MaxCountOrders) {
            ld_144 = f0_7();
            if (lockcloseloss >= stoplevel_104 && lockcloseloss != 0) price_136 = NormalizeDouble(Bid + ld_144 - lockcloseloss * Point, Digits);
            else price_136 = 0;
            if (OrderSend(Symbol(), OP_BUYSTOP, ld_48 + lockPlusLot, NormalizeDouble(Ask + ld_144, Digits), slippage, price_136, 0, "loc", MagicLoc, 0, Blue) == -1) Print("Error ", GetLastError(), "   Order Send Buy   Bid = ", Ask, "    Price = ", NormalizeDouble(Ask + ld_144, Digits), "    SL = ", price_136);
         }
         if (li_116 >= MaxCountOrders) {
            ld_144 = f0_7();
            if (lockcloseloss >= stoplevel_104 && lockcloseloss != 0) price_136 = NormalizeDouble(Ask - ld_144 + lockcloseloss * Point, Digits);
            else price_136 = 0;
            if (OrderSend(Symbol(), OP_SELLSTOP, ld_56 + lockPlusLot, NormalizeDouble(Bid - ld_144, Digits), slippage, price_136, 0, "loc", MagicLoc, 0, Red) == -1) Print("Error ", GetLastError(), "   Order Send Sell   Bid = ", Bid, "    Price = ", NormalizeDouble(Bid - ld_144, Digits), "    SL = ", price_136);
         }
      } else
         if (ticket_128 != 0 && li_120 + li_116 < MaxCountOrders) OrderDelete(ticket_128);
   }
   if (SafeEquity) {
      if (ld_32 < 0.0 && MathAbs(ld_32) > SafeEquityRisk / 100.0 * f0_6()) {
         f0_3();
         Print("Closed All due to Stop Out");
         gi_408 = FALSE;
      }
   }
   if (g_datetime_352 == iTime(NULL, TF, 0)) return (0);
   g_datetime_352 = iTime(NULL, TF, 0);
   gi_376 = f0_12();
   if (gi_376 == 0) gi_340 = FALSE;
   for (g_pos_372 = OrdersTotal() - 1; g_pos_372 >= 0; g_pos_372--) {
      OrderSelect(g_pos_372, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) {
         cmd_112 = OrderType();
         if (cmd_112 == OP_BUY) {
            gi_396 = TRUE;
            gi_400 = FALSE;
            order_lots_0 = OrderLots();
            break;
         }
         if (cmd_112 == OP_SELL) {
            gi_396 = FALSE;
            gi_400 = TRUE;
            order_lots_8 = OrderLots();
            break;
         }
      }
   }
   if (gi_376 > 0 && gi_376 < MaxCountOrders) {
      RefreshRates();
      gd_316 = f0_2();
      gd_324 = f0_5();
      if (gi_396 && gd_316 - Ask >= Delta * Point) gi_392 = TRUE;
      if (gi_400 && Bid - gd_324 >= Delta * Point) gi_392 = TRUE;
   }
   if (gi_376 < 1) {
      gi_400 = FALSE;
      gi_396 = FALSE;
      gi_392 = TRUE;
      gd_268 = AccountEquity();
   }
   if (gi_392) {
      gd_316 = f0_2();
      gd_324 = f0_5();
      if (gi_400) {
         if (gi_252) {
            f0_1(0, 1);
            gd_364 = NormalizeDouble(gd_212 * order_lots_8, gd_240);
         } else gd_364 = f0_10(OP_SELL);
         if (gi_248) {
            gi_360 = gi_376;
            if (gd_364 > 0.0) {
               RefreshRates();
               gi_404 = f0_11(1, gd_364, Bid, slippage, Ask, 0, 0, gs_344 + "-" + gi_360, MagicNumber, 0, HotPink);
               if (gi_404 < 0) {
                  Print("Error: ", GetLastError());
                  return (0);
               }
               gd_324 = f0_5();
               gi_392 = FALSE;
               gi_408 = TRUE;
            }
         }
      } else {
         if (gi_396) {
            if (gi_252) {
               f0_1(1, 0);
               gd_364 = NormalizeDouble(gd_212 * order_lots_0, gd_240);
            } else gd_364 = f0_10(OP_BUY);
            if (gi_248) {
               gi_360 = gi_376;
               if (gd_364 > 0.0) {
                  gi_404 = f0_11(0, gd_364, Ask, slippage, Bid, 0, 0, gs_344 + "-" + gi_360, MagicNumber, 0, Lime);
                  if (gi_404 < 0) {
                     Print("Error: ", GetLastError());
                     return (0);
                  }
                  gd_316 = f0_2();
                  gi_392 = FALSE;
                  gi_408 = TRUE;
               }
            }
         }
      }
   }
   if (gi_392 && gi_376 < 1) {
      iclose_16 = iClose(Symbol(), TF, 2);
      iclose_24 = iClose(Symbol(), TF, 1);
      g_bid_300 = Bid;
      g_ask_308 = Ask;
      if ((!gi_400) && !gi_396) {
         gi_360 = gi_376;
         if (iclose_16 > iclose_24) {
            gd_364 = f0_10(OP_SELL);
            if (gd_364 > 0.0) {
               gi_404 = f0_11(1, gd_364, g_bid_300, slippage, g_bid_300, 0, 0, gs_344 + " " + MagicNumber + "-" + gi_360, MagicNumber, 0, HotPink);
               if (gi_404 < 0) {
                  Print(gd_364, "Error: ", GetLastError());
                  return (0);
               }
               gd_316 = f0_2();
               gi_408 = TRUE;
            }
         } else {
            gd_364 = f0_10(OP_BUY);
            if (gd_364 > 0.0) {
               gi_404 = f0_11(0, gd_364, g_ask_308, slippage, g_ask_308, 0, 0, gs_344 + " " + MagicNumber + "-" + gi_360, MagicNumber, 0, Lime);
               if (gi_404 < 0) {
                  Print(gd_364, "Error: ", GetLastError());
                  return (0);
               }
               gd_324 = f0_5();
               gi_408 = TRUE;
            }
         }
      }
      if (gi_404 > 0) gi_356 = TimeCurrent() + 60.0 * (60.0 * gd_224);
      gi_392 = FALSE;
   }
   gi_376 = f0_12();
   g_price_292 = 0;
   double ld_152 = 0;
   for (g_pos_372 = OrdersTotal() - 1; g_pos_372 >= 0; g_pos_372--) {
      OrderSelect(g_pos_372, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) {
         if (OrderType() == OP_BUY || OrderType() == OP_SELL) {
            g_price_292 += OrderOpenPrice() * OrderLots();
            ld_152 += OrderLots();
         }
      }
   }
   if (gi_376 > 0) g_price_292 = NormalizeDouble(g_price_292 / ld_152, Digits);
   if (gi_408) {
      for (g_pos_372 = OrdersTotal() - 1; g_pos_372 >= 0; g_pos_372--) {
         OrderSelect(g_pos_372, SELECT_BY_POS, MODE_TRADES);
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) {
            if (OrderType() == OP_BUY) {
               g_price_260 = g_price_292 + TakeProfit * Point;
               gd_unused_276 = g_price_260;
               gd_384 = g_price_292 - g_pips_232 * Point;
               gi_340 = TRUE;
            }
            if (OrderType() == OP_SELL) {
               g_price_260 = g_price_292 - TakeProfit * Point;
               gd_unused_284 = g_price_260;
               gd_384 = g_price_292 + g_pips_232 * Point;
               gi_340 = TRUE;
            }
         }
      }
   }
   if (gi_408) {
      if (gi_340 == TRUE) {
         for (g_pos_372 = OrdersTotal() - 1; g_pos_372 >= 0; g_pos_372--) {
            OrderSelect(g_pos_372, SELECT_BY_POS, MODE_TRADES);
            if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) OrderModify(OrderTicket(), g_price_292, OrderStopLoss(), g_price_260, 0, Yellow);
            gi_408 = FALSE;
         }
      }
   }
   return (0);
}

double f0_8(double ad_0) {
   return (NormalizeDouble(ad_0, Digits));
}

int f0_1(bool ai_0 = TRUE, bool ai_4 = TRUE) {
   int li_ret_8 = 0;
   for (int pos_12 = OrdersTotal() - 1; pos_12 >= 0; pos_12--) {
      if (OrderSelect(pos_12, SELECT_BY_POS, MODE_TRADES)) {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) {
            if (OrderType() == OP_BUY && ai_0) {
               RefreshRates();
               if (!IsTradeContextBusy()) {
                  if (!OrderClose(OrderTicket(), OrderLots(), f0_8(Bid), 5, CLR_NONE)) {
                     Print("Error close BUY " + OrderTicket());
                     li_ret_8 = -1;
                  }
               } else {
                  if (g_datetime_412 == iTime(NULL, 0, 0)) return (-2);
                  g_datetime_412 = iTime(NULL, 0, 0);
                  Print("Need close BUY " + OrderTicket() + ". Trade Context Busy");
                  return (-2);
               }
            }
            if (OrderType() == OP_SELL && ai_4) {
               RefreshRates();
               if (!IsTradeContextBusy()) {
                  if (!(!OrderClose(OrderTicket(), OrderLots(), f0_8(Ask), 5, CLR_NONE))) continue;
                  Print("Error close SELL " + OrderTicket());
                  li_ret_8 = -1;
                  continue;
               }
               if (g_datetime_416 == iTime(NULL, 0, 0)) return (-2);
               g_datetime_416 = iTime(NULL, 0, 0);
               Print("Need close SELL " + OrderTicket() + ". Trade Context Busy");
               return (-2);
            }
         }
      }
   }
   return (li_ret_8);
}

double f0_10(int a_cmd_0) {
   double lots_4;
   int datetime_12;
   switch (gi_256) {
   case 0:
      lots_4 = Lots;
      break;
   case 1:
      lots_4 = NormalizeDouble(Lots * MathPow(gd_212, gi_360), gd_240);
      break;
   case 2:
      datetime_12 = 0;
      lots_4 = Lots;
      for (int pos_20 = OrdersHistoryTotal() - 1; pos_20 >= 0; pos_20--) {
         if (!(OrderSelect(pos_20, SELECT_BY_POS, MODE_HISTORY))) return (-3);
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) {
            if (datetime_12 < OrderCloseTime()) {
               datetime_12 = OrderCloseTime();
               if (OrderProfit() < 0.0) {
                  lots_4 = NormalizeDouble(OrderLots() * gd_212, gd_240);
                  continue;
               }
               lots_4 = Lots;
               continue;
               return (-3);
            }
         }
      }
   }
   if (AccountFreeMarginCheck(Symbol(), a_cmd_0, lots_4) <= 0.0) return (-1);
   if (GetLastError() == 134/* NOT_ENOUGH_MONEY */) return (-2);
   return (lots_4);
}

int f0_12() {
   int count_0 = 0;
   for (int pos_4 = OrdersTotal() - 1; pos_4 >= 0; pos_4--) {
      OrderSelect(pos_4, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
         if (OrderType() < OP_BUYLIMIT) count_0++;
   }
   return (count_0);
}

void f0_3() {
   int error_4;
   int li_8;
   int cmd_12;
   int magic_16;
   int count_24;
   bool is_closed_0 = TRUE;
   while (true) {
      for (int pos_20 = OrdersTotal() - 1; pos_20 >= 0; pos_20--) {
         if (OrderSelect(pos_20, SELECT_BY_POS)) {
            magic_16 = OrderMagicNumber();
            if (OrderSymbol() == Symbol() && magic_16 == MagicNumber || magic_16 == MagicLoc) {
               cmd_12 = OrderType();
               if (cmd_12 > OP_SELL) OrderDelete(OrderTicket());
               if (cmd_12 == OP_BUY) is_closed_0 = OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Bid, Digits), 3, Blue);
               if (cmd_12 == OP_SELL) is_closed_0 = OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Ask, Digits), 3, Red);
               if (!is_closed_0) {
                  error_4 = GetLastError();
                  if (error_4 >= 2/* COMMON_ERROR */) {
                     if (error_4 == 129/* INVALID_PRICE */) {
                        RefreshRates();
                        continue;
                     }
                     if (error_4 == 146/* TRADE_CONTEXT_BUSY */) {
                        if (!(IsTradeContextBusy())) continue;
                        Sleep(2000);
                        continue;
                     }
                     Print("������ ", error_4, " �������� ������ N ", OrderTicket(), "     ", TimeToStr(TimeCurrent(), TIME_SECONDS));
                  }
               }
            }
         }
      }
      count_24 = 0;
      for (pos_20 = 0; pos_20 < OrdersTotal(); pos_20++) {
         if (OrderSelect(pos_20, SELECT_BY_POS)) {
            if (OrderSymbol() == Symbol() && OrderMagicNumber() == magic_16) {
               cmd_12 = OrderType();
               if (cmd_12 == OP_BUY || cmd_12 == OP_SELL) count_24++;
            }
         }
      }
      if (count_24 == 0) break;
      li_8++;
      if (li_8 > 10) {
         Alert(Symbol(), " �� ������� ������� ��� ������, �������� ��� ", count_24);
         return;
      }
      Sleep(1000);
      RefreshRates();
   }
}

int f0_11(int ai_0, double a_lots_4, double ad_unused_12, int a_slippage_20, double ad_unused_24, int ai_32, int ai_36, string a_comment_40, int a_magic_48, int a_datetime_52, color a_color_56) {
   int ticket_60 = 0;
   int error_64 = 0;
   int count_68 = 0;
   switch (ai_0) {
   case 0:
      if (!(Buy)) break;
      for (count_68 = 0; count_68 < gi_184; count_68++) {
         RefreshRates();
         ticket_60 = OrderSend(Symbol(), OP_BUY, a_lots_4, Ask, a_slippage_20, f0_9(Bid, ai_32), f0_13(Ask, ai_36), a_comment_40, a_magic_48, a_datetime_52, a_color_56);
         error_64 = GetLastError();
         if (error_64 == 0/* NO_ERROR */) break;
         if (!((error_64 == 4/* SERVER_BUSY */ || error_64 == 137/* BROKER_BUSY */ || error_64 == 146/* TRADE_CONTEXT_BUSY */ || error_64 == 136/* OFF_QUOTES */))) break;
         Sleep(5000);
         RefreshRates();
      }
      break;
   case 1:
      if (!(Sell)) break;
      for (count_68 = 0; count_68 < gi_184; count_68++) {
         ticket_60 = OrderSend(Symbol(), OP_SELL, a_lots_4, Bid, a_slippage_20, f0_0(Ask, ai_32), f0_4(Bid, ai_36), a_comment_40, a_magic_48, a_datetime_52, a_color_56);
         error_64 = GetLastError();
         if (error_64 == 0/* NO_ERROR */) break;
         if (!((error_64 == 4/* SERVER_BUSY */ || error_64 == 137/* BROKER_BUSY */ || error_64 == 146/* TRADE_CONTEXT_BUSY */ || error_64 == 136/* OFF_QUOTES */))) break;
         Sleep(5000);
         RefreshRates();
      }
   }
   return (ticket_60);
}

double f0_9(double ad_0, int ai_8) {
   if (ai_8 == 0) return (0);
   return (ad_0 - ai_8 * Point);
}

double f0_0(double ad_0, int ai_8) {
   if (ai_8 == 0) return (0);
   return (ad_0 + ai_8 * Point);
}

double f0_13(double ad_0, int ai_8) {
   if (ai_8 == 0) return (0);
   return (ad_0 + ai_8 * Point);
}

double f0_4(double ad_0, int ai_8) {
   if (ai_8 == 0) return (0);
   return (ad_0 - ai_8 * Point);
}

double f0_6() {
   if (f0_12() == 0) gd_420 = AccountEquity();
   if (gd_420 < gd_428) gd_420 = gd_428;
   else gd_420 = AccountEquity();
   gd_428 = AccountEquity();
   return (gd_420);
}

double f0_2() {
   double order_open_price_0;
   int ticket_8;
   double ld_unused_12 = 0;
   int ticket_20 = 0;
   for (int pos_24 = OrdersTotal() - 1; pos_24 >= 0; pos_24--) {
      OrderSelect(pos_24, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderType() == OP_BUY) {
         ticket_8 = OrderTicket();
         if (ticket_8 > ticket_20) {
            order_open_price_0 = OrderOpenPrice();
            ld_unused_12 = order_open_price_0;
            ticket_20 = ticket_8;
         }
      }
   }
   return (order_open_price_0);
}

double f0_5() {
   double order_open_price_0;
   int ticket_8;
   double ld_unused_12 = 0;
   int ticket_20 = 0;
   for (int pos_24 = OrdersTotal() - 1; pos_24 >= 0; pos_24--) {
      OrderSelect(pos_24, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderType() == OP_SELL) {
         ticket_8 = OrderTicket();
         if (ticket_8 > ticket_20) {
            order_open_price_0 = OrderOpenPrice();
            ld_unused_12 = order_open_price_0;
            ticket_20 = ticket_8;
         }
      }
   }
   return (order_open_price_0);
}

double f0_7() {
   int magic_0;
   for (g_pos_372 = OrdersHistoryTotal() - 1; g_pos_372 >= 0; g_pos_372--) {
      OrderSelect(g_pos_372, SELECT_BY_POS, MODE_HISTORY);
      if (OrderSymbol() == Symbol()) {
         magic_0 = OrderMagicNumber();
         if (magic_0 == MagicNumber) return (lockdistans * Point);
         if (magic_0 == MagicLoc) return (lockreplay * Point);
      }
   }
   return (lockdistans * Point);
}