#include <stdlib.mqh>
#include <WinUser32.mqh>

/******************************************************************************/
#define MAX_TRADES 1000
#define SLIPPAGE_FACTOR 1 // In spread units

/******************************************************************************/
double OrderProfitByTicket(int Ticket)
{
  double Profit = 0;

  if(OrderSelect(Ticket, SELECT_BY_TICKET))
    Profit = OrderProfit();

  return(Profit);
}

/******************************************************************************/
int start()
{
  for(int attempt = 0; attempt < 3; attempt++)
  {
    int i, j;
    int Tickets[MAX_TRADES];
    int TicketsCount = 0;

    /* Find open trades */
    for(i = 0; i < OrdersTotal(); i++)
      if(OrderSelect(i, SELECT_BY_POS) && (OrderType() == OP_BUY || OrderType() == OP_SELL) && OrderSymbol() == Symbol())
      {
        Tickets[TicketsCount] = OrderTicket();
        TicketsCount++;
      }

    if(TicketsCount > 0)
    {
      if(IsTradeAllowed())
      {
        if(attempt == 0)
          if(MessageBox("Что, правда следует закрыть ВСЕ открытые по ТЕКУЩЕМУ ИНСТРУМЕНТУ (" + Symbol() +") позиции?", "Закрытие всех открытых по текущему инструменту (" + Symbol() +") позиций", MB_OKCANCEL | MB_ICONQUESTION) != IDOK)
            break;
        /* Sort found trades by PROFIT criteria */
        for(i = 0; i < TicketsCount - 1; i++)
          for(j = i + 1; j < TicketsCount; j++)
            if(OrderProfitByTicket(Tickets[i]) > OrderProfitByTicket(Tickets[j]))
            {
              int k = Tickets[j];
              Tickets[j] = Tickets[i];
              Tickets[i] = k;
            }

        /* Close sorted trades */
        for(i = 0; i < TicketsCount; i++)
          if(OrderSelect(Tickets[i], SELECT_BY_TICKET))
            if(OrderType() == OP_BUY)
            {
              if(!OrderClose(Tickets[i], OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), SLIPPAGE_FACTOR * MarketInfo(OrderSymbol(), MODE_SPREAD)))
                Print("Ошибка закрытия BUY позиции " + OrderLots() + " лотов по цене " + MarketInfo(OrderSymbol(), MODE_BID) + " с проскальзыванием " + (SLIPPAGE_FACTOR * MarketInfo(OrderSymbol(), MODE_SPREAD)) + " пунктов: " + ErrorDescription(GetLastError()));
            }
            else
              if(OrderType() == OP_SELL)
              {
                if(!OrderClose(Tickets[i], OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), SLIPPAGE_FACTOR * MarketInfo(OrderSymbol(), MODE_SPREAD)))
                  Print("Ошибка закрытия SELL позиции " + OrderLots() + " лотов по цене " + MarketInfo(OrderSymbol(), MODE_ASK) + " с проскальзыванием " + (SLIPPAGE_FACTOR * MarketInfo(OrderSymbol(), MODE_SPREAD)) + " пунктов: " + ErrorDescription(GetLastError()));
              }
      }
      else
      {
        MessageBox("Не могу закрыть позиции, потому что торговля запрещена\n\nСервис->Настройки->Советники->Разрешить советнику торговать", "Ошибка закрытиz всех открытых по текущему инструменту (" + Symbol() +") позиций", MB_OK);
        break;
      }
    }
    else
    {
      MessageBox("Открытых по текущему инструменту (" + Symbol() +") позиций больше НЕТ!", "Закрытие всех открытых по текущему инструменту (" + Symbol() +") позиций", MB_OK);
      break;
    }
  }

  if(attempt == 3)
    MessageBox("За 3 попытки НЕ СМОГ закрыть все открытые по текущему инструменту (" + Symbol() +") позиции!!!", "Закрытие всех открытых по текущему инструменту (" + Symbol() +") позиций", MB_OK);

  return(0);
}

