Циклы и закрытие или удаление заказов - страница 3

 

Что если мы сделаем цикл, подобный этому,

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

Это цикл, приведенный в книге mql4 для создания массива для ордеров.

Будет ли OrdersTotal() уменьшаться сам по себе каждый раз, когда ордер закрывается?

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

Я только что заглянул в книгу, ниже приведен цикл для закрытия ордера, так что ответ - да : ( 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:

Что если мы сделаем цикл, подобный этому,

Это цикл, приведенный в книге mql4 для создания массива для ордеров.

Будет ли OrdersTotal() уменьшаться сам по себе каждый раз, когда ордер закрывается?


Да, это произойдет... но факт остается фактом - ни один ордер не будет закрыт. Прочитайте первые 2 сообщения в этой теме ... это объясняется подробно.
 
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 ! 

Можно ли не объявлять TotalNumberOfOrders = OrdersTotal() ;

Я имел в виду, что нужно сразу использовать OrdersTotal()

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

 
Вместо того чтобы спрашивать, почему бы просто не попробовать? Это будет ваш опыт.
 
В настоящее время я использую это, но я не уверен в выводе, хотя это то же самое. Поскольку OrdersTotal() находится в цикле for, повлияет ли закрытие 1 ордера на OrdersTotal снова и снова?
 
Попробуйте оба варианта и посмотрите, сможете ли вы заметить различия.
 
juniorlcq:
В настоящее время я использую это, но я не уверен в выводе, хотя это то же самое. Поскольку OrdersTotal() находится в цикле for, будет ли закрытие 1 ордера влиять на OrdersTotal снова и снова?

Нет, потому что вы не проверяете OrdersTotal, вы проверяете PositionIndex как условие для продолжения цикла.

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

Отличная работа по объяснению этой темы! Без графики это просто невозможно объяснить... Отличная работа.

Единственный раз, когда я был вынужден использовать метод подсчета вместо метода обратного отсчета, был у брокера.

который был действительно xxx о FIFO и не позволял мне закрыть самую новую сделку первым.... как глупо.

И снова я говорю... молодец...

 
Jimdandy: Единственный раз, когда я был вынужден использовать метод обратного отсчета вместо метода обратного отсчета, был связан с брокером, который был очень дотошен к FIFO и не позволял мне закрывать самую новую сделку первым.... как глупо.
В этом случае, захватите все соответствующие номера билетов (в массив), а затем закройте. Не считайте и не закрывайте.
 

Здравствуйте, эксперты, каково ваше мнение об этом решении?

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