Вопрос по SELECT_BY_POS

 

Возникла следующая ситуация: советнику необходимо выбрать среди закрытых и удаленных ордеров свой последний закрытый.

Для этого:

for(cnt=OrdersHistoryTotal()-1;cnt>=0;cnt--)  
   {  
      OrderSelect(cnt, SELECT_BY_POS, MODE_HISTORY); 
   
      // выбираем последний удалённый ордер Советника для определения прибыли/убытка
      if(OrderMagicNumber()==Magic_Number && (OrderType()==OP_BUY || OrderType()==OP_SELL))
      {
         // ордер не должен быть обработан ранее
         if(OrderTicket()!=OrdersHistory_Ticket)
         {
            Account_Balance=Account_Balance+OrderProfit()+OrderSwap();
            OrdersHistory_Ticket=OrderTicket();
         }
         break;
      }
   }

Последние закрытые советником ордера:

Ticket Open Time Close Time

121036 2007.07.16 22:16 2007.07.16 23:58

121035 2007.07.16 23:58 2007.07.17 04:02

Т.е. можно видеть, что брокер присвоил тикеты ордерам не по порядку - сначала 121036, затем 121035. В этом же порядке их и обработал эксперт, т.е. номер позиции у 121035 (SELECT_BY_POS) был больше, чем у 121036. Т.е. ордера в списке были расположены в соответствии со временем закрытия. После перезагрузки эксперта (при этом OrdersHistory_Ticket был записан и прочитан из файла) расположение ордеров в списке изменилось:

Ticket Open Time Close Time

121035 2007.07.16 23:58 2007.07.17 4:02

121036 2007.07.16 22:16 2007.07.16 23:58

Т.е. они стали располагаться в соответствии с возрастанием номера тикета. И из-за этого советник по второму разу обработал ордер 121036. Это баг или я чего-то не понимаю? И хотелось бы понять логику расположения в списке закрытых и удалённых ордеров при SELECT_BY_POS.

 
Уважаемые разработчики, хотелось бы услышать ваши пояснения.
 
Спасибо за ссылку, но написать такую функцию - не проблема. Меня интересует, почему OrderSelect работает именно так, как я описал в своём вопросе. Пожалуйста, объясните логику её работы на моём примере.
 
Никакого бага нет. Сделки в Account History сортируются по дате (исправлено) закрытия, а не по номеру тикета.
 
 
Уважаемые разработчики, прошу ещё раз ВНЯТНО и ПОДРОБНО объяснить мне НА МОЁМ ПРИМЕРЕ (который в самом начале), где у меня ошибка. Я так и не понял принцип, по которому ордера располагаются в OrderSelect(cnt, SELECT_BY_POS, MODE_HISTORY). Это не время закрытия, не время открытия, не номер тикета. Тогда что?
 
Извините, по дате закрытия (думал об одном, а писал совсем другое).
 
Renat:
Извините, по дате закрытия (думал об одном, а писал совсем другое).


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

Вот история счёта, отсортированная по времени закрытия:

А вот та же самая история, выведенная в лог, в помощью:

   for(cnt=OrdersHistoryTotal()-1;cnt>=0;cnt--)  
   {  
      OrderSelect(cnt, SELECT_BY_POS, MODE_HISTORY); 
      Print(" cnt = ",cnt);
      Print(" OrderTicket() = ",OrderTicket());
   }

Красным подчёркнуты первые несоответствия:

Как Вы это объясните? ИМХО чистый баг.

 
Отчет ведь получен на неперезагружавшемся терминале? То есть, счет не переподключался достаточно долгое время (например с утра 17 июля) и история сделок накапливалась постепенно.
А после переподключения (перезагрузки всей базы закрытых позиций) сортировка нормальная (проверьте это, пожалуйста)?

Дело в том, что основной объем Account History приходит с сервера, а потом история совершенных сделок накапливается (если не было перелогинов) на торговом терминале транзакция за транзакцией без соблюдения правила пересортировки по закрытию. Кстати, выбивающаяся из сортировки сделка 69 была отложником со сроком истечения. Вообще-то не имеет значения, в какой сортировке хранится массив совершенных сделок в памяти терминала, так как список "на люди" показывается уже в интерфейсе в любой нужной сортировке.

Вам не стоит закладываться в правило, что в Account History сделки всегда отсортированы по дате закрытия. В любом случае, сегодня мы поглубже посмотрим на этот момент - скорее всего будет проще для всех, если мы поставим жесткое правило сортировки по дате закрытия.

И еще один вопрос - какой билд терминала?
 
Терминал не перезагружался с вечера 15 июля, но интернет рвётся стабильно 2-3 раза в сутки, соответственно, столько же раз происходит переподключение к брокеру. Проблема как раз в обратном - пока нет переподключения - ордера накапливаются в правильном порядке (в порядке закрытия), а после обрыва связи и переподключения - подгружается история отсортированная с ошибками (как показано в логе) - из-за этого я долгое время не мог понять, почему одни и те же ордера иногда обрабатываются дважды, пока не сопоставил моменты возникновение этих ошибок с обрывами связи и перезагрузкой истории. Т.е. ошибка как раз в сортировке моей истории на сервере брокера - посмотрите поглубже именно это. Ордер 69 не единственный неправильно отсортированный, напимер, ордера 121035 и 121036 (на которые я изначально обратил внимание) закрыты по sl, tp. Жёсткая (и безошибочная) сротировка по времени закрытия как у брокера, так и в клиентском терминале - самый логичный и простой выход (чтобы не навешивать дополнительные проверочные функции). Мой билд - 206.
Причина обращения: