Проблема при вызове getParamEx внутри OnParam

Страницы: 1
RSS
Проблема при вызове getParamEx внутри OnParam, getParamEx внутри OnParam не возвращает значения
 

Я реализую в терминале QUIK автоматический экспорт рыночных данных (например, параметров LAST, BID, OFFER) по акциям, используя QLua-скрипт. В процессе столкнулся с проблемой, которую не удаётся решить по документации. Ниже подробно описываю поведение.

  1. Polling через getParamEx работает, но полностью замораживает интерфейс QUIK

Простой тестовый скрипт, который вызывает getParamEx("TQBR", "SBER", "LAST") в цикле с паузой (sleep(1000)), возвращает корректные значения (result = 1, param_value = 295.670000 и т. п.). Однако в момент выполнения такого скрипта всё окно QUIK зависает — не обновляются таблицы, котировки, стакан, кнопки не реагируют. После остановки скрипта (иногда принудительно) терминал снова начинает работать.

В документации указано, что Lua-скрипты работают в основном потоке QUIK (раздел 2.2, стр. 11), и, соответственно, любой длительный цикл (даже с паузой) блокирует не только выполнение скрипта, но и интерфейс терминала.

  1. Использование OnParam без цикла не блокирует QUIK, но getParamEx внутри OnParam не возвращает значения

Я настроил подписку через ParamRequest("TQBR", "SBER", "LAST"), и функция OnParam(class_code, sec_code) действительно вызывается при изменении параметра. Однако внутри OnParam, при вызове getParamEx("TQBR", "SBER", "LAST"), функция возвращает result = 0 или param_value = "", несмотря на то, что параметр реально изменился и отображается в QUIK.

При этом, если ту же функцию вызывать вне колбэка, она возвращает правильное значение.

  1. Мой вопрос: как правильно получать значение параметра в момент вызова OnParam?

Судя по документации (раздел 2.2.18, стр. 17), OnParam вызывается по факту изменения параметра, но не указано, можно ли в этот момент гарантированно получить новое значение через getParamEx.

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

Что я уже проверил:

  • Параметры "TQBR", "SBER", "LAST", "BID", "OFFER" указаны верно. Подписка работает.

  • Polling-скрипты возвращают корректные данные.

  • Проблема возникает только при вызове getParamEx внутри OnParam.

Прошу уточнить:

  1. Поддерживается ли вызов getParamEx внутри OnParam, или это поведение недопустимо?

  2. Если недопустимо — как правильно получить значение параметра в момент вызова OnParam?

  3. Если допустимо — есть ли особые условия или рекомендации по таймингу (например, отложенный вызов через таймер)?

Буду благодарен за любые разъяснения или рабочий пример.

 
Анатолий Савицкий, здравствуйте!

Для анализа ошибки, просьба предоставить отрывок кода, где вызываете функцию getParamEx внутри OnParam, или будет лучше если весь скрипт целиком.
Если переживаете за распространение вашего кода, можете отправить код письмом нам в поддержку по адресу quiksupport@arqatech.com и указать, что пришли с форума.
 
Полагаю следующее:
Если onParam вызван по факту получения нового "TQBR", "SBER", "LAST",
то это новое значение будет помещено в таблицу после  выхода из onParam.  
-----------------------------
Поэтому getParamEx("TQBR", "SBER", "LAST")  вернет это значение лишь после выхода из  onParam.
---------------------------
Надо читать новые параметры в main, а не в колбеке.
Страницы: 1
Читают тему
Наверх