Неверные флаги в функции OnOrder

Страницы: 1
RSS
Неверные флаги в функции OnOrder, флаги показывают что лимитная заявка снята, хотя её состояние Активна
 
Работаю на четырех брокерах: СБЕР, ВТБ, Финам, Открытие
Код выставляет лимитную заявку, ожидая исполнения.

Рассматривается вариант, что пользователь снимает эту лимитную заявку в ручном режиме, тогда нужно остановить выполнение всего скрипта.

Соответственно код остановки скрипта:
Код
function OnOrder(order)
   if ((order.sec_code == FUT_SEC) and (order.trans_id == Trans_id_SELL)) then

      if ((order.qty >= 1) and (bit.test(order.flags, 0))) then 
         -- заявка активна (не исполнена)
         ToLog("The SELL order is in active status.")
      elseif bit.test(order.flags, 1) then
         ToLog("WARNING: USER's STOP. Flags = "..tostring(order.flags))
         IsRun = false
         return
      end
end
end

Так вот, у брокеров ВТБ и СБЕР иногда возникает ситуация в обработчике OnOrder , когда флаги показывают состояние 26.
бит 0 (0x1) = 0 - заявка не активна
бит 1 (0x2) = 1 - заявка снята

но на самом деле лимитная заявка продолжает находится в активном статусе в терминале Квик.

Это происходит иногда... Не часто. Не понимаю почему так...

Вчера стал это связывать с проблемами запаздывания времени часов Квик относительно часов Windows.
Внезапно время часов Квик, работавшее синхронно с Windows, вдруг начинает запаздывать на 5, 10, 30 сек, потом на минуту и более, потом "догоняет" и работает какое-то время синхронно, потом опять начинается цикл запаздывания и гонок и т.д.
Наблюдается "аритмия" в часах Квик.
"Глючил" именно брокер СБЕР.
Версия QUIK 9.7.1.10

И вот на этой аритмии и возникают неверные флаги OnOrder.

Включил измерение времени в функции OnOrder :
Код
local RoundTripSellOrder = os.clock() - SendSellTM
где SendSellTM - метка времени = os.clock() перед отправкой sendTransaction(transaction) в которой формируется идентификатор Trans_id_SELL.

По всем вчерашним неверным флагам замечено, что обработчик OnOrder вызывается спустя 1 мс после вызова функции sendTransaction(transaction).

Обычный тайминг около 80-120 мс когда проблем с флагами OnOrder не наблюдается.

Вообще среднее время 100 мс - это нормальный такой тайминг callback-функций Квика на отправку транзакции, как здесь может возникать одна миллисекунда ?!

Наверное это как-то связано с часами Квика, которые начинают "сбоить" и работать аритмично относительно нормального времени Windows.

То есть получается как будто OnOrder вызывается и обрабатывается в тот момент когда флаги ещё не установлены, этой лимитной заявки в системе как бы нет.

Вопросы:

1) Возможно ли что функция OnOrder выполняется через 1 мс после отправки sendTransaction(transaction) ??

2) Возможно ли что в первичный вызов OnOrder флаги ещё не приняли правильного положения и будут установлены в последующих вызовах OnOrder ??

3) Что можно ещё сделать в данной ситуации для улучшения стабильности ?
 
почитайте это:
https://forum.quik.ru/forum1/topic8018/
 
Цитата
Alexey написал:
1) Возможно ли что функция OnOrder выполняется через 1 мс после отправки sendTransaction(transaction) ??
да.
Цитата
Alexey написал:
2) Возможно ли что в первичный вызов OnOrder флаги ещё не приняли правильного положения и будут установлены в последующих вызовах OnOrder ??
нет.
Цитата
Alexey написал:
3) Что можно ещё сделать в данной ситуации для улучшения стабильности ?
убедиться что рассматриваемая заявка в таблице и в луа - одна и та же.
например наделать скринов, где видно номера заявок и они однинаковые - а флаги разные.
Цитата
Alexey написал:
Внезапно время часов Квик, работавшее синхронно с Windows, вдруг начинает запаздывать на 5, 10, 30 сек, потом на минуту и более,
либо проблемы в канале связи у тебя или у брокера. либо тормозит сервер брокера.
бороться с этим почти бесполезно. проще сменить брокера.
Цитата
nikolz написал:
почитайте это: https://forum.quik.ru/forum1/topic8018/
не читайте.
 
Alexey написал:
1) Возможно ли что функция OnOrder выполняется через 1 мс после отправки sendTransaction(transaction) ??
Нет. если Вы не в дата центре.
 
Цитата
nikolz написал:
Нет. если Вы не в дата центре.
Да, если ответ на транзакцию и заявка пришли вместе.
 
Цитата
Kalmar написал:
Цитата
nikolz написал:
Нет. если Вы не в дата центре.
Да, если ответ на транзакцию и заявка пришли вместе.
Вы невнимательно читаете.
Специально для Вас вопрос был такой:
1) Возможно ли что функция OnOrder выполняется через 1 мс после отправки sendTransaction(transaction) ??
------------------
Читайте внимательно в вопросе время отсчитывается от отправки , а не от прихода.
---------------------
Прочитали, теперь снова напишите свой ответ на данный вопрос.
 
более того, ответ на транзакцию OnTransRepley всегда приходит первым,
так как это ответ сервера брокера, а ответ onOrder - это трансляция сервера биржи сервером брокера.
Я именно в  OnTransRepley ловлю исполнение транзакции на выставление заявки всегда до прихода onOrder.
 
Цитата
nikolz написал:
более того, ответ на транзакцию OnTransRepley всегда приходит первым,
Не всегда, транзакции и заявки едут разными потоками, которые между собой не синхронизируются.

Цитата
nikolz написал:
так как это ответ сервера брокера, а ответ onOrder - это трансляция сервера биржи сервером брокера.
тоже нет, ответ на транзакцию содержит номер заявки. QUIK не может его знать, только биржа его может сообщить, значит это ответ биржи, а не сервера брокера.
 
Цитата
Kalmar написал:
Цитата
nikolz написал:
Нет. если Вы не в дата центре.
Да, если ответ на транзакцию и заявка пришли вместе.

Николай прав, обычно OnOrder не может прийти сразу после отправки транзакции (исключение дата центр).
Но он может прийти после OnTransRepley, т.е. после получения ответа на транзакцию
 
Цитата
nikolz написал:
более того, ответ на транзакцию OnTransRepley всегда приходит первым,
гы. нет.
обычно. но не всегда.

вообще, не рекомендую опираться на то, что что-то приходит первым.
может и заявка прийти первой. и даже сделка.
 
Цитата
Sergey Gorokhov написал:
Цитата
Цитата
nikolz написал:
так как это ответ сервера брокера, а ответ onOrder - это трансляция сервера биржи сервером брокера.
тоже нет, ответ на транзакцию содержит номер заявки. QUIK не может его знать, только биржа его может сообщить, значит это ответ биржи, а не сервера брокера.
Добрый день,
мы с Вам говорим о разном.
Вы говорите о OnTransRepley в котором есть номер заявки.
------------------------------
Я говорю о OnTransRepley,  в которых нет номерf заявки.
Эти сигналы всегда приходят раньше onOrder.
Так как ответ от биржи еще не пришел.
---------------------------
Именно этот ответ всегда приходит раньше
Именно его я и использую для фиксации момент выставления заявки.
-------------
 
Поэтому , для тех кто не понял, уточняю

OnTransRepley  и OnOrder Приходят многократно, но ПЕРВЫМ всегда приходит первый  OnTransReple
В нем нет номера заявки потому что на еще не пришла с сервера биржи
Остальные сигналы приходят как угодно но они не первые.
 
Всем спасибо!
Обсуждение помогло.
Начал анализировать код и нашёл свою ошибку.
Исправил, теперь будет работать корректно.
Страницы: 1
Читают тему
Наверх