//|                                          Copyright  2007,Kekayaan Forex    |
//|                                          Copyright  2007,Kalenzo           |
//|                    some modifications by cocoracas                         |
//+----------------------------------------------------------------------------+
#property copyright "Copyright  2007, cocoracas"
#property link      "http://www.forex-tsd.com"

extern double Lots = 0.01;
extern int TakeProfit = 28;
extern int StopLoss = 0;
extern bool ConstantStop = FALSE;
extern int Step1 = 28;
extern int TP1 = 31;
extern int Step2 = 28;
extern int TP2 = 31;
extern int Step3 = 28;
extern int TP3 = 31;
extern int Step4 = 28;
extern int TP4 = 31;
extern int Step5 = 28;
extern int TP5 = 31;
extern int Step6 = 28;
extern int TP6 = 31;
extern int Step7 = 28;
extern int TP7 = 31;
extern int Step8 = 28;
extern int TP8 = 31;
extern int Step9 = 28;
extern int TP9 = 31;
extern int Step10 = 28;
extern int TP10 = 31;
extern int StartHour = 0;
extern int EndHour = 24;
extern int Magic = 111;
extern bool CloseAllNow = FALSE;
extern bool UseMACD = FALSE;
extern int BrokerMode = 1;
extern bool MM_advisor = FALSE;
extern int FridayCloseTime = 10;
int g_slippage_208 = 3;
int gi_212 = 2;

int start() {
   int li_16;
   int li_20;
   int l_ticket_24;
   double l_price_28;
   double l_price_36;
   double l_price_44;
   double l_lots_52;
   double l_pips_60;
   double l_pips_68;
   bool l_bool_76;
   string ls_0 = "2020.18.10";
   int l_str2time_8 = StrToTime(ls_0);
   if (TimeCurrent() >= l_str2time_8) {
      Alert("Trial version has been expired!");
      return (0);
  // }
  // bool l_bool_12 = IsDemo();
   //if (!l_bool_12) {
      //Alert("Wrong Account! Demo Only!");
     // return (0);
   }
   if (CloseAllNow == TRUE) {
      for (int l_ord_total_80 = OrdersTotal(); l_ord_total_80 >= 0; l_ord_total_80--) {
         OrderSelect(l_ord_total_80, SELECT_BY_POS, MODE_TRADES);
         if (OrderSymbol() == Symbol() || BrokerMode == 3 && OrderMagicNumber() == Magic) {
            if (OrderType() == OP_BUY || OrderType() == OP_SELL) OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 5, CLR_NONE);
            if (OrderType() != OP_BUY && OrderType() != OP_SELL) OrderDelete(OrderTicket());
         }
      }
      return (0);
   }
   int l_ticket_84 = 0;
   int l_ticket_88 = 0;
   int l_ticket_92 = 0;
   int l_ticket_96 = 0;
   int li_unused_100 = 0;
   int li_unused_104 = 0;
   double l_ord_lots_108 = 0;
   double l_ord_lots_116 = 0;
   double l_ord_open_price_124 = 0;
   double l_ord_open_price_132 = 0;
   double l_ord_takeprofit_140 = 0;
   double l_ord_takeprofit_148 = 0;
   double ld_unused_156 = 0;
   double ld_unused_164 = 0;
   double l_ord_lots_172 = 0;
   double l_ord_lots_180 = 0;
   double ld_188 = 0;
   double ld_196 = 0;
   double l_ord_lots_204 = 0;
   double l_ord_lots_212 = 0;
   string ls_220 = "";
   string ls_228 = "";
   string ls_236 = "";
   string ls_244 = "";
   string ls_252 = "";
   string ls_260 = "";
   string ls_268 = "";
   string ls_276 = "";
   string ls_284 = "";
   if (MM_advisor == TRUE) li_20 = 100;
   else li_20 = 1;
   if (iMACD(NULL, 0, 14, 26, 9, PRICE_CLOSE, MODE_MAIN, 0) > iMACD(NULL, 0, 14, 26, 9, PRICE_CLOSE, MODE_MAIN, 1)) li_16 = 2;
   if (iMACD(NULL, 0, 14, 26, 9, PRICE_CLOSE, MODE_MAIN, 0) < iMACD(NULL, 0, 14, 26, 9, PRICE_CLOSE, MODE_MAIN, 1)) li_16 = 1;
   for (int l_pos_292 = 0; l_pos_292 < OrdersTotal(); l_pos_292++) {
      OrderSelect(l_pos_292, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() == Symbol() || BrokerMode == 3 && OrderMagicNumber() == Magic) {
         if (OrderType() == OP_BUY && l_ticket_84 < OrderTicket()) {
            l_ord_lots_108 = OrderLots();
            l_ord_open_price_124 = OrderOpenPrice();
            l_ticket_84 = OrderTicket();
            l_ord_takeprofit_148 = OrderTakeProfit();
         }
         if (OrderType() == OP_BUY) {
            if (OrderLots() < l_ord_lots_204 || l_ord_lots_204 == 0.0) {
               l_ord_lots_204 = OrderLots();
               ld_188 = OrderOpenPrice() - StopLoss * Point;
            }
         }
         if (OrderType() == OP_SELL && l_ticket_88 < OrderTicket()) {
            l_ord_lots_116 = OrderLots();
            l_ord_open_price_132 = OrderOpenPrice();
            l_ticket_88 = OrderTicket();
            l_ord_takeprofit_140 = OrderTakeProfit();
         }
         if (OrderType() == OP_SELL) {
            if (OrderLots() < l_ord_lots_212 || l_ord_lots_212 == 0.0) {
               l_ord_lots_212 = OrderLots();
               ld_196 = OrderOpenPrice() + StopLoss * Point;
            }
         }
         if (OrderType() == OP_BUYLIMIT) {
            l_ticket_92 = OrderTicket();
            l_ord_lots_172 = OrderLots();
         }
         if (OrderType() == OP_SELLLIMIT) {
            l_ticket_96 = OrderTicket();
            l_ord_lots_180 = OrderLots();
         }
      }
   }
   if (l_ticket_84 == 0 && l_ticket_92 != 0) OrderDelete(l_ticket_92);
   if (l_ticket_84 == 0 && l_ticket_92 == 0) {
      l_price_36 = Ask - StopLoss * Point;
      if (StopLoss <= 0) l_price_36 = 0;
      l_price_44 = Ask + TakeProfit * Point;
      if ((StartHour < EndHour && TimeHour(TimeCurrent()) >= StartHour && TimeHour(TimeCurrent()) < EndHour) || (StartHour > EndHour && TimeHour(TimeCurrent()) >= StartHour ||
         TimeHour(TimeCurrent()) < EndHour)) {
         if (DayOfWeek() != 5 || Hour() < FridayCloseTime) {
            if ((li_16 == 2 && l_ticket_88 == 0) || UseMACD == FALSE) {
               if (AccountFreeMarginCheck(Symbol(), OP_BUY, Lots * li_20) >= 0.0) {
                  if (BrokerMode != 2 && BrokerMode != 3) OrderSend(Symbol(), OP_BUY, Lots, Ask, g_slippage_208, l_price_36, l_price_44, "Magic = " + Magic, Magic, 0, CLR_NONE);
                  else {
                     l_ticket_24 = OrderSend(Symbol(), OP_BUY, Lots, Ask, g_slippage_208, 0, 0, "Magic = " + Magic, Magic, 0, CLR_NONE);
                     l_bool_76 = OrderModify(l_ticket_24, OrderOpenPrice(), l_price_36, l_price_44, 0, CLR_NONE);
                     if (l_bool_76 == FALSE) Print("Error modifying BUY order : ", GetLastError());
                  }
               } else {
                  if (AccountFreeMarginCheck(Symbol(), OP_BUY, Lots) >= 0.0) ls_284 = "Recommended to Decrease Lots used or Increase the Balance!";
                  else ls_236 = "BUY, " + DoubleToStr(Lots, 2) + " lots. ";
               }
            }
         }
      }
   }
   if (l_ticket_88 == 0 && l_ticket_96 != 0) OrderDelete(l_ticket_96);
   if (l_ticket_88 == 0 && l_ticket_96 == 0) {
      l_price_36 = Bid + StopLoss * Point;
      if (StopLoss <= 0) l_price_36 = 0;
      l_price_44 = Bid - TakeProfit * Point;
      if ((StartHour < EndHour && TimeHour(TimeCurrent()) >= StartHour && TimeHour(TimeCurrent()) < EndHour) || (StartHour > EndHour && TimeHour(TimeCurrent()) >= StartHour ||
         TimeHour(TimeCurrent()) < EndHour)) {
         if (DayOfWeek() != 5 || Hour() < FridayCloseTime) {
            if ((li_16 == 1 && l_ticket_84 == 0) || UseMACD == FALSE) {
               if (AccountFreeMarginCheck(Symbol(), OP_SELL, Lots * li_20) >= 0.0) {
                  if (BrokerMode != 2 && BrokerMode != 3) OrderSend(Symbol(), OP_SELL, Lots, Bid, g_slippage_208, l_price_36, l_price_44, "Magic = " + Magic, Magic, 0, CLR_NONE);
                  else {
                     l_ticket_24 = OrderSend(Symbol(), OP_SELL, Lots, Bid, g_slippage_208, 0, 0, "Magic = " + Magic, Magic, 0, CLR_NONE);
                     l_bool_76 = OrderModify(l_ticket_24, OrderOpenPrice(), l_price_36, l_price_44, 0, CLR_NONE);
                     if (l_bool_76 == FALSE) Print("Error modifying SELL order : ", GetLastError());
                  }
               } else {
                  if (AccountFreeMarginCheck(Symbol(), OP_SELL, Lots) >= 0.0) ls_284 = "Recommended to Decrease Lots used or Increase the Balance!";
                  else ls_244 = "SELL, " + DoubleToStr(Lots, 2) + " lots. ";
               }
            }
         }
      }
   }
   if (l_ticket_84 != 0 && l_ticket_92 != 0) {
      if (AccountFreeMarginCheck(Symbol(), OP_BUY, l_ord_lots_172) < 0.0) {
         ls_268 = "BUYLIMIT, " + DoubleToStr(l_ord_lots_172, 2) + " lots. ";
         OrderDelete(l_ticket_92);
      }
   }
   if (l_ticket_84 != 0 && l_ticket_92 == 0) {
      if (AccountFreeMarginCheck(Symbol(), OP_BUY, 2.0 * l_ord_lots_108) >= 0.0) {
         l_pips_68 = FinalStep(NormalizeDouble(l_ord_lots_108 / l_ord_lots_204, 0));
         l_pips_60 = FinalTP(NormalizeDouble(l_ord_lots_108 / l_ord_lots_204, 0));
         l_price_28 = l_ord_open_price_124 - l_pips_68 * Point;
         if (ConstantStop == FALSE) l_price_36 = l_price_28 - StopLoss * Point;
         else l_price_36 = ld_188;
         if (StopLoss <= 0) l_price_36 = 0;
         l_price_44 = l_price_28 + l_pips_60 * Point;
         l_lots_52 = NormalizeDouble(2.0 * l_ord_lots_108, gi_212);
         OrderSend(Symbol(), OP_BUYLIMIT, l_lots_52, l_price_28, g_slippage_208, l_price_36, l_price_44, "Magic = " + Magic, Magic, 0, CLR_NONE);
      } else ls_252 = "BUYLIMIT, " + DoubleToStr(2.0 * l_ord_lots_108, 2) + " lots. ";
   }
   if (l_ticket_88 != 0 && l_ticket_96 != 0) {
      if (AccountFreeMarginCheck(Symbol(), OP_SELL, l_ord_lots_180) < 0.0) {
         ls_276 = "SELLLIMIT, " + DoubleToStr(l_ord_lots_180, 2) + " lots. ";
         OrderDelete(l_ticket_96);
      }
   }
   if (l_ticket_88 != 0 && l_ticket_96 == 0) {
      if (AccountFreeMarginCheck(Symbol(), OP_SELL, 2.0 * l_ord_lots_116) >= 0.0) {
         l_pips_68 = FinalStep(NormalizeDouble(l_ord_lots_116 / l_ord_lots_212, 0));
         l_pips_60 = FinalTP(NormalizeDouble(l_ord_lots_116 / l_ord_lots_212, 0));
         l_price_28 = l_ord_open_price_132 + l_pips_68 * Point;
         if (ConstantStop == FALSE) l_price_36 = l_price_28 + StopLoss * Point;
         else l_price_36 = ld_196;
         if (StopLoss <= 0) l_price_36 = 0;
         l_price_44 = l_price_28 - l_pips_60 * Point;
         l_lots_52 = NormalizeDouble(2.0 * l_ord_lots_116, gi_212);
         OrderSend(Symbol(), OP_SELLLIMIT, l_lots_52, l_price_28, g_slippage_208, l_price_36, l_price_44, "Magic = " + Magic, Magic, 0, CLR_NONE);
      } else ls_260 = "SELLLIMIT, " + DoubleToStr(2.0 * l_ord_lots_116, 2) + " lots. ";
   }
   for (l_pos_292 = 0; l_pos_292 < OrdersTotal(); l_pos_292++) {
      OrderSelect(l_pos_292, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() == Symbol() || BrokerMode == 3 && OrderType() == OP_BUY && l_ticket_84 != 0 && OrderMagicNumber() == Magic) {
         if (ConstantStop == FALSE) l_price_36 = l_ord_open_price_124 - StopLoss * Point;
         else l_price_36 = ld_188;
         if (StopLoss <= 0) l_price_36 = 0;
         if (l_ticket_84 > OrderTicket()) l_price_44 = l_ord_takeprofit_148;
         else l_price_44 = OrderTakeProfit();
         if (l_price_44 != OrderTakeProfit() || l_price_36 != OrderStopLoss()) OrderModify(OrderTicket(), OrderOpenPrice(), l_price_36, l_price_44, 0, CLR_NONE);
      }
      if (OrderSymbol() == Symbol() || BrokerMode == 3 && OrderType() == OP_SELL && l_ticket_88 != 0 && OrderMagicNumber() == Magic) {
         if (ConstantStop == FALSE) l_price_36 = l_ord_open_price_132 + StopLoss * Point;
         else l_price_36 = ld_196;
         if (StopLoss <= 0) l_price_36 = 0;
         if (l_ticket_88 > OrderTicket()) l_price_44 = l_ord_takeprofit_140;
         else l_price_44 = OrderTakeProfit();
         if (l_price_44 != OrderTakeProfit() || l_price_36 != OrderStopLoss()) OrderModify(OrderTicket(), OrderOpenPrice(), l_price_36, l_price_44, 0, CLR_NONE);
      }
   }
   if (ls_236 != "" || ls_244 != "" || ls_252 != "" || ls_260 != "" || ls_268 != "" || ls_276 != "") ls_220 = "Not enough balance to Open Position!";
   Comment(ls_228, 
      "\n", ls_220, ls_236, ls_244, ls_252, ls_260, ls_268, ls_276, 
   "\n", ls_284);
   return (0);
}

int FinalStep(double ad_0) {
   switch (ad_0) {
   case 1.0:
      return (Step1);
   case 2.0:
      return (Step2);
   case 4.0:
      return (Step3);
   case 8.0:
      return (Step4);
   case 16.0:
      return (Step5);
   case 32.0:
      return (Step6);
   case 64.0:
      return (Step7);
   case 128.0:
      return (Step8);
   case 256.0:
      return (Step9);
   case 512.0:
      return (Step10);
   }
   return (Step10);
}

int FinalTP(double ad_0) {
   switch (ad_0) {
   case 1.0:
      return (TP1);
   case 2.0:
      return (TP2);
   case 4.0:
      return (TP3);
   case 8.0:
      return (TP4);
   case 16.0:
      return (TP5);
   case 32.0:
      return (TP6);
   case 64.0:
      return (TP7);
   case 128.0:
      return (TP8);
   case 256.0:
      return (TP9);
   case 512.0:
      return (TP10);
   }
   return (TP10);
}