Я реализую в терминале QUIK автоматический экспорт рыночных данных (например, параметров LAST, BID, OFFER) по акциям, используя QLua-скрипт. В процессе столкнулся с проблемой, которую не удаётся решить по документации. Ниже подробно описываю поведение.
Polling через getParamEx работает, но полностью замораживает интерфейс QUIK
Простой тестовый скрипт, который вызывает getParamEx("TQBR", "SBER", "LAST") в цикле с паузой (sleep(1000)), возвращает корректные значения (result = 1, param_value = 295.670000 и т. п.). Однако в момент выполнения такого скрипта всё окно QUIK зависает — не обновляются таблицы, котировки, стакан, кнопки не реагируют. После остановки скрипта (иногда принудительно) терминал снова начинает работать.
В документации указано, что Lua-скрипты работают в основном потоке QUIK (раздел 2.2, стр. 11), и, соответственно, любой длительный цикл (даже с паузой) блокирует не только выполнение скрипта, но и интерфейс терминала.
Использование OnParam без цикла не блокирует QUIK, но getParamEx внутри OnParam не возвращает значения
Я настроил подписку через ParamRequest("TQBR", "SBER", "LAST"), и функция OnParam(class_code, sec_code) действительно вызывается при изменении параметра. Однако внутри OnParam, при вызове getParamEx("TQBR", "SBER", "LAST"), функция возвращает result = 0 или param_value = "", несмотря на то, что параметр реально изменился и отображается в QUIK.
При этом, если ту же функцию вызывать вне колбэка, она возвращает правильное значение.
Мой вопрос: как правильно получать значение параметра в момент вызова OnParam?
Судя по документации (раздел 2.2.18, стр. 17), OnParam вызывается по факту изменения параметра, но не указано, можно ли в этот момент гарантированно получить новое значение через getParamEx.
Предполагаю, что OnParam может вызываться до того, как внутренние данные становятся доступны, и поэтому getParamEx не возвращает актуальное значение. Либо существует другой способ получения данных в этом контексте.
Что я уже проверил:
Параметры "TQBR", "SBER", "LAST", "BID", "OFFER" указаны верно. Подписка работает.
Polling-скрипты возвращают корректные данные.
Проблема возникает только при вызове getParamEx внутри OnParam.
Прошу уточнить:
Поддерживается ли вызов getParamEx внутри OnParam, или это поведение недопустимо?
Если недопустимо — как правильно получить значение параметра в момент вызова OnParam?
Если допустимо — есть ли особые условия или рекомендации по таймингу (например, отложенный вызов через таймер)?
Буду благодарен за любые разъяснения или рабочий пример.