//+------------------------------------------------------------------+
#property copyright "Vladimir Khlistov"
#property link      "http://cmillion.narod.ru"
#property show_inputs
#include <WinUser32.mqh>
//+------------------------------------------------------------------+
extern int   Magic       = 0;   //закрывать только сделки с магиком 0-открытые вручную
extern bool  MagicAll    = true;//если true - закрывать все
extern int   Profit      = 0;   //закрывать только сделки с профитом больше Profit
extern int   TipOrder    = 0;   //(0) - все ордера   (1) - Buy     (-1) - Sell
extern bool  SymbolAll   = false;//если true - все валютные пары   false - только текущие
extern bool  DeleteOrders= true;//если true - удалять и отложенные   false - только рыночные
extern int   attempts   = 10;    //кол-во попыток закрытия
int   slippage    = 5;
int nn;
//+------------------------------------------------------------------+
int start()
{  
   Comment("Запуск скрипта CloseAllOrders ",TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS));
   if (Digits==5 || Digits==3) slippage=30;
   bool error=true;
   int Ошибка,DIGITS,OT,Ticket;
   string txt;
   double ASK,BID,POINT;
   if (!MagicAll)  txt=StringConcatenate(txt,"Cкрипт закрытия ордеров с Magic=",Magic);
   else  txt=StringConcatenate(txt,"Cкрипт закрытия всех ордеров");
   Comment("");
   int ret=MessageBox("Закрыть все ордера (Да)   Закрыть только профитные (Нет)",
       txt, MB_YESNOCANCEL|MB_TOPMOST);
   if (ret==IDCANCEL) return;
   while(true)
   {
      for (int j = OrdersTotal()-1; j >= 0; j--)
      {
         if (OrderSelect(j, SELECT_BY_POS))
         {
            if ((OrderSymbol() == Symbol()||SymbolAll) && (OrderMagicNumber() == Magic || MagicAll))
            {
               DIGITS = MarketInfo(OrderSymbol(),MODE_DIGITS);
               ASK = NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),DIGITS);
               BID = NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),DIGITS);
               POINT = MarketInfo(OrderSymbol(),MODE_POINT);
               OT = OrderType();
               Ticket=OrderTicket();
               if (OT==OP_BUY && (TipOrder == 1||TipOrder ==0)) 
               {
                  if (ret==IDNO && Profit > (BID-OrderOpenPrice())/POINT) continue;
                  error=OrderClose(Ticket,OrderLots(),BID,slippage,Red);
                  if (error) Alert("Закрыт ордер N ",Ticket,"  прибыль ",OrderProfit(),
                                     "     ",TimeToStr(TimeCurrent(),TIME_SECONDS));
               }
               if (OT==OP_SELL && (TipOrder ==-1||TipOrder ==0)) 
               {
                  if (ret==IDNO && Profit > (OrderOpenPrice()-ASK)/POINT) continue;
                  error=OrderClose(Ticket,OrderLots(),ASK,slippage,Red);
                  if (error) Alert("Закрыт ордер N ",Ticket,"  прибыль ",OrderProfit(),
                                     "     ",TimeToStr(TimeCurrent(),TIME_SECONDS));
               }
               if (OT>1 && DeleteOrders) 
                  if (OrderDelete(Ticket))
                     Comment("Ордер ",Ticket," успешно удален ",TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS));
                  else
                     Comment("Ордер ",Ticket," ошибка удаления ",GetLastError());
               
               if (!error) 
               {
                  Ошибка = GetLastError();
                  if (Ошибка<2) continue;
                  if (Ошибка==129) 
                  {  Comment("Неправильная цена ",TimeToStr(TimeCurrent(),TIME_SECONDS));
                     Sleep(5000);
                     RefreshRates();
                     continue;
                  }
                  if (Ошибка==146) 
                  {
                     int ret1=MessageBox("Подсистема торговли занята"," ", 
                         MB_RETRYCANCEL|MB_TOPMOST|MB_ICONWARNING);
                     if (ret1==IDCANCEL) return;
                     j++;
                     if (IsTradeContextBusy()) Sleep(2000);
                     continue;
                  }
                  Comment("Ошибка ",Ошибка," закрытия ордера N ",Ticket,"     ",TimeToStr(TimeCurrent(),TIME_SECONDS));
               }
            }
         }
      }
      int n=0;
      for (j = 0; j < OrdersTotal(); j++)
      {
         if (OrderSelect(j, SELECT_BY_POS))
         {
            if ((OrderSymbol() == Symbol()||SymbolAll) && (OrderMagicNumber() == Magic || MagicAll))
            {
               DIGITS = MarketInfo(OrderSymbol(),MODE_DIGITS);
               ASK = NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),DIGITS);
               BID = NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),DIGITS);
               POINT = MarketInfo(OrderSymbol(),MODE_POINT);
               if (OrderType()==OP_BUY  && (TipOrder == 1||TipOrder ==0))
               {
                  if (ret==IDNO && Profit > (BID-OrderOpenPrice())/POINT) continue;
                  n++;
               }
               if (OrderType()==OP_SELL && (TipOrder ==-1||TipOrder ==0))
               {
                  if (ret==IDNO && Profit > (OrderOpenPrice()-ASK)/POINT) continue;
                  n++;
               }
               if (OT>1 && DeleteOrders) n++;
            }
         }  
      }
      if (n==0) break;
      nn++;
      if (nn>attempts) {Comment("Не удалось закрыть все сделки, осталось еще ",n);break;}
      Sleep(1000);
      RefreshRates();
   }
   return(0);
}
//+------------------------------------------------------------------+

