Boucles et fermeture ou suppression d'ordres - page 3

 

Que se passe-t-il si nous faisons une boucle comme celle-ci,

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

C'est la boucle donnée dans le livre mql4 pour créer le tableau des commandes.

Est-ce que le OrdersTotal() va diminuer de lui-même à chaque fois qu'un ordre est fermé ?

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

Je viens de regarder dans le livre, ci-dessous est la boucle donnée pour fermer un ordre, donc la réponse est oui : ( 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 se passe-t-il si nous faisons une boucle comme celle-ci,

C'est la boucle donnée dans le livre mql4 pour créer le tableau des commandes.

Est-ce que le OrdersTotal() va diminuer de lui-même à chaque fois qu'un ordre est fermé ?


Oui, mais le fait est que tous les ordres ne seront pas fermés. Lisez les 2 premiers messages de ce fil de discussion... c'est expliqué en détail.
 
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 ! 

Est-il possible de ne pas déclarer TotalNumberOfOrders = OrdersTotal() ;

Ce que je veux dire, c'est qu'il faut utiliser directement OrdersTotal()

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

 
Au lieu de demander, pourquoi ne pas simplement essayer ? Ce serait votre expérience.
 
Je l'utilise actuellement mais je ne suis pas sûr de la sortie, même si c'est la même chose. Puisque OrdersTotal() est dans la boucle for, la fermeture d'une commande affectera-t-elle le OrdersTotal encore et encore ?
 
Essayez les deux et voyez si vous pouvez repérer les différences.
 
juniorlcq:
C'est ce que j'utilise actuellement, mais je ne suis pas sûr de la sortie, même si c'est la même chose. Puisque OrdersTotal() est dans la boucle for, la fermeture d'un ordre affectera-t-elle le OrdersTotal encore et encore ?

Non, parce que vous ne vérifiez pas OrdersTotal, vous vérifiez PositionIndex comme condition pour continuer la boucle.

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

Excellent travail d'explication de ce sujet ! Sans les graphiques, c'est tout simplement impossible à expliquer... Bien joué.

La seule fois où j'ai été obligé d'utiliser la méthode du compte à rebours au lieu de celle du compte à rebours, c'était sur un courtier

qui était vraiment xxx sur le FIFO et ne me laissait pas fermer la dernière transaction en premier.... quelle stupidité.

Encore une fois, je dis... bien joué...

 
Jimdandy: La seule fois où j'ai été obligé d'utiliser la méthode du compte à rebours au lieu de celle du compte à rebours, c'était avec un courtier qui était très à cheval sur le FIFO et qui ne me laissait pas clôturer la dernière transaction en premier...., quelle stupidité.
Dans ce cas, saisissez tous les numéros de tickets pertinents (dans un tableau), puis fermez. Ne comptez pas et ne fermez pas.
 

Salut les experts, quel est votre avis sur cette solution ?

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