Анатолий Савицкий (Все сообщения пользователя)

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

Страницы: 1
Проблема при вызове 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. Если допустимо — есть ли особые условия или рекомендации по таймингу (например, отложенный вызов через таймер)?

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

Страницы: 1
Наверх