Error al cerrar ordenes - Necesito hacer varios intentos para que se cierren todas

 

Hola.

Me he encontrado que al hacer un bucle para que me cierre las ordenes no me las cerraba todas.

He tenido que poner el proceso de cierre dentro de otro bucle para que repita todo el proceso 5 veces. De esta forma me las cierra todas. Al principio le puse que lo repitiera 3 veces pero de forma eventual seguía dejandose alguna. Es un proceso que puede estar cerrando 12 o 13 ordenes y a veces falla.

¿A alguien le ha pasado algo similar?

¿Será que tengo algún error en el código?

      for(int xcnt=0; xcnt<5; xcnt++)
        {
         for(int cnt=0; cnt<OrdersTotal(); cnt++)
           {
            result3=OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
            if(result3 > 0)
              {
               if(
                  OrderSymbol()==Symbol()
                  &&(OrderMagicNumber()==MagicNumber1)
               )
                 {
                  if(OrderType()==OP_BUY)
                    {
                     double ClosePrice=0;
                     RefreshRates();
                     ClosePrice=NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),Digits);
                     result2=OrderClose(OrderTicket(),OrderLots(),ClosePrice,Slippage,Green);
                    }
                  else
                    {
                     double ClosePrice=0;
                     RefreshRates();
                     ClosePrice=NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),Digits);
                     result2=OrderClose(OrderTicket(),OrderLots(),ClosePrice,Slippage,Green);
                    }
                 }
              }
           }
        }


Muchas gracias.

 
Miquel Cirera Mato:

Hola.

Me he encontrado que al hacer un bucle para que me cierre las ordenes no me las cerraba todas.

He tenido que poner el proceso de cierre dentro de otro bucle para que repita todo el proceso 5 veces. De esta forma me las cierra todas. Al principio le puse que lo repitiera 3 veces pero de forma eventual seguía dejandose alguna. Es un proceso que puede estar cerrando 12 o 13 ordenes y a veces falla.

¿A alguien le ha pasado algo similar?

¿Será que tengo algún error en el código?


Muchas gracias.

Hola, puedes probar esto?

for (int xcnt = 0; xcnt < 5; xcnt++) {
    for (int cnt = OrdersTotal() - 1; cnt >= 0; cnt--) {
        if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)) {
            if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber1) {
                double ClosePrice = 0;
                RefreshRates();

                if (OrderType() == OP_BUY) {
                    ClosePrice = NormalizeDouble(MarketInfo(OrderSymbol(), MODE_BID), Digits);
                } else {
                    ClosePrice = NormalizeDouble(MarketInfo(OrderSymbol(), MODE_ASK), Digits);
                }

                int result2 = OrderClose(OrderTicket(), OrderLots(), ClosePrice, Slippage, Green);
                if (result2 < 0) {
                    Print("Error al cerrar la orden: ", ErrorDescription(result2));
                }
            }
        } else {
            Print("Error al seleccionar la orden: ", GetLastError());
        }
    }
}
 
Enrique Enguix #:

Hola, puedes probar esto?

Si tienes dos órdenes abiertas y cierras la primera, la segunda ya no estará de segunda sino que pasa a ocupar la primera posición. Es por eso que el bucle for lo debes recorres desde la última orden hacia la primera. 

Saludos 
 
Enrique Enguix #:

Hola, puedes probar esto?

Muchas gracias Enrique. 

 
Antonio Simon Del Vecchio #:
Si tienes dos órdenes abiertas y cierras la primera, la segunda ya no estará de segunda sino que pasa a ocupar la primera posición. Es por eso que el bucle for lo debes recorres desde la última orden hacia la primera. 

Saludos 

Muchas gracias Antonio. Tienes razón, este ha sido un fallo de novato. uff