Loop e chiusura o cancellazione di ordini - pagina 3

 

Cosa succede se facciamo un ciclo come questo

  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 )               
        {

Questo è il ciclo dato nel libro mql4 per creare l'array per l'ordine.

OrdersTotal() diminuirà da solo ogni volta che un ordine viene chiuso?

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

Ho appena dato un'occhiata nel libro, sotto è il ciclo dato per chiudere un ordine, quindi la risposta è 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:

Cosa succede se facciamo un ciclo come questo

Questo è il ciclo dato nel libro mql4 per creare l'array per l'ordine.

OrdersTotal() diminuirà da solo ogni volta che un ordine viene chiuso?


Sì. . . ma resta il fatto che non tutti gli ordini saranno chiusi. Leggi i primi 2 post in questo thread . . è spiegato in dettaglio.
 
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 ! 

Va bene non dichiarare TotalNumberOfOrders = OrdersTotal() ;

Quello che intendo è usare subito OrdersTotal()

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

 
Invece di chiedere, perché non provare? Sarebbe la vostra esperienza.
 
Attualmente sto usando questo, ma non sono sicuro dell'output anche se è lo stesso. Dato che OrdersTotal() è nel ciclo for, la chiusura di 1 ordine influenzerà il OrdersTotal ancora e ancora?
 
Provali entrambi e vedi se riesci a individuare le differenze.
 
juniorlcq:
Attualmente sto usando questo, ma non sono sicuro dell'output anche se è lo stesso. Dato che OrdersTotal() è nel ciclo for, la chiusura di 1 ordine influenzerà il OrdersTotal ancora e ancora?

No, perché non stai controllando OrdersTotal, stai controllando PositionIndex come condizione per continuare il ciclo

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

Eccellente lavoro di spiegazione di questo argomento! Senza la grafica è proprio impossibile da spiegare... Ben fatto.

L'unica volta che sono stato costretto ad usare il metodo del conto alla rovescia invece del metodo del count up è stato su un broker

che era davvero xxx sul FIFO e non mi lasciava chiudere l'ultimo trade prima.... che stupido.

Ancora una volta dico...ben fatto...

 
Jimdandy: L'unica volta che sono stato costretto a usare il metodo del conto alla rovescia è stato su un broker che era molto anale riguardo al FIFO e non mi lasciava chiudere il trade più recente prima.... che stupido.
In quel caso, cattura tutti i numeri di ticket rilevanti (in un array) e poi chiudi. Non contare e chiudere.
 

Ciao esperti, qual è la vostra opinione su questa soluzione?

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());
  }
Motivazione: