Работаю на четырех брокерах: СБЕР, ВТБ, Финам, Открытие
Код выставляет лимитную заявку, ожидая исполнения.
Рассматривается вариант, что пользователь снимает эту лимитную заявку в ручном режиме, тогда нужно остановить выполнение всего скрипта.
Соответственно код остановки скрипта:
Так вот, у брокеров ВТБ и СБЕР иногда возникает ситуация в обработчике OnOrder , когда флаги показывают состояние 26.
бит 0 (0x1) = 0 - заявка не активна
бит 1 (0x2) = 1 - заявка снята
но на самом деле лимитная заявка продолжает находится в активном статусе в терминале Квик.
Это происходит иногда... Не часто. Не понимаю почему так...
Вчера стал это связывать с проблемами запаздывания времени часов Квик относительно часов Windows.
Внезапно время часов Квик, работавшее синхронно с Windows, вдруг начинает запаздывать на 5, 10, 30 сек, потом на минуту и более, потом "догоняет" и работает какое-то время синхронно, потом опять начинается цикл запаздывания и гонок и т.д.
Наблюдается "аритмия" в часах Квик.
"Глючил" именно брокер СБЕР.
Версия QUIK 9.7.1.10
И вот на этой аритмии и возникают неверные флаги OnOrder.
Включил измерение времени в функции OnOrder :
где 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) Что можно ещё сделать в данной ситуации для улучшения стабильности ?
Код выставляет лимитную заявку, ожидая исполнения.
Рассматривается вариант, что пользователь снимает эту лимитную заявку в ручном режиме, тогда нужно остановить выполнение всего скрипта.
Соответственно код остановки скрипта:
Код |
---|
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 |
По всем вчерашним неверным флагам замечено, что обработчик OnOrder вызывается спустя 1 мс после вызова функции sendTransaction(transaction).
Обычный тайминг около 80-120 мс когда проблем с флагами OnOrder не наблюдается.
Вообще среднее время 100 мс - это нормальный такой тайминг callback-функций Квика на отправку транзакции, как здесь может возникать одна миллисекунда ?!
Наверное это как-то связано с часами Квика, которые начинают "сбоить" и работать аритмично относительно нормального времени Windows.
То есть получается как будто OnOrder вызывается и обрабатывается в тот момент когда флаги ещё не установлены, этой лимитной заявки в системе как бы нет.
Вопросы:
1) Возможно ли что функция OnOrder выполняется через 1 мс после отправки sendTransaction(transaction) ??
2) Возможно ли что в первичный вызов OnOrder флаги ещё не приняли правильного положения и будут установлены в последующих вызовах OnOrder ??
3) Что можно ещё сделать в данной ситуации для улучшения стабильности ?