Поиск старого ордера (обычная утренняя ситуация)

 
Добрый день всем заинтересовавшимся.

Задача: Найти открытый ранее ордер, даже если его № тикета был изменен (после ночи), если ордер закрылся (за ночь/за выходные) - то отследить эту ситуацию. Ключевым параметром является Магическое число ордера.
Ситуация: Приведенный мною ниже код справляется с задачей, но о_Очень не оптимально. Практически нет возможности проверить до конца, но ориентировочно за 5719482 операций, создавая три 100 Мб файла лога.
// int logThis(string logText) - Запись строки в текущий файл лога
// orderNumber - номер тикета из моей базы данных ордеров
// orderMagic  - магия ордера тоже из базы

int   maxOrderTicket = 0,
      total          = OrdersTotal(),
      i;
            
for (i = 0; i < total; i++)
{     // ищем максимальный №тикета
    OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
    if (OrderTicket() > maxOrderTicket)
    {
          maxOrderTicket = OrderTicket();
    }
}
logThis(StringConcatenate("maxOrderTicket: ", maxOrderTicket));


for (i = maxOrderTicket; i > 0; i--)
{     // листаем все по открытым ордерам
      OrderSelect(i, SELECT_BY_POS, MODE_HISTORY);
      
      logThis(StringConcatenate("тикет был: ", OrderTicket()));
      
      if (orderMagic == OrderMagicNumber())
      {     // если магия ордера совпала
            orderNumber = OrderTicket();
            
            logThis(StringConcatenate("Ордер закрылся; его тикет был: ", orderNumber));
            Alert                    ("Ордер закрылся; его тикет был: ", orderNumber);
            break;
      }
}
Помогите разобраться, уверен что у многих есть свои более оптимальные реализации.
Большое спасибо.
 
for (i = maxOrderTicket; i > 0; i--)
{     // листаем все по открытым ордерам
      OrderSelect(i, SELECT_BY_POS, MODE_HISTORY);

Вот это вообще нечто, даже комментировать не буду - переписать всё заново! Не удивительно, что лог 100 Мб. А Вы смотрели, что там?

Хотя бы проверяйте что функция OrderSelect возвращает, выбран ли ордер.

Подсказка - if (OrderSelect(ticket,SELECT_BY_TICKET)) ...;

 
vedroid >>:
Помогите разобраться, уверен что у многих есть свои более оптимальные реализации.
Большое спасибо.

Тикеты зло.

 
Xupypr >>:

Вот это вообще нечто, даже комментировать не буду - переписать всё заново! Не удивительно, что лог 100 Мб. А Вы смотрели, что там?

Хотя бы проверяйте что функция OrderSelect возвращает, выбран ли ордер.

Подсказка - if (OrderSelect(ticket,SELECT_BY_TICKET)) ...;

Большое спасибо. Переписал. :-)

Вроде работает, но с утра более точную проверку боем пройдет. Спасибо ещё раз.

Причина обращения: