Bucles y cierre o eliminación de pedidos - página 3

 

Que pasa si hacemos un bucle como este

  for(int i=0; i< OrdersTotal(); i++) // For market and pending orders
     {
      if((OrderSelect(i,SELECT_BY_POS)==true)     //If there is the next one
      && (OrderSymbol()==Symbol()) && OrderMagicNumber() == Magic_A )               
        {

Este es el bucle que se da en el libro mql4 para crear un array para los pedidos.

¿Se reducirá el OrdersTotal() cada vez que se cierre un pedido?

//***************************************************************************

Acabo de echar un vistazo al libro, abajo está el bucle dado para cerrar una orden, así que la respuesta es sí : ( https://book.mql4.com/trading/orderclose )

 for(int i=1; i<=OrdersTotal(); i++)          // Order searching cycle
     {
      if (OrderSelect(i-1,SELECT_BY_POS)==true) // If the next is available
        {                                       // Order analysis:
         //----------------------------------------------------------------------- 3 --
         if (OrderSymbol()!= Symb) continue;   
 
ffoorr:

Que pasa si hacemos un bucle como este

Este es el bucle que se da en el libro mql4 para crear un array para los pedidos.

¿Se reducirá el OrdersTotal() cada vez que se cierre un pedido?


Sí, lo hará... pero el hecho es que no se cerrarán todos los pedidos. Lea los primeros 2 mensajes en este hilo . . se explica en detalle.
 
int TotalNumberOfOrders;   //  <-- this variable will hold the number of orders currently in the Trade pool

TotalNumberOfOrders = OrdersTotal();    // <-- we store the number of Orders in the variable

for(PositionIndex = TotalNumberOfOrders - 1; PositionIndex >= 0 ; PositionIndex --)  //  <-- for loop to loop through all Orders . .   COUNT DOWN TO ZERO ! 

¿Es correcto no declarar TotalNumberOfOrders = OrdersTotal() ;

Lo que quiero decir es que directamente use OrdersTotal()

for ( x = OrdersTotal() - 1 ...... )

 
En lugar de preguntar, ¿por qué no lo intentas? Sería tu experiencia.
 
Actualmente estoy usando eso pero no estoy seguro de la salida aunque sea la misma . Dado que OrdersTotal() está en el bucle for, ¿el cierre de 1 orden afectará al OrdersTotal una y otra vez?
 
Pruebe ambos y vea si puede detectar las diferencias.
 
juniorlcq:
Actualmente estoy usando eso pero no estoy seguro de la salida aunque sea la misma . Dado que OrdersTotal() está en el bucle for, ¿el cierre de una orden afectará al OrdersTotal una y otra vez?

No, porque no estás comprobando OrdersTotal, estás comprobando PositionIndex como la condición para continuar el bucle

for(PositionIndex = TotalNumberOfOrders - 1; PositionIndex >= 0 ; PositionIndex --)
 

¡Excelente trabajo de explicación de este tema! Sin los gráficos es imposible de explicar... Bien hecho.

La única vez que me he visto obligado a utilizar el método de conteo en lugar del método de cuenta atrás fue en un corredor

que era realmente xxx sobre FIFO y no me dejaba cerrar el comercio más reciente primero.... qué estúpido.

De nuevo digo... bien hecho...

 
Jimdandy: La única vez que me he visto forzado a utilizar el método de conteo ascendente en lugar del método de conteo descendente fue en un corredor que era realmente analítico acerca de FIFO y no me dejaba cerrar la operación más reciente primero.... qué estúpido.
En ese caso, capturar todos los números de billetes pertinentes (en una matriz) y luego cerrar. No cuentes y cierres.
 

Hola expertos, ¿cuál es su opinión sobre esta solución?

while(OrdersTotal()>0)
  {
   if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES))
     {
      switch(OrderType())
        {
         case OP_BUY:  if(!OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),MaxSlippage,CloseColor)) Print("OrderClose error ",GetLastError()); break;
         case OP_SELL: if(!OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),MaxSlippage,CloseColor)) Print("OrderClose error ",GetLastError()); break;
         case OP_BUYSTOP:
         case OP_SELLSTOP:
         case OP_BUYLIMIT:
         case OP_SELLLIMIT: if(!OrderDelete(OrderTicket())) Print("OrderDelete error ",GetLastError());
        }
     }
   else Print("OrderSelect error ",GetLastError());
  }