Очередное зависание Lua-скрипта, в функции getDepoEx
Пользователь
Сообщений: Регистрация: 02.01.2026
30.05.2026 16:48:51
QUIK 13.0.0.165 Заинтересованные могут протестировать, скачав архив рабочего места по ссылке: Подключаться к серверу не требуется. Достаточно добавить в окно "Доступные скрипты" скрипт getDepoEx.lua (лежит в папке с программой) и запустить его.
Код
function main()
local n = getNumberOf("depo_limits")
message("Number depo_limits: " .. n)
if n > 0 then
getDepoEx("NC0011100000", "10382", "SBER", "NL0011100043", 20260601)
end
message("Завершение работы main.")
end
При запуске скрипта в окне "Системные сообщения" появляется сообщение "Number depo_limits: 4", и скрипт остаётся в запущенном состоянии. Сообщения "Завершение работы main." нет, что говорит о том, что не происходит выхода из функции getDepoEx. При этом процесс info.exe грузит один из логических процессоров на 100%.
QUIK clients support
Сообщений: Регистрация: 11.08.2025
04.06.2026 05:54:22
Добрый день.
Возможно, дело в том, что цикл, где вы пытаетесь получить позиции по инструменту, не останавливается т.к. в функцию getDepoEx были введены некорректные данные.
В качестве последнего параметра limit_kind указывается срок расчетов и getDepoEx принимает это значение в формате NUMBER. Возможные значения - положительные целые числа, начиная с «0», соответствующие срокам расчетов из таблицы «Позиции по инструментам»: «0» – T0, «1» – T1, «2» – T2 и т.д.
Попробуйте изменить этот момент и проверьте работу скрипта.
Пользователь
Сообщений: Регистрация: 31.01.2015
04.06.2026 07:02:07
Не смог промолчать, прочитав ответ техподдержки.
1) В опубликованном в первом сообщении темы коде НЕТ ЦИКЛА.
2) limit_kind может принимать значения типа 20260601, если лимитирование идёт по календарным дням, а не по схеме T0, T1 и т.д.
3) В случае некорректных значений функция getDepoEx всё равно должна завершать свою работу без зависания.
4) Адекватной реакцией техподдержки должна быть попытка воспроизведения проблемы на своём тестовом контуре с одним из выводов: удалось воспроизвести и будем чинить, или не удалось воспроизвести.
Пользователь
Сообщений: Регистрация: 31.01.2015
04.06.2026 07:16:11
Для п.2 приведу ссылку на тему форума, где было обсуждение такой схемы лимитирования.
В документации QLua версии 13.0 этот момент не отражён.
QUIK clients support
Сообщений: Регистрация: 11.08.2025
05.06.2026 09:32:17
Здравствуйте.
В ходе тестирования скрипта, у нас не возникло проблем, ошибок или зависаний Рабочего места. В окне сообщений появляются оба сообщения: о количестве позиций по инструментам и о завершении работы main.
Подскажите, пожалуйста, представленная часть кода - это весь скрипт? Запущены ли еще какие-то скрипты параллельно?
function main()
local sec_code = "SBER"
local n = getNumberOf("depo_limits")
if n > 0 then
message("Number depo_limits: " .. n)
for i = 0, n - 1 do
local l = getItem("depo_limits", i)
message(l.sec_code .. ": limit_kind = " .. l.limit_kind .. "; currentbal = " .. l.currentbal .. "; wa_position_price = " .. l.wa_position_price)
end
message(tostring(getDepoEx("NC0011100000", "10382", "SBER", "NL0011100043", 20260601)))
else
message("depo_limits not found", 2)
end
message("Завершение работы main.")
end
Пользователь
Сообщений: Регистрация: 30.05.2016
05.06.2026 21:57:08
Попробовал, не воспроизводиться.QUIK 13.0.0.165.
Пользователь
Сообщений: Регистрация: 02.01.2026
06.06.2026 02:24:35
Цитата
Станислав написал: Попробовал, не воспроизводиться.QUIK 13.0.0.165.
Вы что-то другое пробовали. В архиве, что я выложил (ссылка в первом посте), другие лимиты.
Пользователь
Сообщений: Регистрация: 30.01.2015
06.06.2026 07:08:25
Возможно архив кривой При обновлении остались какие-то старые библиотеки. Поставьте КВИК с нуля
Пользователь
Сообщений: Регистрация: 30.05.2016
06.06.2026 10:06:24
Если использовать архив из первого сообщения, то проблема действительно воспроизводится, однако, только если не подключаться к серверу. Стоит подключиться к серверу, скрипт корректно выполняется.
Пользователь
Сообщений: Регистрация: 02.01.2026
06.06.2026 11:58:08
Станислав, я не знаю как вы тестируете, но из вашего скрина видно, что код getDepoEx("NC0011100000", "10382", "SBER", "NL0011100043", 20260601) не должен был вернуть table. Ну нет у вас лимитов с такими вводными.
и лимиты обновятся, это будет уже другой набор данных.
Цитата
Станислав написал: Если использовать архив из первого сообщения, то проблема действительно воспроизводится, однако, только если не подключаться к серверу.
Я локализовал проблему, выложил архив, на котором воспроизводится описанная мной проблема. Что ещё нужно?
QUIK clients support
Сообщений: Регистрация: 11.08.2025
08.06.2026 15:30:04
Здравствуйте.
Мы не занимаемся тестированием скриптов. Если у вас есть вопросы по какой-то конкретной функции, просьба озвучить их и мы постараемся помочь.
Пользователь
Сообщений: Регистрация: 02.01.2026
08.06.2026 16:28:24
Цитата
Oleg Kuzembaev написал: В ходе тестирования скрипта, у нас не возникло проблем, ошибок или зависаний Рабочего места.
Вы проверяли на рабочем месте из архива по ссылке в первом посте, без изменения настроек и кода скрипта и без подключения к серверу?
QUIK clients support
Сообщений: Регистрация: 11.08.2025
09.06.2026 18:56:43
Тест проводился на подключенном к серверу терминале, что является корректным условием для работы скрипта.
Пользователь
Сообщений: Регистрация: 27.01.2017
09.06.2026 19:34:14
Цитата
Oleg Kuzembaev написал: Тест проводился на подключенном к серверу терминале, что является корректным условием для работы скрипта.
Зря Вы это написали, т.к. в таком случае документацию необходимо обновлять и точно указывать для каких методов не гарантируется корректная работа при отсутствии соединения. Более того, если в процессе работы происходит разрыв соединения и в этот момент скрипт выполняет метод, который может привести к "зависанию" терминала, то это уже совсем не корректно, а вполне себе ошибка. И чтобы её избежать необходимо понимать какие методы необходимо обрамлять предварительной проверкой на наличие соединения.
написал: Тест проводился на подключенном к серверу терминале, что является корректным условием для работы скрипта.
Зря Вы это написали, т.к. в таком случае документацию необходимо обновлять и точно указывать для каких методов не гарантируется корректная работа при отсутствии соединения. Более того, если в процессе работы происходит разрыв соединения и в этот момент скрипт выполняет метод, который может привести к "зависанию" терминала, то это уже совсем не корректно, а вполне себе ошибка. И чтобы её избежать необходимо понимать какие методы необходимо обрамлять предварительной проверкой на наличие соединения.
если правильно понял, то зависание происходит при отсутствии лимитов Такая ситуация невозможна при разрыве соединения. Ситуация возникает лишь при старте терминала. Да и то при отсутствии колбека конфигурации, цикла в main и каких-либо ожиданий прихода данных, либо проверки их доступности. Более нелепого (мягко скажу) скрипта я еще не видел. ---------------------------- Но соглашусь, что зависания не должно быть даже в самых дурацких скриптах. ------------------------------------ Раньше такой же эффект был с функцией получения пути к скрипту, если ее поставить первой строкой в скрипте. Проблему после указания на нее исправили.
Пользователь
Сообщений: Регистрация: 02.01.2026
09.06.2026 21:26:16
Цитата
Oleg Kuzembaev написал: Тест проводился на подключенном к серверу терминале
На момент публикации моего сообщения 30.05.2026 getDepoEx в опубликованном скрипте не завершала работу как при подключении к серверу, так и без подключения. Как я раннее писал, зависание происходит не всегда. И, помимо открытого графика, на это влияют лимиты по бумаге, которые запрашиваются в getDepoEx. В другой день, с другими лимитами, с другими параметрами в запросе зависания может не происходить. Поэтому я и сохранил то состояние, при котором можно гарантированно воспроизвести проблему и найти ошибку. Спустя несколько дней, когда вы всё-таки соизволили запустить тест, лимиты по счёту 10382 уже обновились. Если вы вообще проверяли на том же счёте. Но, видимо, ваша цель не устранение ошибок в вашем софте, а - отчитаться, что "у нас всё хорошо".
Цитата
Oleg Kuzembaev написал: на подключенном к серверу терминале, что является корректным условием для работы скрипта.
Является ли вызов функции getDepoEx при отсутствии соединения с сервером некорректным? Добавьте тогда в документацию, какие функции нельзя запускать при отсутствии соединения с сервером и что необходимо предпринять при разрыве соединения с сервером.
Пользователь
Сообщений: Регистрация: 02.01.2026
09.06.2026 22:12:58
Цитата
Oleg Kuzembaev написал: Тест проводился на подключенном к серверу терминале
А на каком счёте тестировали? С рабочего места из моего архива или со своего, со своими настройками? Поэтому я и спросил, что показывает у вас скрипт из сообщения #6, чтобы понимать, а то ли вы вообще тестировали.