//+------------------------------------------------------------------+
//|                                        estrategia fechamento.mqh |
//|                                  Copyright 2024, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property strict
//+------------------------------------------------------------------+
//| defines                                                          |
//+------------------------------------------------------------------+
// #define MacrosHello   "Hello, world!"
// #define MacrosYear    2010
//+------------------------------------------------------------------+
//| DLL imports                                                      |
//+------------------------------------------------------------------+
// #import "user32.dll"
//   int      SendMessageA(int hWnd,int Msg,int wParam,int lParam);
// #import "my_expert.dll"
//   int      ExpertRecalculate(int wParam,int lParam);
// #import
//+------------------------------------------------------------------+
//| EX5 imports                                                      |
//+------------------------------------------------------------------+
// #import "stdlib.ex5"
//   string ErrorDescription(int error_code);
// #import
//+------------------------------------------------------------------+


  bool FechaTodasOrdens_salvando_lucro(int Buy_SEll,int MAGIC, int takeprofit, int slippage_imp, double lucro)
  {
   string v_ticket;
   int Total_ordem;
   int ticket[2000];
   int contador=0;
   bool res;
   int  error;
   double Lucro=0;
   double negativo=0;
   double volumes_lotes = 10000;
   int contadornegativo = 0;
   int ticketNegativo[3];
   int contadorTicketNeg=0;
   int Maior_ticket=0;
   bool Autoriza_Close=false;
   double swap=0;
   int contador_total_ordem=0;
   

   Total_ordem=OrdersTotal();

   for(int i=0; i<Total_ordem; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)
         break;
      if((OrderMagicNumber()==MAGIC) && 
         (OrderSymbol()==Symbol()) && 
         (OrderType()==Buy_SEll)
         )
        {
         if(OrderTicket()>Maior_ticket)
           {
            Maior_ticket=OrderTicket();
           }
         contador_total_ordem++;  
         Lucro=Lucro+OrderProfit();
         swap = swap + OrderSwap();
        }
     }
     
     
     if (swap < 0)
     {
        swap  = swap * (-1);
     }    
           
     if (Lucro <= swap)
     {
        return(false);
     }
  
     
   if (OrderSelect(Maior_ticket,SELECT_BY_TICKET,MODE_TRADES)==false)
      return(false);
  
  
   RefreshRates();
   if((OrderType()==OP_BUY) && 
      (Buy_SEll==OP_BUY) && 
      ((Bid-OrderOpenPrice()) >= takeprofit* Point)
      )
     {
      Autoriza_Close=true;
     }
   else  if((OrderType()==OP_SELL) && 
            (Buy_SEll==OP_SELL) && 
            ((OrderOpenPrice()-Ask)>=takeprofit* Point)
           )
        {
         Autoriza_Close=true;
        }

   for(int j=0;j<Total_ordem; j++)
     {
      if(OrderSelect(j,SELECT_BY_POS,MODE_TRADES)==false)
        break;

      if(( OrderMagicNumber()==MAGIC))
        {
         if(
            (OrderType()==OP_BUY) && 
            (Buy_SEll==OP_BUY) && 
            (Autoriza_Close==true) && 
            ((Lucro - swap) > lucro)
            )

           {
            ticket[contador]=OrderTicket();
            contador++;
           }
         if(
            (OrderType()==OP_SELL) && 
            (Buy_SEll==OP_SELL) && 
            (Autoriza_Close==true) && 
            ((Lucro - swap) > lucro)
            )
           {
            ticket[contador]=OrderTicket();
            contador++;
           }
        }
     }

  
   if(IsTradeContextBusy()==true)
      return(false);

      for(int k=contador-1; k>=0; k--)
     {
      RefreshRates();
    //  Print("FECHA TICKET = ",ticket[i]);
      if (OrderSelect(ticket[k],SELECT_BY_TICKET,MODE_TRADES)== false)
        break;
      if (OrderType() == OP_BUY) 
      {
         res=OrderClose(ticket[k],OrderLots(),Bid,slippage_imp,White);
         if(res!=true)
           {
            error=GetLastError();
            while(res==false)
              {
               Sleep(5000);
               RefreshRates();
               res=OrderClose(ticket[k],OrderLots(),Bid,slippage_imp,White);
               if(res==false)
                 {
                  error=GetLastError();
                 }
              }
           }
           else error=0;
      }
      if (OrderType() == OP_SELL) 
      {
         res=OrderClose(ticket[k],OrderLots(),Ask,slippage_imp,White);
         if(res!=true)
           {
            error=GetLastError();
            while(res==false)
              {
               Sleep(5000);
               RefreshRates();
               res=OrderClose(ticket[k],OrderLots(),Ask,slippage_imp,White);
               if(res==false)
                 {
                  error=GetLastError();
                 }
              }
           }
           else error=0;
      }
      
        
     }  
   return(true);
  }