Цикл в цикле

 

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

У меня такая задача: первый цикл ищет последний ордер а подцикл должен найти предпоследний ордер, вот с этим предпоследним проблема... незнаю как эго найти, может кто не пожалеет времени и даст наводку на мысль?

 
Maksim Neimerik:

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

У меня такая задача: первый цикл ищет последний ордер а подцикл должен найти предпоследний ордер, вот с этим предпоследним проблема... незнаю как эго найти, может кто не пожалеет времени и даст наводку на мысль?

В одном цикле соберите в массив все нужные ордера. По окончании цикла отсортируйте массив по времени открытия/закрытия (смотря что ищете). Ну и далее - уже из массива - берёте по индексу массива нужный вам ордер. Хоть первый, хоть последний-предпоследний, хоть пятый-десятый

 
Artyom Trishkin:

В одном цикле соберите в массив все нужные ордера. По окончании цикла отсортируйте массив по времени открытия/закрытия (смотря что ищете). Ну и далее - уже из массива - берёте по индексу массива нужный вам ордер. Хоть первый, хоть последний-предпоследний, хоть пятый-десятый

Спасибо, буду пробовать...
 
Я чет заработался: а у отложек OrderOpenTime()==0 или нет?
 
Maksim Neimerik:
Я чет заработался: а у отложек OrderOpenTime()==0 или нет?

Это время её установки будет.

 
Artyom Trishkin:

В одном цикле соберите в массив все нужные ордера. По окончании цикла отсортируйте массив по времени открытия/закрытия (смотря что ищете). Ну и далее - уже из массива - берёте по индексу массива нужный вам ордер. Хоть первый, хоть последний-предпоследний, хоть пятый-десятый

Как то так?

void OpenTime(int cmd)
  {
   datetime OT[];
   for(int i=0;i<=OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==magic && OrderType()==cmd)
         OT[i]=OrderOpenTime();
        }
     }
  }

 
Maksim Neimerik:

Как то так?

void OpenTime(int cmd)
  {
   datetime OT[];
   for(int i=0;i<=OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==magic && OrderType()==cmd)
         OT[i]=OrderOpenTime();
        }
     }
  }

А размер массива? А тикеты ордеров?

И, пожалуйста, используйте для вставки кода кнопочку SRC

 

а так можно инициализировать?:

datetime OT[OrdersTotal()];

и еще вопрос: а тикеты зачем? мне же только время открытия нужно...

 
У меня первый цикл который ищет последний ордер начинается так:
for(int i=0;i<=OrdersTotal();i++)
{-//-//-//-}

Возможно для поиска предпоследнего достаточно начать цикл так:

for(int i=0;i<=OrdersTotal()-1;i++)
{-//-//-//-}


??

 
Maksim Neimerik:

а так можно инициализировать?:

и еще вопрос: а тикеты зачем? мне же только время открытия нужно...


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

datetime arrdtTime[];
if (ArrarResize(arrdtTime, OrdersTotal()) < 0)
   return;

Только после этого массив можно заполнять.

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

Возможно для поиска предпоследнего достаточно начать цикл так:


??


Тоже не так. Тогда уж так:

for (int i = 0; i < OrdersTotal(); i++)
{-//-//-//-}

Ну а лучше так:

int nTotal = OrdersTotal();
for (int i = 0; i < nTotal; ++i)
{-//-//-//-}

или, чтобы короче было:

for (int i = OrdersTotal() - 1; i >= 0; --i)
{-//-//-//-}
А чтобы найти последний/предпоследний/первый, в любом случае нужно сортировать по времени, т. к. список активных ордеров может быть отсортирован пользователем вовсе не по времени или тикету.
Причина обращения: