Цикл в цикле - страница 3

 
Dmitry Fedoseev:  Вы что-то перепутали.

Вы правы, перепутал с  OrdersHistoryTotal() - возвращаемое количество зависит от настроек истории

 
Maksim Neimerik: Привет! Я почему-то нигде не встречал цикл перебора ордеров в цикле перебора ордеров. Такое практикуется? Можно так делать?

У меня такая задача: первый цикл ищет последний ордер а подцикл должен найти предпоследний ордер

Цикл в цикле вполне можно применить для выбора пары элементов с определенными характеристиками. Например, надо найти два ордера с наиболее близкими значениями какого либо параметра. Тогда первый цикл просматривает все ордера, кроме последнего. Второй цикл просматривает все последующие ордера. Применение массива в данном случае более эффективно: массив сортируется и в нем находятся два соседних элемента с требуемыми значениями.

Для поиска последнего и предпоследнего по времени ордеров достаточно одного цикла

//+-------------------------------------------------------+
//| Выбор последнего и предпоследнего ордерова   PROBA.mq4|
//+-------------------------------------------------------+
#property strict
void OnStart()
{
   bool x;
   datetime t_posl, t_pposl;  // Время последнего и предпоследнего
   int      n_posl, n_pposl;  // Тикеты наверное пригодятся ...
   if(OrdersTotal()<2)
   {
      Alert("Мало ордеров ",OrdersTotal());
      return;
   }

   // Запомним данные одного ордера
   x=OrderSelect(0,SELECT_BY_POS);
   t_posl=OrderOpenTime();
   n_posl=OrderTicket();

   // Запомним данные другого ордера
   x=OrderSelect(1,SELECT_BY_POS);
   t_pposl=OrderOpenTime();
   n_pposl=OrderTicket();

   // Проверим последовательность
   if(t_pposl>t_posl)
   {
      t_pposl=t_posl;
      n_pposl=n_posl;
      t_posl=OrderOpenTime();
      n_posl=OrderTicket();
   }

   // Просмотрим остальные ордера
   for(int i=2; i<OrdersTotal(); i++)
   {
      if(OrderSelect(i,SELECT_BY_POS))
      {
         if(OrderOpenTime()>t_pposl)
         {
               t_pposl=OrderOpenTime();
               n_pposl=OrderTicket();
         }
         if(OrderOpenTime()>t_posl)
         {
               t_pposl=t_posl;
               n_pposl=n_posl;
               t_pposl=OrderOpenTime();
               n_pposl=OrderTicket();
         }
      }
   }
   Alert(t_posl,"  ",n_posl,"  ",t_pposl,"  ",n_pposl);
}

Скрипт написан исключительно для иллюстрации указанной возможности