Alexey (Автор тем)

Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
Неверные флаги в функции 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) Что можно ещё сделать в данной ситуации для улучшения стабильности ?
Почему-то не происходит обновления табличных данных лучший спрос и лучшее предложение (брокер СБЕР) ??, Два дня на
 
Установлены настройки Программа->Получение данных(запрашивать данные раз в 1 сек.)->Котировки->FORTS:Фьючерсы
Брокер: СБЕР

Два дня назад заметил проблему - в таблице текущие торги перестали обновляться данные в столбцах "Спрос" и "Предл." по фьючерсным контрактам.
Помогла операция "Система->Заказ данных->Перезаказать данные..."
Вроде заработало, потом опять возникла такая же проблема, значения как бы зависают на одном уровне и не обновляются...
Вчера обновил Квик до версии 9.4.2.1 . Вроде проблема ушла... Но сегодня утром опять так же - котировки "Спрос" и "Предл." зависают на каком-то одном уровне и не обновляются...
Такое наблюдаю только в СБЕР. У финам 9.3.3.3 и Открытие 9.3.1.11 система работает нормально.

Дело в брокере СБЕР ??

Что ещё можно сделать?! Куда смотреть - на какие настройки ?!

У меня скрипты заточены именно на эти поля (лучший "Спрос" и "Предл.")
Раньше, более нескольких месяцев всё работало хорошо, но теперь какая-то фигня с лагами по данным и пошли потери денег...
Функции getBuySellInfoEx и getFuturesLimit возвращают nil по одному из клиентских счетов - почему такое может быть ?!
 
Мой торговый скрипт работает на нескольких клиентских счетах у брокеров Финам, Открытие, СБЕР.
В нём используется getBuySellInfoEx и getFuturesLimit .
На одном из новых счетов скрипт стал стабильно возвращать nil по этим функциям
Как будто неверно задан FIRMID.
Что можно сделать чтобы найти причину проблемы ?
Какое быстродействие у агло заявок типа spread ?, начал использовать модуль алгоритмической торговли и непонятно какое здесь быстродействие
 
Тестирую - Алгоритмическая заявка типа «Spread» от брокера Открытие.
Поставил на фьючерсы СБЕР - продажа спреда между SRU2 и SRM3 на уровне 1010 руб., но словил проскальзывание 196 руб. , то есть по факту спред исполнился = 814 руб.
Не понял почему, движение актива было в виде слабого роста.

Видимо быстродействие очень низкое, но как это понять в цифрах ?

Сколько миллисекунд цикл ? Сколько миллисекунд RoundTrip задержка ?

Через несколько минут работы приложение зависает с ошибкой General Protection Fault - Internal exception happened
 
QUIK 8.13.3.1
Несколько месяцев всё работало нормально.
На прошлой неделе начались зависания с ошибкой General Protection Fault - Internal exception happened
Система работает несколько минут или пару часов , а потом виснет.

Как это лечить ?
Иногда не срабатывает killorder (во время движений)
 
Хронология событий такая:
1) 10:00:01 Робот отправил приказ удалить заявку "KILL_ORDER"
2) Примерно в это же время (или чуть раньше, на открытии сессии) началось сильное движение в котировках инструмента.
3) 10:00:08 Заявка была исполнена (заключена сделка на бирже) . Спустя СЕМЬ СЕКУНД !!!
4) 10:00:08 Пришёл OnOrder с флагами исполнения заявки.
5) 10:00:09 Пришёл OnTransReply с статусом 5. "Вы не можете снять данную заявку"

В обычных ситуациях (без сильных движений) этот же программный код нормально снимает заявки.
Но вот такой игнор KILL_ORDER наблюдаю второй раз именно на движении. Второй раз зафиксировал события в логах.

Вопросы:
Это где-то у брокера приказ "KILL_ORDER" подвис ?
Как обрабатывать такие коллизии ?
Слать повторный "KILL_ORDER" , если вижу что заявка осталась в активном статусе ?
Функция getParamEx возвращает нули по параметрам максимальная, минимальная цена для акций, проблемы с переходом на новую версию qlua
 
Установил quik 8.8.4.3 и запускаю скрипт, который ранее работал на 7й версии.

Функция getParamEx
Страницы: 1
Наверх