CloseAllOrders() функция закрывающяя все открытые позиции не работает...

 

Совсем запарился...

Вот функция, очень простая, итерирует в истории ордеров, и закрывает все найденные, при этом выводит некоторую информацию в отпут...

void CloseAllOrders()
{
   Print("Total orders:", OrdersTotal());
   for(int cnt=0;cnt<OrdersTotal();cnt++)
   {
      if( OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES) == false )
      {
         Print("OrderSelect() failed");
      }
      Print("[",cnt,"] type: ", OrderType());
      if( OrderSymbol()==Symbol() )
      {
         if(OrderType()==OP_SELL )
         {
            Print("CLosing sell order, Ask = ", Ask);
            if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,White))
               Print("CLosing order FAILED, Error = ", ErrorDescription(GetLastError()));
         }else if(OrderType()==OP_BUY )
         {
            Print("CLosing buy order, Bid = ", Bid);
            if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,White))
               Print("CLosing order FAILED, Error = ", ErrorDescription(GetLastError()));
         }
      }
   }
   Print("CloseAllOrders(): exit");
}

В логе видим:


2008.08.18 17:45 EURGBP,M15: Total orders:2
2008.08.18 17:45 EURGBP,M15: [0] type: 0
2008.08.18 17:45 EURGBP,M15: CLosing buy order, Bid = 0.7887
2008.08.18 17:45 EURGBP,M15: close #4 buy 0.10 EURGBP at 0.7980 at price 0.7887
2008.08.18 17:45 EURGBP,M15: CloseAllOrders(): exit

и все, только один ордер закрывает.. и никаких ошибок, и работает советник дальше, и ордер висит... че за...???


Обратите внимание что Total orders:2 а эта линия

Print("[",cnt,"] type: ", OrderType());

Принтанула только нулевой елемент:EURGBP,M15: [0] type: 0

Как такое можно обьяснить?

 
Это совсем просто
void CloseAllOrders()
{
   Print("Total orders:", OrdersTotal());
   for(int cnt=OrdersTotal()-1;cnt>=0;cnt--)
   {
      if( !OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES) ) continue;

      Print("[",cnt,"] type: ", OrderType());
      if( OrderSymbol()==Symbol() )
      {
         if(OrderType()==OP_SELL )
         {
            Print("CLosing sell order, Ask = ", Ask);
            if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,White))
               Print("CLosing order FAILED, Error = ", ErrorDescription(GetLastError()));
         }else if(OrderType()==OP_BUY )
         {
            Print("CLosing buy order, Bid = ", Bid);
            if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,White))
               Print("CLosing order FAILED, Error = ", ErrorDescription(GetLastError()));
         }
      }
   }
 
а.. черт, кажется я понял где ошибка...
for(int cnt=0;cnt<OrdersTotal();cnt++)

Если закрывать ордера в цикле, ордерс тотал каждый рас будет возвращять меньше на единицу....

 
Figar0 >>:
Это совсем просто

Спасибо!!! :)