//+--------------------------------------------------------------------------------------+
//|                                                              CloseAll_AllSymbols.mq4 |
//|                                                   Copyright © 2012, Patrick M. White |
//| https://sites.google.com/site/marketformula/mt4-scripts/close-all-trades-all-symbols |
//+--------------------------------------------------------------------------------------+
#property copyright "Copyright © 2012, Patrick M. White"
#property link      "https://sites.google.com/site/marketformula/"
// last updated December 1, 2012

// when MagicNumber = -1 then close all magic numbers
extern int MagicNumber = -1;

// pips of slippage to allow
extern int Slippage = 7; 

//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {
//----
   int OpenOrders = 0;
   OpenOrders = CountAllOpenTrades();
   while(OpenOrders >0) {
      CloseAll(Slippage, MagicNumber);
      OpenOrders = CountAllOpenTrades();
   }
//----
   return(0);
  }
//+------------------------------------------------------------------+
// when MagicNumber = -1 then close all magic numbers
void CloseAll(int Slippage, int MagicNumber) {
   bool closed = false;
   for (int i = OrdersTotal()-1; i >=0; i--) {
      OrderSelect(0, SELECT_BY_POS, MODE_TRADES);
      while(IsTradeContextBusy()) Sleep(100);
      RefreshRates();
      if (OrderType() == OP_BUY && (MagicNumber == OrderMagicNumber() || MagicNumber == -1)) {
        closed = OrderClose( OrderTicket(), OrderLots(), 
        NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),MarketInfo(OrderSymbol(),MODE_DIGITS)), Slippage, White);
      }
      if (OrderType() == OP_SELL && (MagicNumber == OrderMagicNumber() || MagicNumber == -1)) {
        closed = OrderClose( OrderTicket(), OrderLots(), 
        NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),MarketInfo(OrderSymbol(),MODE_DIGITS)), Slippage, White);
      }
   }
}

int CountAllOpenTrades() {
   int count = 0;
   for (int i = 0; i < OrdersTotal(); i++) {
      OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      if((OrderType() == OP_BUY || OrderType()==OP_SELL) &&
      (MagicNumber == -1 || MagicNumber == OrderMagicNumber())) {
         count +=1;
      }
   }
   return(count);
}

