В каком потоке делать финализацию при останове скрипта?
Пользователь
Сообщений: Регистрация: 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
Это не даёт информации о том, закрыто ли окно пользователем вручную, либо же окно уничтожено при закрытии терминала.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 02.01.2026
14.04.2026 13:04:18
TGB, Если без колбэков OnOrder и цикличного опроса активных заявок, то как, поделитесь секретом?
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 02.01.2026
14.04.2026 09:28:05
Цитата
TGB написал: коллбек OnTransReply при выполнении транзакций мной используется
OnTransReply вызывается при удалении заявки из Lua-скрипта.
Цитата
TGB написал: В любом случае обрабатывается только снимаемая заявка а не все активные заявки.
Тогда при удалении заявки, например, пользователем, брокером или биржей робот будет считать заявку активной.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 02.01.2026
13.04.2026 12:07:51
Цитата
TGB написал: Для просмотра изменений в заявках не надо перебирать все записи orders, stop_orders.
Знаю методы: 1) колбэк; 2) либо регулярная проверка активной заявки в цикле main через getItem. Во втором случае как раз надо перебирать все активные заявки, которые отслеживает скрипт. Или вы как-то по другому это делаете?
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 02.01.2026
12.04.2026 22:34:25
Цитата
TGB написал: Для просмотра изменений в заявках не надо перебирать все записи orders, stop_orders. Достаточно во вновь получаемых сделках (по изменению размера) таблицы traders выбирать trans_id (или номера ордеров) и просматривать только соответствующие заявки.
Вариант удаления заявки вы не рассматриваете?
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 02.01.2026
11.04.2026 21:04:36
Цитата
Nikolay написал: Он и опрашивается, через запомненный индекс записи в таблице. Когда ордер найден в таблице, то повторно его иска не надо, просто получить запись в таблице с свежими данными.
В цикле вы дергаете getItem, независимо от того, изменились ли параметры заявки (заявок) или нет?
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
написал: Изменение параметров заявки не приводит к изменению количества записей в таблице. Об этом вы узнаете только через колбэк, либо через регулярный опрос уже существующих записей в таблице.
Да. Датчик температуры ничего не скажет об её изменении. Спросите - скажет.
При чём тут датчик температуры? Если уж приводить аналогию, то, чтобы узнать изменение температуры отслеживаемого датчика, не нужно проверять изменение количества датчиков, а нужно опрашивать конкретный датчик.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 02.01.2026
11.04.2026 12:42:58
Цитата
TGB написал: Можно сделать паузу адаптивной к длительности основного цикла скрипта (это учтет все, в том числе и длительность обработки очереди):
А что это даёт?
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 02.01.2026
11.04.2026 12:17:08
Цитата
TGB написал: можно реализовать проверкой (с использованием trans_id) в таблицах order, stop_order. И эту проверку надо выполнять только, когда изменяется количество записей в них.
Изменение параметров заявки не приводит к изменению количества записей в таблице. Об этом вы узнаете только через колбэк, либо через регулярный опрос уже существующих записей в таблице.
В клиринг после 23:50 с ПН по ПТ вариационная маржа начисляется за период с 19:00 предыдущего торгового дня по 19:00 текущего торгового дня. При этом котировка последнего клиринга - это расчётная цена окончания основной торговой сессии в 19:00
CalcBuySell и getBuySellInfoEx неправильно считают для фьючерсов с валютой шага цены отличной от SUR
Пользователь
Сообщений: Регистрация: 02.01.2026
08.04.2026 10:43:58
В QUIK была проблема (не знаю, починили ли): неверно рассчитывался объём ГО в заявках по ценам, отличным от котировки клиринга.
В OnTransReply в поле brokerref отображается введённое в транзакции значение, а в OnOrder - всегда только <код клиента>
Где в QUIK посмотреть текущее значение денежных средств на срочной секции?
Пользователь
Сообщений: Регистрация: 02.01.2026
01.04.2026 09:06:42
Ув. разработчики QUIK, разъясните, пожалуйста, из каких значений каких таблиц в QUIK можно узнать текущее значение денежных средств на срочной секции Московской биржи с учётом начисленной вариационной маржи за текущую сессию? Т.е., если прямо сейчас я закрою (закрыл) все раннее открытые позиции, то сколько у меня будет денежных средств после клиринговых расчётов, - где это можно увидеть?
Где смотреть вариационку?
Пользователь
Сообщений: Регистрация: 02.01.2026
30.03.2026 22:37:30
Цитата
Промежуточный клиринг (ПК) отменяется и не будет проводиться Изменения в процессах, связанные с отменой ПК:
Нет промежуточной переоценки, и учета, накопленного финансового результата в промежуточных регистрах Экспирация контрактов ПК заменяется на экспирацию в торгах, с определением соответствующей ЦИ и пересчетом ГО по позициям Параметр num_clr_2delivery будет изменен в рамках перехода на ЕТС – деление на 2 и округление в большую строну Перестают отправляться отчеты, формируемые в ПК (dayriskparamsXXYY.csv; dayo07.csv; dayf07.csv; lldaymon.csv; daymonXXYY.csv)
Основной клиринг (ВК) в ЕТС делится на отдельные сущности:
Клиринговая сессия m-t-m – переоценка позиций, определение требований и обязательств (плановых остатков), лимитов (план + факт). Расчетная клиринговая сессия – исполнение требований и обязательств и обновление фактических остатков При этом Расчетные цены для клиринговой сессии m-t-m определяются с использованием данных на 19:00
Но чё-то я ничерта не понял. Если раньше сложив <Лимит открытых позиций> + <Накопленный доход> + <Вариационная маржа> можно было рассчитать текущие денежные средства в моменте, то как сейчас - не понятно.
Где смотреть вариационку?
Пользователь
Сообщений: Регистрация: 02.01.2026
30.03.2026 22:23:34
Цитата
Giulia написал: это маржа за период с 19:00 пятницы по время закрытия сделки сегодня. Почему?
Может быть, дело в том, что расчётные цены определяются в 19:00?
Где смотреть вариационку?
Пользователь
Сообщений: Регистрация: 02.01.2026
30.03.2026 16:52:33
Цитата
Giulia написал: ВМ за 19:00-23:50. Но тогда по-прежнему где ВМ за 9:00-19:00?
Вот именно, а где вариационная маржа с начала торговой сессии?
Йцукен написал: Проверил на другом счёте. По ВТБ позиций вообще нет. Но в стакане показывает.
Второй логин: U0229042
Панель информации о позиции в стакане
Пользователь
Сообщений: Регистрация: 02.01.2026
30.03.2026 13:25:08
Izotova Liliya, во-первых, вы не очищаете настройки перед тестированием. А потом вдруг выясняется: "ой, а у нас были такие-то настройки, поэтому не воспроизводилось". Во-вторых, я указал логин: U0228637, через который вы могли подключиться и проверить, а не с админского места.
Панель информации о позиции в стакане
Пользователь
Сообщений: Регистрация: 02.01.2026
30.03.2026 11:55:53
Izotova Liliya, я всю необходимую информацию предоставил. Архив присылать не буду. Что толку? Тут выкладывал архив с описанием проблемы: Вы не соизволили скачать и проверить. Даже не ответили. Будете вы исправлять ошибку в своём ПО или нет - мне всё равно.
Панель информации о позиции в стакане
Пользователь
Сообщений: Регистрация: 02.01.2026
27.03.2026 14:05:56
Цитата
Izotova Liliya написал: Для кода клиента 10910 попробуйте, пожалуйста, заново создать стакан котировок по инструменту SBER и проверить отображение позиции.
Я распаковал квик из архива quik_12.8.5_upd.zip в новую папку. Думаю, это больше, чем заново создать стакан.
Цитата
Izotova Liliya написал: Касательно 2 и 4 скриншота просьба подробно описать последовательность действий
Это один скриншот. Открыты одновременно четыре стакана. Логин: U0228637
Скрытый текст
Проверил на другом счёте. По ВТБ позиций вообще нет. Но в стакане показывает.
Панель информации о позиции в стакане
Пользователь
Сообщений: Регистрация: 02.01.2026
27.03.2026 11:19:41
Панель информации о позиции в стакане
Пользователь
Сообщений: Регистрация: 02.01.2026
27.03.2026 11:15:42
QUIK 12.8.5.3
Причина очень медленной загрузки QUIK
Пользователь
Сообщений: Регистрация: 02.01.2026
27.03.2026 09:41:46
Nikolay, я писал конкретно по вашей ситуации, где видны признаки проблем на локальном рабочем месте. Судя по вашему описанию терминал обрабатывал колбэк OnTrade две с половиной минуты. И, как показывает мой , даже, если новые данные поступили в терминал, он вам их не покажет, пока скрипты не обработают текущие данные.
Гарантируется ли вызов колбэка при получении Квиком новых данных?, Вопросы разработчикам QUIK
Пользователь
Сообщений: Регистрация: 02.01.2026
22.03.2026 15:35:36
Немного изменил тестовый скрипт:
Скрытый текст
Код
local function getTime(t)
if t == nil then t = os.sysdate() end
return string.format('%02u:%02u:%02u.%03u', t.hour, t.min, t.sec, t.ms)
end
local function info(s) PrintDbgStr(getTime() .. " " .. s) end
local start
function OnTransReply(trans_reply)
start = true
function OnTransReply(trans_reply)
info(getTime(trans_reply.date_time) .. " OnTransReply trans_id=" .. trans_reply.trans_id)
end
OnTransReply(trans_reply)
sleep(15000)
info("End OnTransReply")
end
function OnOrder(order)
info(getTime(order.datetime) .. " OnOrder trans_id=" .. order.trans_id)
end
function OnTrade(trade)
info(getTime(trade.datetime) .. " OnTrade trans_id=" .. trade.trans_id)
end
local run = true
function OnStop() run = nil end
function main()
local r = sendTransaction(transaction)
if r == '' then info("sendTransaction trans_id=" .. transaction.TRANS_ID) else info(r) end
while run and not start do sleep(0) end
local n = getNumberOf("orders")
local m = n
info(" orders: " .. n)
if run then
for TransID = 2, 5 do
transaction.TRANS_ID = ''..TransID
local r = sendTransaction(transaction)
if r == '' then info("sendTransaction trans_id=" .. transaction.TRANS_ID) else info(r) end
sleep(1000)
end
while run do
n = getNumberOf("orders")
if n > m then m = n; info(" orders: " .. n) end
sleep(0)
end
end
end
В Process Monitor видно 5 отправленных пакетов и 20 принятых, что соответствует 5 транзакциям и 20 колбэкам.
Скрытый текст
Т.ч., вопрос о наличии буфера на стороне клиента подтверждается. Причём видно, что сохраняется хронология событий: после каждой sendTransaction следует OnTransReply, а затем OnTrade и OnOrder.
Гарантируется ли вызов колбэка при получении Квиком новых данных?, Вопросы разработчикам QUIK
Пользователь
Сообщений: Регистрация: 02.01.2026
22.03.2026 14:00:39
Я понял: чтобы терминал показал нам данные, сначала он должен их расшифровать, но при отсутствии соединения с сервером, делать этого он не желает. Т.ч., эксперимент с отключением интернета не показателен.
Гарантируется ли вызов колбэка при получении Квиком новых данных?, Вопросы разработчикам QUIK
Пользователь
Сообщений: Регистрация: 02.01.2026
22.03.2026 12:09:01
Цитата
TGB написал: Поток, который мог бы их показать занят тем что генерит:
Так если в хронологическом порядке, то OnTrade и OnOrder были бы раньше, чем OnDisconnected
Цитата
TGB написал: буфер, и если, вдруг, он реализован на стороне сервера
Да нет никакого буфера на стороне сервера. Все заявки и сделки на сервере хранятся в БД SQL. И при подключении к серверу тот отдаёт клиенту все пропущенные данные по заявкам/сделкам за текущую торговую сессию. Возможно, даже не пропущенные, а все, в т.ч. и полученные раннее, а клиент на своей стороне уже смотрит, какие данные он показывал, а каких ещё не было, и вызывает соответствующий колбэк.
Гарантируется ли вызов колбэка при получении Квиком новых данных?, Вопросы разработчикам QUIK
Пользователь
Сообщений: Регистрация: 02.01.2026
22.03.2026 11:18:13
Цитата
TGB написал: А если предположить, что пока вы отключали интерне, данные уже оказались в буфере?
Так чё ж они не доступны после выхода из колбэка OnParam?
Цитата
TGB написал: Как вы думаете где могут "шляться" данные созданные 12:03:25.000 а выданные в коллбеке в 12:06:00.86?
С сервера получены после восстановления связи.
Гарантируется ли вызов колбэка при получении Квиком новых данных?, Вопросы разработчикам QUIK
Пользователь
Сообщений: Регистрация: 02.01.2026
21.03.2026 12:35:41
В коде выше опечатка. Должно быть так:
Скрытый текст
Код
function OnTrade(trade)
info(getTime(trade.datetime) .. " OnTrade trans_id=" .. trade.trans_id)
end
Гарантируется ли вызов колбэка при получении Квиком новых данных?, Вопросы разработчикам QUIK
Пользователь
Сообщений: Регистрация: 02.01.2026
21.03.2026 12:11:33
Цитата
Йцукен написал: А, вы про OnTransReply? Похоже, что вы правы. Поскольку сервер QUIK не делает повторной попытки направить ответ по транзакции, то можно предположить, что пока терминал обрабатывал колбэк OnParam, то данные с сервера таки получены и сохранены в память.
Похоже, предыдущий вывод преждевременный: если отключить интернет через несколько секунд после отправки транзакций, когда ответ по транзакциям уже должен прийти, то никаких новых данных в main не будет. Т.е., версия с буфером не подтверждается.
Скрытый текст
Код
local function getTime(t)
if t == nil then t = os.sysdate() end
return string.format('%02u:%02u:%02u.%03u', t.hour, t.min, t.sec, t.ms)
end
local function info(s) PrintDbgStr(getTime() .. " " .. s) end
function OnDisconnected() info("OnDisconnected") end
function OnConnected(flag) info("OnConnected " .. tostring(flag)) end
function OnTransReply(trans_reply)
info(getTime(trans_reply.date_time) .. " OnTransReply trans_id=" .. trans_reply.trans_id)
end
function OnOrder(order)
info(getTime(order.datetime) .. " OnOrder trans_id=" .. order.trans_id)
end
function OnTrade(trade)
info(getTime(trade.datetime) .. " OnOrder trans_id=" .. trade.trans_id)
end
function OnQuote() info("OnQuote") end
local start
function OnParam()
start = true
info("Start OnParam")
function OnParam() end
sleep(5000)
info("Disconnect") -- тут отключаем интернет
sleep(5000)
info("End OnParam")
end
local run = true
function OnStop() run = nil end
function main()
while run and not start do sleep(0) end
local n = getNumberOf("orders")
local m = n
info(" orders: " .. n)
if run then
for TransID = 1, 5 do
transaction.TRANS_ID = ''..TransID
local r = sendTransaction(transaction)
if r == '' then info("sendTransaction trans_id=" .. transaction.TRANS_ID) else info(r) end
end
while run do
n = getNumberOf("orders")
if n > m then m = n; info(" orders: " .. n) end
sleep(0)
end
end
end