Alexey Ivannikov написал: Устроила бы Вас реализация настраиваемого на стороне терминала QUIK искусственного ограничения на количество отправляемых транзакций в секунду?
Предлагаю следующую реализацию: В настройках терминала пользователь задаёт максимальное количество транзакций в секунду (N), отправляемых на сервер. Терминал хранит таблицу времён отправки транзакций за последнюю секунду. Перед отправкой транзакции терминал проходит по таблице и удаляет все записи старше 1 секунды. Если записей в таблице меньше N, то транзакция отправляется на сервер. При успешной отправке транзакции время её отправки заносится в эту таблицу. Если количество записей в таблице больше или равно N, то транзакция сохраняется в буфер для дальнейшей отправки. Периодически (чаще 1 раза/сек, задаётся в настройках) из таблицы времени удаляются записи старше 1 секунды и, если записей становится меньше N, то из буфера выталкиваются транзакции в порядке FIFO для отправки на сервер.
Закрывается DataSource при остановке скрипта?
Пользователь
Сообщений: Регистрация: 02.01.2026
16.08.2026 10:28:57
Цитата
Oleg Kuzembaev написал: Попробуйте добавить проверку на существование объекта.
А из текста ошибки вам не понятно, что объект существует?
Если бы не было самого объекта ds, то ошибка была бы:
Цитата
attempt to index a nil value (global 'ds')
При отсутствии метода Close у существующего объекта была бы ошибка:
Цитата
attempt to call a nil value (method 'Close')
Ошибка из первого сообщения
Цитата
bad argument #1 to 'tostring' (value expected)
однозначно говорит, что в tostring ничего не передаётся, а следовательно метод Close ничего не возвращает. Я не знаю, как можно по другому интерпретировать эту ошибку
Снятие/перемещение заявок в стакане
Пользователь
Сообщений: Регистрация: 02.01.2026
16.08.2026 10:06:20
Цитата
Alexey Ivannikov написал: Устроила бы Вас реализация настраиваемого на стороне терминала QUIK искусственного ограничения на количество отправляемых транзакций в секунду?
Зарегистрируйте.
Отсутствует ID транзакции у части сделок, У заявки trans_id есть, у сделки по ней - нет
Пользователь
Сообщений: Регистрация: 02.01.2026
31.07.2026 16:52:52
Цитата
Kilor написал: В случае, если заявка была выставлена, но сделка была совершена спустя время, то есть изначальная заявка ожидала встречной заявки с подходящими условиями, то параметр trans_id на сделке указан не будет
Вот это поворот!
Цитата
Kilor написал: Ранее Вам был направлен ответ который нам предоставил разработчик торгового терминала QUIK - ArqaTechnologies.
Премию люлей этому доброму человеку!
Закрывается DataSource при остановке скрипта?
Пользователь
Сообщений: Регистрация: 02.01.2026
30.07.2026 13:19:56
Цитата
Oleg Kuzembaev написал: а функция tostring не принимает nil в качестве аргумента.
С каких пор?
Цитата
Oleg Kuzembaev написал: По всей видимости ошибка возникает, поскольку ds:Close() в момент вызова возвращает nil
Вы даже код не запускали... ds:Close() не возвращает ничего. На всякий случай уточню: вместо class и sec можно подставить любые существующие коды класса и инструмента. Но даже, если бы он вернул nil, вопрос в заголовке темы: Закрывается DataSource при остановке скрипта?
Панель информации о позиции в стакане
Пользователь
Сообщений: Регистрация: 02.01.2026
28.07.2026 20:04:48
Цитата
Polina Anisova написал: в схеме ведения позиций по видам лимитов будет отображена позиция соответствующая Т1
Почему тогда при ведении позиции по календарным датам в стакане отображается другая позиция? T0 -> 28.06.2026 -> 11 T1 -> 30.06.2026 -> 179 Не вижу оснований для регистрации пожелания по доработке, когда это явная ошибка.
Панель информации о позиции в стакане
Пользователь
Сообщений: Регистрация: 02.01.2026
28.07.2026 18:50:17
Polina Anisova, здравствуйте. В QUIK Junior расчёты позиций ведутся по календарным датам. Я же спросил: какая позиция будет отображаться в аналогичной ситуации, но, если расчёты на сервере ведутся по Т+1?
Если бы я был архитектором QUIK, Что стоило бы изменить в QUIK по-крупному
Пользователь
Сообщений: Регистрация: 02.01.2026
27.07.2026 17:52:11
Цитата
TGB написал: При переподключении сервер заново передает мегабайты исторических логов всех сделок за день
Это только при переключении на другой сервер. В диспетчере задач можно посмотреть сетевую активность.
Я указал названия параметров для getParamEx2. Думаю для getSecurityInfo это будет соответствовать exp_date
Как получить дату экспирации?
Пользователь
Сообщений: Регистрация: 02.01.2026
16.07.2026 10:26:50
Для фьючерсов MAT_DATE - последний день обращения EXPDATE - дата экспирации В обоих случаях число вида ГГГГММДД
Панель информации о позиции в стакане
Пользователь
Сообщений: Регистрация: 02.01.2026
14.07.2026 13:17:59
Polina Anisova, так и какая позиция будет отображаться в стакане при Т1: 11 или 179?
Панель информации о позиции в стакане
Пользователь
Сообщений: Регистрация: 02.01.2026
10.07.2026 21:23:59
А при ведении позиции по коду расчётов по Тх какая позиция отображается в стакане?
Панель информации о позиции в стакане
Пользователь
Сообщений: Регистрация: 02.01.2026
02.07.2026 20:06:03
Цитата
Polina Anisova написал: система отображает позицию на ближайшую более раннюю дату.
Логичнее отображать на более позднюю. А то совершаем сделки, а позиция не меняется.
Панель информации о позиции в стакане
Пользователь
Сообщений: Регистрация: 02.01.2026
01.07.2026 13:21:36
Polina Anisova, значит, баг, когда в стакане отображается позиция не на дальнюю дату расчётов, а на текущую.
Очередное зависание Lua-скрипта, в функции getDepoEx
Пользователь
Сообщений: Регистрация: 02.01.2026
28.06.2026 22:18:47
Цитата
Oleg Kuzembaev написал: Проверка проходила с подключением и без него.
После первого подключения, обновления лимитов и изменения окружения это уже не имеет значения.
Очередное зависание Lua-скрипта, в функции getDepoEx
Пользователь
Сообщений: Регистрация: 02.01.2026
28.06.2026 22:17:29
Цитата
funduk написал: Совершенно аналогичным образом виснет getBuySellInfoEx, если нет соединения с сервером квика.
getDepoEx зависает независимо от наличия/отсутствия соединения с сервером. Я сохранил архив 30.05.2026 с тем окружением, при котором запрос getDepoEx с датой расчётов 20260601 приводит к зависанию. Для разработчика / тестировщика это - самый лайтовый вариант, когда присылают архив с окружением, в котором сразу же без танцев можно воспроизвести проблему. Но Арка не ищет лёгких путей. Они провели тестирование 04.06.2026 или 05.06.2026, зачем-то подключившись к серверу (и то, после того, как сотруднику техподдержки разъяснили, где он не прав). В результате лимиты обновились и окружение поменялось. После этого запрос getDepoEx с датой расчётов в прошлом (01.06.2026) относительно даты в окружении (04.06.2026 или 05.06.2026) уже не приводит к зависанию.
Очередное зависание Lua-скрипта, в функции getDepoEx
Пользователь
Сообщений: Регистрация: 02.01.2026
28.06.2026 22:07:56
Цитата
nikolz написал: Возможно зависание , так как нет проверки "n" на nil
Во-первых, n = 4, об этом написано в первом же посте темы. Во-вторых, если бы getNumberOf, вопреки спецификации, вернула бы nil, то скрипт бы вылетел на выражении if n > 0 then с ошибкой "attempt to compare number with nil". Вы не знаете элементарных вещей, зачем вы постоянно демонстрируете свои незнания?
Панель информации о позиции в стакане
Пользователь
Сообщений: Регистрация: 02.01.2026
28.06.2026 18:01:33
Задаётся ли в настройках дата расчётов для отображения позиции в стакане или это очередной баг (версия 13.0.0.165)?
Рано вам ещё называться начинающим программистом, почитайте ещё книжек.
Очередное зависание Lua-скрипта, в функции getDepoEx
Пользователь
Сообщений: Регистрация: 02.01.2026
24.06.2026 09:48:49
Oleg Kuzembaev, все пользователи (целых два человека), которые провели тестирование на данных из архива, сообщают, что проблема воспроизводится. Что у вас показывает скрипт из сообщения ?
Очередное зависание Lua-скрипта, в функции getDepoEx
Пользователь
Сообщений: Регистрация: 02.01.2026
23.06.2026 10:32:21
Цитата
Oleg Kuzembaev написал: Воспроизвести ошибку не удалось.
После подключения к серверу спустя несколько дней лимиты по бумагам обновляются. Очевидно, что это уже не те данные, на которых воспроизводилась ошибка в представленном скрипте. Вы проверяли на моём архиве без подключения к серверу?
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 02.01.2026
20.06.2026 20:26:50
Врёт ваша нейронка.
Цитата
О trans_id торговая система ничего не знает, это внутренняя сущность сервера QUIK.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 02.01.2026
19.06.2026 17:31:25
Цитата
Nikolay написал: [QUOTE] написал: А что brokerref он в одном колбеке приходит в другом нет
Такого не замечал. brokerref - ненадёжный параметр. У меня он только в OnTransReply транслируется. В других колбэках его нет.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 02.01.2026
19.06.2026 14:09:38
Цитата
VPM написал: виртуальная позиция (book) расходится с реальной позицией на бирже (exchange).
Обычно информация о лимитах поступает позже информации по сделкам. Если считать виртуальную позицию по сделкам, то может быть расхождение с реальной, пока с биржи не поступит информация об изменении лимитов.
Закрывается DataSource при остановке скрипта?
Пользователь
Сообщений: Регистрация: 02.01.2026
17.06.2026 11:13:56
У меня одного ds:Close() после нажатия кнопки "Остановить" ничего не возвращает?
Закрывается DataSource при остановке скрипта?
Пользователь
Сообщений: Регистрация: 02.01.2026
17.06.2026 11:13:06
Цитата
Oleg Kuzembaev написал: Просьба прислать архив копии папки с терминалом нам на почту quiksupport@arqatech.com
А у вас своего нет?
В каком потоке делать финализацию при останове скрипта?
Пользователь
Сообщений: Регистрация: 02.01.2026
10.06.2026 14:19:45
Цитата
Йцукен написал: Видно, что OnStop второго скрипта вызывается только после завершения main первого.
В версии 13.0.0 изменили схему: OnStop вызывается сразу после завершения OnStop предыдущего скрипта, не зависимо от того остановился ли main предыдущего скрипта. Возможно, разработчики прочитали моё сообщение #4 или просто так совпало.
Отключать сборщик мусора при работе с колбеками. Вы прикалываетесь?
Пользователь
Сообщений: Регистрация: 02.01.2026
10.06.2026 11:31:12
Вот что пишет ИИ:
Цитата
Почему остановка GC замедляет выполнение
1. Lua 5.4 использует инкрементальный/генерационный GC, оптимизированный под короткоживущие объекты. GC собирает их крошечными шагами (step) во время аллокаций, часто укладываясь в ~0.1–0.3 мкс на шаг. Это дешевле, чем отключённый GC. 2. При collectgarbage("stop") отключается не только сборка, но и оптимизированный путь аллокатора. Lua перестаёт переиспользовать недавно освобождённые блоки, чаще обращается к malloc/realloc ОС, что ведёт к: - Кэш-промахам (память выделяется фрагментированно) - Системным вызовам (рост brk/mmap) - Отсутствию minor-collection nursery, которая в Lua 5.4 работает почти бесплатно
Очередное зависание Lua-скрипта, в функции getDepoEx
Пользователь
Сообщений: Регистрация: 02.01.2026
09.06.2026 22:12:58
Цитата
Oleg Kuzembaev написал: Тест проводился на подключенном к серверу терминале
А на каком счёте тестировали? С рабочего места из моего архива или со своего, со своими настройками? Поэтому я и спросил, что показывает у вас скрипт из сообщения #6, чтобы понимать, а то ли вы вообще тестировали.
Очередное зависание Lua-скрипта, в функции getDepoEx
Пользователь
Сообщений: Регистрация: 02.01.2026
09.06.2026 21:26:16
Цитата
Oleg Kuzembaev написал: Тест проводился на подключенном к серверу терминале
На момент публикации моего сообщения 30.05.2026 getDepoEx в опубликованном скрипте не завершала работу как при подключении к серверу, так и без подключения. Как я раннее писал, зависание происходит не всегда. И, помимо открытого графика, на это влияют лимиты по бумаге, которые запрашиваются в getDepoEx. В другой день, с другими лимитами, с другими параметрами в запросе зависания может не происходить. Поэтому я и сохранил то состояние, при котором можно гарантированно воспроизвести проблему и найти ошибку. Спустя несколько дней, когда вы всё-таки соизволили запустить тест, лимиты по счёту 10382 уже обновились. Если вы вообще проверяли на том же счёте. Но, видимо, ваша цель не устранение ошибок в вашем софте, а - отчитаться, что "у нас всё хорошо".
Цитата
Oleg Kuzembaev написал: на подключенном к серверу терминале, что является корректным условием для работы скрипта.
Является ли вызов функции getDepoEx при отсутствии соединения с сервером некорректным? Добавьте тогда в документацию, какие функции нельзя запускать при отсутствии соединения с сервером и что необходимо предпринять при разрыве соединения с сервером.
Очередное зависание Lua-скрипта, в функции getDepoEx
Пользователь
Сообщений: Регистрация: 02.01.2026
08.06.2026 16:28:24
Цитата
Oleg Kuzembaev написал: В ходе тестирования скрипта, у нас не возникло проблем, ошибок или зависаний Рабочего места.
Вы проверяли на рабочем месте из архива по ссылке в первом посте, без изменения настроек и кода скрипта и без подключения к серверу?
Закрывается DataSource при остановке скрипта?
Пользователь
Сообщений: Регистрация: 02.01.2026
08.06.2026 12:04:45
Код
local run = true
function OnStop()
run = nil
message(tostring(ds:Close()))
end
function main()
ds = assert(CreateDataSource(class, sec, INTERVAL_M5))
while run do sleep(500) end
end
Код
local run = true
function OnStop()
run = nil
end
function main()
ds = assert(CreateDataSource(class, sec, INTERVAL_M5))
while run do sleep(500) end
message(tostring(ds:Close()))
end
Что в первом, что во втором случае, при нажатии на кнопку "Остановить" скрипт падает с ошибкой "bad argument #1 to 'tostring' (value expected)"
Очередное зависание Lua-скрипта, в функции getDepoEx
Пользователь
Сообщений: Регистрация: 02.01.2026
06.06.2026 11:58:08
Станислав, я не знаю как вы тестируете, но из вашего скрина видно, что код getDepoEx("NC0011100000", "10382", "SBER", "NL0011100043", 20260601) не должен был вернуть table. Ну нет у вас лимитов с такими вводными.
и лимиты обновятся, это будет уже другой набор данных.
Цитата
Станислав написал: Если использовать архив из первого сообщения, то проблема действительно воспроизводится, однако, только если не подключаться к серверу.
Я локализовал проблему, выложил архив, на котором воспроизводится описанная мной проблема. Что ещё нужно?
Очередное зависание Lua-скрипта, в функции getDepoEx
Пользователь
Сообщений: Регистрация: 02.01.2026
06.06.2026 02:24:35
Цитата
Станислав написал: Попробовал, не воспроизводиться.QUIK 13.0.0.165.
Вы что-то другое пробовали. В архиве, что я выложил (ссылка в первом посте), другие лимиты.
Очередное зависание Lua-скрипта, в функции getDepoEx
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
В каком потоке делать финализацию при останове скрипта?
Пользователь
Сообщений: Регистрация: 02.01.2026
01.06.2026 00:20:55
ИИ рекомендует:
Цитата
Как правильно организовывать остановку в QUIK 1. OnStop() только ставит флаг. Никаких циклов, очисток таблиц или долгих операций. 2. Очистка ресурсов выполняется в main() после выхода из рабочего цикла.
Кто что думает?
Очередное зависание 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%.
Сообщения об ошибках в Lua-скриптах не выводятся в окне сообщений
Пользователь
Сообщений: Регистрация: 02.01.2026
28.05.2026 19:30:55
Если ошибки возникают в колбэках, то они выводятся в окно сообщений, а если ошибка в main, - то не выводится.
Сообщения об ошибках в Lua-скриптах не выводятся в окне сообщений
Пользователь
Сообщений: Регистрация: 02.01.2026
28.05.2026 18:18:40
Почему-то сообщения об ошибках в Lua-скриптах не выводятся в окне сообщений и таблице системных сообщений.
Работа OnClose
Пользователь
Сообщений: Регистрация: 02.01.2026
21.05.2026 16:59:07
Oleg Kuzembaev, В руководстве пользователя QLua написано:
Цитата
IsWindowClosed
Функция предназначена для определения состояния окна таблицы «t_id».
Вызов IsWindowClosed внутри функции обратного вызова, заданной с помощью SetTableNotificationCallback(), всегда вернет «false».
Формат вызова:
BOOLEAN IsWindowClosed(NUMBER t_id)
Функция возвращает:
«false» – если окно таблицы «t_id» открыто в терминале; «true» – если окно таблицы «t_id» закрыто пользователем вручную. Окно может быть открыто повторно с помощью функции CreateWindow; «nil» – если таблица «t_id» не существует (указан несуществующий / некорректный идентификатор или таблица удалена функцией DestroyTable).
Но IsWindowClosed возвращает true для окна, которое не было закрыто пользователем вручную, при закрытии QUIK, загрузки настроек из wnd-файла, замены инструментов, что не соответствует документации.
Добавить время до микросекунд в стакан из getQuoteLevel2(), Добавить время до микросекунд в стакан из getQuoteLevel2()
Пользователь
Сообщений: Регистрация: 02.01.2026
21.05.2026 16:45:46
Время последней записи (не заявки!) == время среза стакана.
Добавить время до микросекунд в стакан из getQuoteLevel2(), Добавить время до микросекунд в стакан из getQuoteLevel2()
Пользователь
Сообщений: Регистрация: 02.01.2026
20.05.2026 17:01:35
nikolz, указывать надо время самой поздней записи, т.е. с максимальным значением поля moment (moment_ns). Это же очевидно.
Добавить время до микросекунд в стакан из getQuoteLevel2(), Добавить время до микросекунд в стакан из getQuoteLevel2()
Пользователь
Сообщений: Регистрация: 02.01.2026
20.05.2026 11:01:24
nikolz, getQuoteLevel2() возвращает "стакан" - таблицу заявок. Там нет сделок. Указывать время последнего обновления записи, которое даёт шлюз ТС.
Работа OnClose
Пользователь
Сообщений: Регистрация: 02.01.2026
20.05.2026 10:56:34
Цитата
Oleg Kuzembaev написал: можно получать еще колбек о закрытии терминала и если последний не был получен, то с высокой долей вероятности окно было закрыто пользователем.
OnClose вызывается после закрытия всех окон. Таким образом, отсутствие OnClose ни о чём не говорит.
Вопрос ко всем, кто знает: какую таблицу возвращает getQuoteLevel2 если нет bid или ask?
Эта функция отличается от getQuoteLevel2 тем, что вместо строк данных возвращает числовые - не нужно делать лишние преобразования "строка -> число".
Цитата
Alexander написал: А вот зачем вариант со строками, где все цены и лоты в одну строку? Потом самому парсить эту строку в цикле? Потом из цикла всё это распихивать по своим таблицам или переменным? Зачем? Вам дана уже готовая таблица. Пользуйтесь. Если вам нужна компактность, сохранение, ну так кто мешает написать свои функции и из готовых таблиц слепить себе нужные строки? Ваш вариант будет ещё хуже, так как надо будет разбирать строки на отдельные данные через регулярки, это ещё дольше, чем у них на сях там всё уже по полочкам разложено.
Согласен, странное пожелание. Парсинг строк в Lua медленнее, чем просто взять значение из таблицы.
Добавить время до микросекунд в стакан из getQuoteLevel2(), Добавить время до микросекунд в стакан из getQuoteLevel2()
Пользователь
Сообщений: Регистрация: 02.01.2026
19.05.2026 21:54:05
Цитата
Alena Mishina написал: такого параметра мы не получаем из торговой системы
Иногда полезно заглядывать в документацию. Так, например, в шлюзе PLAZA II для многих таблиц транслируется время: параметры moment и moment_ns
Работа OnClose
Пользователь
Сообщений: Регистрация: 02.01.2026
19.05.2026 21:05:24
Цитата
Oleg Kuzembaev написал: Понять закрыто ли конкретное окно можно с помощью функции IsWindowClosed
Это не даёт информации о том, закрыто ли окно пользователем вручную, либо же окно уничтожено при закрытии терминала.