//+------------------------------------------------------------------+
//|                                          CloseByTargetEquity.mq4 |
//|                        Copyright 2022, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

input bool     InpFilterByMagic  = false;
input int      InpMagic          = 12345;            // magic number
input int      InpSlippage       = 10;            // Slippage
input bool     InpCloseOnTarget  = false;
input double   InpTargetPersen   = 0;
input double   InpTargetMoney    = 0;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
//---

//---
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---

}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
//---
   if(InpCloseOnTarget)
      CloseByTargetEquity();
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CloseByTargetEquity()
{
   double TargetEquity = 0;

   if (InpTargetPersen > 0)
      TargetEquity = AccountBalance() * (100 + InpTargetPersen) / 100;
   else
      TargetEquity = (AccountBalance()*InpTargetMoney) >= AccountEquity();
   if (TargetEquity == 0) return;
   if (AccountBalance() < TargetEquity) return;
   int tkt[], c, newsize;

   for (int r = 5; r > 0; r--) {
      Print("----------------------");
      Print("Our Target reached");
      if (OrdersTotal() == 0) break;
      ArrayResize(tkt, OrdersTotal());
      ArrayInitialize(tkt, -1);
      newsize = 0;
      for (c=0 ; c<OrdersTotal() ; c++) {
         if (!OrderSelect(c, SELECT_BY_POS, MODE_TRADES)) continue;
         tkt[newsize] = OrderTicket();
         newsize++;
      }
      ArrayResize(tkt, newsize);
      for(c=0; c < newsize; c++) {
         if (!OrderSelect(tkt[c], SELECT_BY_TICKET)) continue;
         if (OrderCloseTime() > 0) continue;
         if (InpFilterByMagic && OrderMagicNumber() != InpMagic) continue;
         RefreshRates();
         switch (OrderType()) {
         case OP_BUY:
         case OP_SELL:
            if(OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID + OrderType()), InpSlippage))
               Print("Close tiket #", OrderTicket(), " on target equity");
            break;
         default :
            if(OrderDelete(OrderTicket()))
               Print("Delete tiket #", OrderTicket(), " on target equity");
         }
      }
   }
}
//+------------------------------------------------------------------+
