Гарантируется ли вызов колбэка при получении Квиком новых данных?, Вопросы разработчикам QUIK
Пользователь
Сообщений: Регистрация: 02.01.2026
16.02.2026 14:26:33
В документе "Использование Lua в Рабочем месте QUIK.pdf" на стр. 5-8 приведено описание событийной модели, как одного из подходов написания скриптов Lua в Рабочем месте QUIK. На стр. 8 приведён пример скрипта NumberOfTradesOnCallbacks.lua
Вопросы: 1) Гарантирует ли данный подход, что все данные по сделкам, которые получит терминал с момента запуска скрипта, будут обработаны скриптом в колбэке OnTrade? 2) Может ли быть такое, что данные на рабочее место поступили, а колбэк не был вызван?
Пользователь
Сообщений: Регистрация: 30.01.2015
16.02.2026 16:08:49
Цитата
Йцукен написал: В документе "Использование Lua в Рабочем месте QUIK.pdf" на стр. 5-8 приведено описание событийной модели, как одного из подходов написания скриптов Lua в Рабочем месте QUIK. На стр. 8 приведён пример скрипта NumberOfTradesOnCallbacks.lua
Вопросы: 1) Гарантирует ли данный подход, что все данные по сделкам, которые получит терминал с момента запуска скрипта, будут обработаны скриптом в колбэке OnTrade? 2) Может ли быть такое, что данные на рабочее место поступили, а колбэк не был вызван?
1 да 2 нет
Пользователь
Сообщений: Регистрация: 30.01.2015
16.02.2026 16:09:46
Колбек вызывается перед записью в таблицу сделок ----------------------- Если колбек не вызван, то и записи в таблицу не будет
Пользователь
Сообщений: Регистрация: 22.02.2023
16.02.2026 18:07:40
Цитата
Йцукен написал: На стр. 8 приведён пример скрипта NumberOfTradesOnCallbacks.lua
Вы его запустить пробовали?
Цитата
D:\Work\Lua\DEV\Фуфло.lua:12: attempt to index a nil value (global 'table_of_trades')
Далеко не все примеры скриптов в документации работоспособны.
Всё пройдет. Но это не точно.
Пользователь
Сообщений: Регистрация: 27.01.2017
20.02.2026 15:10:12
Пока гарантированность не будет указана в документации, то все это спекуляции. Я, конечно, могу предположить, что если документация банально написана плохо, то многие моменты там не будут указаны. Но тогда, необходимо хотя бы подтверждение от поддержки.
Пользователь
Сообщений: Регистрация: 27.12.2022
21.02.2026 15:01:48
Я в 6:50:00 при начале приёма заявок, когда сервера перегружены, не раз наблюдал потери onTransReply.
Пользователь
Сообщений: Регистрация: 02.01.2026
21.02.2026 15:15:56
Цитата
Serge123 написал: Я в 6:50:00 при начале приёма заявок, когда сервера перегружены, не раз наблюдал потери onTransReply.
Вопрос поставлен так: 2) Может ли быть такое, что данные на рабочее место поступили, а колбэк не был вызван?
В вашем случае ответ на транзакцию QUIK получил, в таблице транзакций отображался?
Пользователь
Сообщений: Регистрация: 27.01.2017
21.02.2026 15:51:37
onTransReply все же не столь показателен, т.к. таблицы транзакций нет.
Пользователь
Сообщений: Регистрация: 02.01.2026
04.03.2026 15:07:33
Цитата
Nikolay написал: Но тогда, необходимо хотя бы подтверждение от поддержки.
Да чё-то они не отвечают.
QUIK clients support
Сообщений: Регистрация: 15.03.2022
05.03.2026 05:31:19
Добрый день,
Подтверждаем: при получении терминалом новой записи или обновления существующей гарантируется вызов соответствующей функции обратного вызова.
Подтверждаем: при получении терминалом новой записи или обновления существующей гарантируется вызов соответствующей функции обратного вызова.
главное, что написано в предыдкщем сообщении на индусском языке это
"при получении"
если вернуться к начальному сообщению этой ветки, то ответ вменяемого индивида, не отягощенного соусом карри, должен звучать так:
для данных, которые получены ДО запуска скрипта, никаких колбеков не будет. Для данных, которые получены ТЕРМИНАЛОМ ПОСЛЕ запуска скрипта и реалтайм связывания все колбеки гарантированно придут один за другим в порядке их прихода в терминал.
Если вернуться к начальному сообщению, там нет вопроса, что будет происходить "ДО запуска скрипта". Там были другие вопросы, на которые и был дан ответ.
А Вас мы просим сохранять культурный тон общения и не пытаться грубить другим участникам (в том числе специалистам поддержки QUIK) - в противном случае мы будем вынуждены заблокировать Вам доступ к этому форуму.
Если вернуться к начальному сообщению, там нет вопроса, что будет происходить "ДО запуска скрипта". Там были другие вопросы, на которые и был дан ответ.
А Вас мы просим сохранять культурный тон общения и не пытаться грубить другим участникам (в том числе специалистам поддержки QUIK) - в противном случае мы будем вынуждены заблокировать Вам доступ к этому форуму.
мне все равно.
ваш форум бесполезен.
вы ошибки не исправляете годами и даже десятилетиями.
зато обидчивость как у индийского слова во время гона.
Пользователь
Сообщений: Регистрация: 30.01.2015
06.03.2026 06:12:18
Цитата
tohoki написал: 1) Гарантирует ли данный подход, что все данные по сделкам, которые получит терминал с момента запуска скрипта, будут обработаны скриптом в колбэке OnTrade?
В вопросе темы спрашивается именно "с момента запуска скрипта". ------------------ Следовательно, ответ, данный разработчиками именно об этом. -------------------- Замечу, что ранее я дал более короткий ответ на вопрос темы. ----------------- Но автору нужно было подтверждение от разработчиков. Они его дали.
Пользователь
Сообщений: Регистрация: 12.05.2020
06.03.2026 11:01:04
Цитата
Anton Belonogov написал: Подтверждаем: при получении терминалом новой записи или обновления существующей гарантируется вызов соответствующей функции обратного вызова.
Здравствуйте. Есть скорость v1 (количество/сек.) появления событий, по которым должны запускаться коллбеки. И есть скорость выполнения коллбеков v2 (количество/сек.) в скриптах пользователя. Пока v1 <= v2 можно как то, наверное, гарантировать. Но скоростью v2 QUIK не управляет. Например, пользователь в тексте коллбека, по недоразумению, написал строку: sleep(3000) и на 3 сек. все коллбеки, во всех выполняемых скриптах перестали обрабатываться. Или выполняет долгую обработку в коллбеке. Единственное, что можно бы было гарантировать в этих условиях - это выдачу сообщения о ситуации, когда v1 > v2. Но я таких сообщений никогда не видел (даже в экспериментах). Или я что то не понимаю?
Пользователь
Сообщений: Регистрация: 20.03.2023
11.03.2026 18:30:19
Так коллбеки в том же потоке, что и прием данных и запись в таблицы. То есть поставили вы в коллбеке sleep и данные не принимаются, новых событий нет.
Пользователь
Сообщений: Регистрация: 12.05.2020
11.03.2026 18:54:24
Цитата
paluke написал: То есть поставили вы в коллбеке sleep и данные не принимаются, новых событий нет.
И торги на бирже остановлены ?
Цитата
paluke написал: Так коллбеки в том же потоке, что и прием данных
написал: Так коллбеки в том же потоке, что и прием данных
Вы это проверяли?
Пока скрипт обрабатывает колбэк, он или другие скрипты могут отправлять транзакции на сервер из 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 OnTransReply(trans_reply)
info(getTime(trans_reply.date_time) .. " OnTransReply")
end
function OnOrder(order)
info(getTime(order.datetime) .. " OnOrder trans_id=" .. order.trans_id)
end
local start
function OnParam()
start = true
function OnParam() end
info("Start OnParam")
sleep(3000)
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
if sendTransaction(transaction) == '' then info("sendTransaction trans_id=" .. transaction.TRANS_ID) end
end
while run do
n = getNumberOf("orders")
if n > m then m = n; info(" orders: " .. n) end
sleep(0)
end
end
end
Видно, что транзакции отправлены в 18:41:29, и в туже секунду выставлены заявки (вторая колонка со временем). Но информация по заявкам и транзакциям обработана спустя 3 сек (первая колонка со временем)
В выложенном коде отсутствует таблица transaction (шаблон заявки). Результат вашего теста показывает, что все коллбеки обрабатываются в одном потоке и когда он блокируется (в OnParam на 3000 млс.), все коллбеки перестают обрабатываться, но данные в QUIK при этом приходят (это видно в потоке main). Понятно, что для того, чтобы события коллбеков при этом не терялись, в QUIK должна быть внутренняя служебная(ые) очередь. Эта очередь может гарантировать отсутствие потерь событий только при
Йцукен написал: А я вижу, что новые данные в main доступны только после выхода из OnParam. Когда эти данные пришли - не вижу.
Да в main их не видно, но я имею ввиду QUIK. Если вы сделаете задержку в OnParam 10000, то это не значит, что биржа будет ждать перед отсылкой данных о выставлении заявки 10 сек. пока один из 100000 терминалов QUIK не разблокирует свой поток обработки коллбеков.
Пользователь
Сообщений: Регистрация: 27.01.2017
21.03.2026 10:15:04
Цитата
TGB написал: для того, чтобы события коллбеков при этом не терялись, в QUIK должна быть внутренняя служебная(ые) очередь. Эта очередь может гарантировать отсутствие потерь событий только при
Цитата
написал: v1 <= v2
Не только очередь, а еще ack флаги. Сама очередь ничего не гарантирует.
Пользователь
Сообщений: Регистрация: 12.05.2020
21.03.2026 10:29:07
Цитата
Nikolay написал: Не только очередь, а еще ack флаги. Сама очередь ничего не гарантирует.
В данном случае я не пишу как должна быть устроена очередь (об этом я пишу в другой ветке). Я написал, что очередь требуется чтобы не терять события коллбеков при v1 <= v2.
Пользователь
Сообщений: Регистрация: 02.01.2026
21.03.2026 10:57:42
Цитата
TGB написал: Да в main их не видно, но я имею ввиду QUIK. Если вы сделаете задержку в OnParam 10000, то это не значит, что биржа будет ждать перед отсылкой данных о выставлении заявки 10 сек. пока один из 100000 терминалов QUIK не разблокирует свой поток обработки коллбеков.
А, вы про OnTransReply? Похоже, что вы правы. Поскольку сервер QUIK не делает повторной попытки направить ответ по транзакции, то можно предположить, что пока терминал обрабатывал колбэк OnParam, то данные с сервера таки получены и сохранены в память.
Да в main их не видно, но я имею ввиду QUIK. Если вы сделаете задержку в OnParam 10000, то это не значит, что биржа будет ждать перед отсылкой данных о выставлении заявки 10 сек. пока один из 100000 терминалов QUIK не разблокирует свой поток обработки коллбеков
На самом деле все совершенно не так. Даже если терминал заблокирует свой поток, ПК не перестанет принимать пакеты от сервера QUIK в буфер. А данные с биржи вообще не доходят напрямую до терминала QUIK. Сервер биржи вообще не видит эти терминалы, пусть все 10000 заблокируют свои потоки, серверу биржи все это по ... колено. ------------------ Сервер биржи передает все на сервер брокера. Лишь если терминал QUIK будет на выделенном сервере в дата центре, то возможно в этом случае он будет принимать что-то прямо с сервера биржи да и то через специальный терминал фактически сервер брокера. =============== Таким образом, сервер биржи видит лишь сервера брокеров и передает им всю информацию. Сервер брокера либо ее обрабатывает либо нет и передает ее на ПК клиентов. OC на ПК принимает эту информацию в буфер и раздает по портам приложений. Если приложение спит и не просыпается то буфер будет накапливать и ждать. Если буфер полон, то ОС должна остановить передачу с сервера брокера и тот будет накапливать и потом по запросу передаст все на ПК клиента.
Пользователь
Сообщений: Регистрация: 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