Насколько быстро обновляется OrdersHistory после закрытия ордера?

 

Ситуация: в 11:38:20 закрывается один ордер и в 11:38:20 сразу же открывается следующий. По логике такого быть не должно - в коде стоит проверка не более одного ордера на бар. Проверяется OrdersHistory.

Может ли OrdersHistory обновиться с задержкой после закрытия ордера?

 
Да. Может быть - важный момент. Ордер закрылся по [sl] на сервере.
 
RickD:
Да. Может быть - важный момент. Ордер закрылся по [sl] на сервере.

Если отвечать на вопрос, поставленный в названии темы, т.е. насколько быстро обновляются исторические данные после закрытия ордера, то он поднимался участниками чемпионата советников 2012 года. Было обнаружено, что даже после завершения исполнения OrderSend с закрытием или открытием сделок немедленное обращение к истории часто дает сведения без учета только что выполненной операции. Как решение предлагалась задержка в советнике Sleep на 1000 и даже на 3000 миллисекунд после OrderSend.

Это очень завышенные оценки для случая, когда процессоры заняты не на 100%, данные оперативной памяти полностью находятся в микросхемах памяти (не на магнитных пластинах жесткого диска) и связь устойчивая без перегрузки канала, одновременно для терминала и для сервера. В 2013 я провел массовый эксперимент на демосчете от Инстафорекс, где постоянно подчеркивалось большое число серверов и можно было предполагать неполную их загруженность. Всего 36 тысяч сделок за две недели. Почти никогда запаздывание не превышало 48 мс, чаще всего хватало 16 мс. Что будет в случае форс-мажорной загрузки сервера или терминала, сказать трудно. В кодах советников с тех пор я стал вставлять после успешного исполнения OrderSend цикл проверки обновления истории с шагом 16 мс.

Случай исполнения отложенных ордеров, включая TP и SL, не проверял. В справке по RefreshRates говорится, что история, доступная советнику, обновляется на каждом тике:

"Эксперты и скрипты работают с собственной копией исторических данных....

При каждом следующем запуске эксперта (напомним, что скрипт выполняется однократно и не зависит от приходящих тиков) первоначально созданная копия обновляется. За то время, пока эксперт или скрипт работает, может прийти один или несколько новых тиков, поэтому данные могут устареть.",

однако обновляется ли она к моменту появления тика в экземпляре данных для советника, не сказано. Если судить по аналогии с обновлением истории после успешного завершения OrderSend, то вполне вероятно может еще не обновиться.

 

Может ли получиться так?

Ордер закрылся на сервере по [sl], терминал получает от брокера информацию, сначала удаляет ордер из OpenTrades.

В это время эксперт доходит до кода проверки количества ордеров, смотрит - в открытых ордерах нет ордера, в закрытых тоже. Отдает приказ на открытие нового ордера.

Затем терминал обновляет TradesHistory и добавляет туда закрытый ордер.



 
Т.е. иными словами - происходит ли внутри терминала обновление OpenTrades и TradesHistory одной транзакцией?
 
RickD:
Т.е. иными словами - происходит ли внутри терминала обновление OpenTrades и TradesHistory одной транзакцией?

Нет. С сервера транзакции прилетают асинхронно.

Можно поискать только что закрытый ордер в истории и если его нет, сделать несколько попыток с маленькими задержками в 50 мс. На самом деле ордер в историю приходит очень быстро.

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

"стоит проверка не более одного ордера на бар"

не более одного ордера открытого или закрытого?

"Проверяется OrdersHistory"

получается, что одного закрытого. 

"в 11:38:20 закрывается один ордер и в 11:38:20 сразу же открывается следующий"

есть один открытый и один закрытый, нарушений логики не видно.

 
Buz23:

"стоит проверка не более одного ордера на бар"

не более одного ордера открытого или закрытого?

"Проверяется OrdersHistory"

получается, что одного закрытого. 

"в 11:38:20 закрывается один ордер и в 11:38:20 сразу же открывается следующий"

есть один открытый и один закрытый, нарушений логики не видно.

Логика работы эксперта простая.

Проверяем количество открытых ордеров, если есть открытые, то выходим.

Проверяем количество закрытых ордеров на текущем баре, если есть закрытые, то выходим.

Если прошли все проверки, то торгуем.

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

 
RickD:

Логика работы эксперта простая.

Проверяем количество открытых ордеров, если есть открытые, то выходим.

Проверяем количество закрытых ордеров на текущем баре, если есть закрытые, то выходим.

Если прошли все проверки, то торгуем.

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

А в тот момент, в закладке "История счёта" не переключал диапазон отображаемых ордеров?
 
RickD:

Логика работы эксперта простая.

Проверяем количество открытых ордеров, если есть открытые, то выходим.

Проверяем количество закрытых ордеров на текущем баре, если есть закрытые, то выходим.

Если прошли все проверки, то торгуем.

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

как вариант - проверять количество закрытых ордеров НЕ на текущем баре, а по времени закрытия - такая проверка более надежная.
Причина обращения: