Laços e Encerramento ou Eliminação de Pedidos - página 3

 

E se fizermos um laço 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 é o laço dado no livro mql4 para criar uma matriz para encomenda.

As ordensTotal() diminuirão por si só cada vez que uma ordem for fechada?

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

Eu só tenho um olhar no livro, abaixo está o laço dado para fechar um pedido, então o anwers é sim : ( 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:

E se fizermos um laço como este?

Este é o laço dado no livro mql4 para criar uma matriz para encomenda.

As ordensTotal() diminuirão por si só cada vez que uma ordem for fechada?


Sim, será . . . mas o fato permanece e todas as Ordens serão fechadas. Leia os 2 primeiros posts neste tópico . . . é explicado em detalhes.
 
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 ! 

Não há problema em não declarar TotalNumberOfOrders = OrderTotal() ;

O que eu quis dizer foi imediatamente usar OrderTotal()

para ( x = OrderTotal() - 1 ...... )

 
Em vez de perguntar, por que não simplesmente tentar isso? Seria a sua experiência.
 
Atualmente estou usando isso, mas não tenho certeza de que vai sair, apesar de ser a mesma coisa. Como o OrderTotal() está no loop for, o fechamento de 1 ordem afetará o OrderTotal de novo e de novo ?
 
Tente os dois e veja se você consegue detectar as diferenças.
 
juniorlcq:
Atualmente estou usando isso, mas não tenho certeza de que vai sair, apesar de ser a mesma coisa. Como o OrderTotal() está no loop for, o fechamento de 1 ordem afetará o OrderTotal de novo e de novo ?

Não, porque você não está verificando OrdensTotal, você está verificando PositionIndex como a condição para continuar o laço

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

Excelente trabalho de explicação deste tópico! Sem os gráficos é simplesmente impossível de explicar... Muito bem feito.

A única vez que fui forçado a usar o método de contagem para cima em vez do método de contagem regressiva foi em um corretor

que era realmente xxx sobre FIFO e não me deixava fechar o mais novo comércio primeiro.... quão estúpido.

Novamente eu digo ... bem feito...

 
Jimdandy: A única vez que fui forçado a usar o método de contagem para cima em vez do método de contagem regressiva foi em um corretor que era realmente anal sobre FIFO e não me deixava fechar o mais novo negócio primeiro.... quão estúpido.
Nesse caso, capturar todos os números de bilhetes relevantes (em uma matriz) e depois fechar. Não conte para cima E feche.
 

Olá especialistas, qual é a sua opinião sobre esta solução?

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