Закрытие всех сделок на покупку

 
Пользуюсь функцией:

void allbuyclose()
   {
   for(int x=0;x<=OrdersTotal();x++)
     {
     if(OrderSelect(x,SELECT_BY_POS,MODE_TRADES)==true)
      {
      if (OrderSymbol()==Symbol())
         {
         if (OrderType()==OP_BUY)  OrderClose(OrderTicket(),OrderLots(),Bid,3);
         }
      }
   }



Почему она закрывает не все открытые покупки????

Подскажите пожалуйста как закрыть все открытые покупки.

 
две ошибки,
1- перебирать нужно от ОрдерТотал к нулю
2-нет торгового таймаута (сначала слип, затем рефреш в каждом цикле)
 
две ошибки,
1- перебирать нужно от ОрдерТотал к нулю
2-нет торгового таймаута (сначала слип, затем рефреш в каждом цикле)

1. Вовсе необязательно. Просто нужно делать рефреш после каждой попытки закрытия. А также x-- в случае УСПЕШНОГО закрытия

2. Пауза тоже в принципе не нужна. Зачем? Просто для приличия? :)
А вот учёт возникших ошибок как-раз желателен! И в случае некоторых из них возможно как-раз и понадобится пауза, а может даже и прекращение цикла
 
Да, вопрос требует тщательно проверенного кода поскольку при разных ошибках необходимо выполнять разные действия,

В качестве наброска... не более того:

for(int i=0; i<number_try; i++)// делаем 3 попытки выставления ордера
     {       
// пытаемся выставить ордера пока не получили полож. результата или  ошибку - Слишком много запросов или что Ордер уже обрабатывается
       if(условие BUY)  {ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,slippage,0,0,"gs_Trade_GEP",magic,0,Blue); OpenBuy=false;} 
       if(условие SELL) {ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,slippage,0,0,"gs_Trade_GEP",magic,0,Red); OpenSell=false;}
       if(ticket>1) {Comment("\n\nOrder is execute"); return(0);} //ордер выставлен - выходим  return(0);  break;
       else
        {
         int error=GetLastError();
         if(error==129 || error==135 || error==138) { continue; i--;}
//цена изменилась, вызываем начало следующей итерации, т.е. продолжаем заново без учета попытки 
         if(error==141) {Comment("\n\nTry Offen!!! Exit! "); return(0);} //Слишком много запросов - выходим без выставленного ордера
       
         if(error==139)// ERR_ORDER_LOCKED 139 Ордер заблокирован и уже обрабатывается, поэтому проверяем исполнение после небольшой паузы
          {
          Sleep(250);
          total=OrdersTotal();
          for(int cnt=0; cnt<total; cnt++) // проверяем принят ли ордер
            {
             if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES) && OrderSymbol() == Symbol() && OrderMagicNumber()==magic) {Comment("\n\nOrder is execute"); return(0);}//ордер выставлен - выходим 
             // если нет - делаем следующуюю попытку
            } 
          }      
        }
      }