nikolz написал: На объем и время при старте влияет повторный расчет индикаторов на Lua, циклический расчет индикаторов (возможно и графиков) для каждой свечи при старте и размер сохраненной истории, по которым считаются эти индикаторы.
Но как вы догадались, Холмс? Расчёт индикатора при старте не должен сильно отличаться от расчёта при его добавлении на график. При добавлении даже три раза пересчитывается, а при старте терминала - "только" два раза. Но если в индикаторе используется getCandlesByIndex, то есть свои нюансы в расчётах. Чтобы оценить влияние Lua-индикаторов, можно переименовать папку LuaIndicators, и сравнить время загрузки с индикаторами и без.
Гарантируется ли вызов колбэка при получении Квиком новых данных?, Вопросы разработчикам QUIK
Пользователь
Сообщений: Регистрация: 02.01.2026
16.02.2026 14:26:33
В документе "Использование Lua в Рабочем месте QUIK.pdf" на стр. 5-8 приведено описание событийной модели, как одного из подходов написания скриптов Lua в Рабочем месте QUIK. На стр. 8 приведён пример скрипта NumberOfTradesOnCallbacks.lua
Вопросы: 1) Гарантирует ли данный подход, что все данные по сделкам, которые получит терминал с момента запуска скрипта, будут обработаны скриптом в колбэке OnTrade? 2) Может ли быть такое, что данные на рабочее место поступили, а колбэк не был вызван?
getDepoEx в OnInit вешает терминал
Пользователь
Сообщений: Регистрация: 02.01.2026
16.02.2026 13:44:08
Цитата
Oleg Kuzembaev написал: Рабочее место никак не реагирует на нажатия?
Вы точно попытались? В рабочем месте, архив которого я выложил, открыто всего два окна: график и "Доступные скрипты". Данные в каких таблицах, по вашему, должны обновляться?
Не приходит полная версия OnTrade
Пользователь
Сообщений: Регистрация: 02.01.2026
16.02.2026 13:11:00
Цитата
Nikolay написал: Вы в документации видите утверждение о гарантированности доставки, вызова. А если нет, то значит это не ошибка, а особенность. В документации к RabbitMQ гарантируют доставку, а здесь нет.
Я не об этом спросил. Вы утверждаете
Цитата
Nikolay написал: Банально не был вызван, а в таблице данные корректны. В текущих версиях это очень редко, а ранее было не так и редко.
Я и спросил были ли сообщения от пользователей об этих случаях, когда данные есть, а колбэка не было?
Не приходит полная версия OnTrade
Пользователь
Сообщений: Регистрация: 02.01.2026
16.02.2026 12:26:26
Цитата
Nikolay написал: Банально не был вызван, а в таблице данные корректны. В текущих версиях это очень редко, а ранее было не так и редко.
Чёт я такого не припоминаю, можно ссылку на обсуждение данной проблемы?
Не приходит полная версия OnTrade
Пользователь
Сообщений: Регистрация: 02.01.2026
16.02.2026 12:10:26
Цитата
VPM написал: Если колбэк потерян, система обнаружит это при следующем опросе и скорректирует состояние.
Цитата
Nikolay написал: ориентируемся на колбек. Если он не пришел, каким-то образом, скорее всего с некой периодичностью читаем данные и сверяем.
Я всё никак не пойму, о потерях каких колбэков речь? Если колбэк не получен, то и в таблицах не будет информации, что вы там собираетесь сверять?
getDepoEx в OnInit вешает терминал
Пользователь
Сообщений: Регистрация: 02.01.2026
16.02.2026 11:52:51
Oleg Kuzembaev, я привёл минимальный код, который гарантированно приводит к зависанию в описанной мной ситуации. По ссылке в первом сообщении есть архив рабочего места, на котором это можно проверить.
getDepoEx в OnInit вешает терминал
Пользователь
Сообщений: Регистрация: 02.01.2026
15.02.2026 22:27:20
Вот такой код вешает QUIK 12.8.3.4 при открытом графике SBER с включенной настройкой показывать уровень позиции.
Код
function OnInit()
getDepoEx("NC0011100000", "10547", "SBER", "NL0011100043", 20260216)
end
на архив рабочего места. Зависает в т.ч. без подключения к серверу. При запуске скрипта после подключения - может зависнуть, а может и не зависнуть
Не приходит полная версия OnTrade
Пользователь
Сообщений: Регистрация: 02.01.2026
15.02.2026 20:07:53
Цитата
TGB написал: Вы проверяли задержку между коллбэком с заполненными параметрами и появлением записи в таблице? Если нет, то проверьте.
Это ваш выбор. Но я написал о другом. Ваш подход также не исключает получения "сырых", как вы выразились, колбэков по заявкам / сделкам. Просто вы получаете их гораздо реже в силу того, что, как правило, колбэки с заполненными параметрами идут сразу следом за частично заполненными. Часто в ту же миллисекунду. Поэтому в таблице вы уже видите все параметры. Но это не исключает вероятности получения "сырых" данных, о чём вы и написали в этой теме: Ваш подход мне понятен, и он имеет свои плюсы. Но что на счёт рыночных данных по инструментам? Колбэки OnParam и OnQuote сообщают, когда произошло изменение. Как вы определяете эти изменения?
Не приходит полная версия OnTrade
Пользователь
Сообщений: Регистрация: 02.01.2026
15.02.2026 12:39:12
Цитата
TGB написал: Зачем вы отрабатываете "сырые" коллбеки OnTrade?
Но вы так-то тоже "сырые" колбэки и получаете соответствующие проблемы, которые потом закрываете "костылями".
Не приходит полная версия OnTrade
Пользователь
Сообщений: Регистрация: 02.01.2026
15.02.2026 08:58:46
Цитата
User12501 написал: Но возможно именно у тех сделок, о которых речь, не было. Не проверял, в следующий раз как случится - посмотрю.
Вот с этого и надо было начинать. Какой ACTION указан у транзакции, сделки по которым без trans_id?
Если бы я был архитектором QUIK, Что стоило бы изменить в QUIK по-крупному
Пользователь
Сообщений: Регистрация: 02.01.2026
14.02.2026 13:27:05
Цитата
TGB написал: В существующей версии QUIK выполнение коллбека блокируется до тех пор пока в потоке main не выполнится sleep или сишная функция. Выше написанное означает полную зависимость служебного потока от пользовательского. Зачем это сделано в QUIKe?
Блокируется на время выполнения байт-кода. Не представляю, какой код нужно написать без вызова сишных функций, выполняющийся длительное время, чтобы это можно было заметить.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 02.01.2026
12.02.2026 23:01:43
Цитата
VPM написал: А Не смущает то что мы ее задаем и вынуждены контролировать?
Для чего?
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 02.01.2026
12.02.2026 17:34:20
Nikolay, а для чего вам знать размер очереди? Вы же не извлекаете из середины? Если организуется FIFO, то берётся первый элемент из очереди до тех пор, пока там что-то есть.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Да, но потокобезопасность - это гарантия, а не вероятность.
Я говорю, что сомнительно, что то, о чём вы пишите, вообще может произойти в Lua 5.4. Потому что там байт-код, который по определению выполняется под блокировкой.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 02.01.2026
12.02.2026 16:15:32
Цитата
Nikolay написал: в момент получения размера, другой поток изменит last или first
Не факт
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 02.01.2026
12.02.2026 15:56:33
Цитата
Nikolay написал: Потому что в момент получения размера, другой поток изменит last или first
При обращении к элементу с индексом, равным размеру очереди вы не получите nil в любом случае. В этом смысле работа с очередью потокобезопасна, если запись только - в одном потоке, а извлечение - в другом. Но, если вы одновременно добавляете элементы в разных потоках или извлекаете в разных потоках, то да, нужно код оборачивать в ssort, например.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 02.01.2026
12.02.2026 15:50:01
Цитата
VPM написал: ---- lifo из двусвязной очереди и пример позволят вести себя как стек - обеспечивая LIFO-порядок
Можно гораздо проще:
Код
local LIFO = {}
LIFO.__index = LIFO
function LIFO.new()
return setmetatable({}, LIFO)
end
function LIFO:push(v)
self[#self+1] = v
end
function LIFO:pop()
local idx = #self
if idx == 0 then return nil end
local v = self[idx]
self[idx] = nil
return v
end
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 02.01.2026
12.02.2026 15:09:23
Цитата
Nikolay написал: размер уже можно получить кривой.
Почему?
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 02.01.2026
12.02.2026 14:15:24
Цитата
Nikolay написал: И как она стала потокобезопасной в Lua, где этого нет.
Добавление элемента в начало очереди в одном потоке не приводит к тому, что при попытке в другом потоке извлечь последний элемент возвращается nil.
Цитата
Nikolay написал: Когда я говорил о двойной очереди, я говорил именно о двух очередях.
А можно ссылку на это обсуждение?
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 02.01.2026
12.02.2026 10:35:27
Цитата
VPM написал: -- Создание LIFO из двусвязанной очереди
table.insert / table.remove делают то же самое, только быстрее.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 02.01.2026
12.02.2026 10:11:30
Цитата
VPM написал: это же просто двойная очередь, с которой я разбирался и только ленивый меня "по столу носом не возил". Более медленный вариант, чем скажем кольцевой буфер?
А что сравнивать, если они для разных задач предназначены? Кольцевой буфер - для хранения ограниченного количества элементов. Индексация всё время сдвигается вправо. Возможно удаление и изменение элементов с любым индексом. Очередь из сообщения аналог обычной таблицы с индексацией, начиная с 1. Используется, когда надо удалять элементы в начале таблицы, т.к. table.insert с этой задачей плохо справляется.
Приколы терминала QUIK
Пользователь
Сообщений: Регистрация: 02.01.2026
11.02.2026 13:05:05
Цитата
nikolz написал: получаю большую загрузку процессора (на 8.7 такого не было) ----------------------- Тогда я удаляю свой скрипт Загрузка процессора возвращается в норму
Без обид, но вы просто не умеете программировать
свободные средства для срочного рынка на едином счете
Пользователь
Сообщений: Регистрация: 02.01.2026
11.02.2026 12:53:37
У некоторых брокеров на срочной секции комиссия = комиссии биржи. Т.е., если биржевая комиссия = 0, то и брокерская = 0. Но, если вы делаете тейкерские сделки по инструментам, где комиссия больше рубля, то очень дорого выходит.
Новый период и время проведения торгов на бирже.
Пользователь
Сообщений: Регистрация: 02.01.2026
11.02.2026 10:42:40
Какой параметр на срочной секции показывает время аукциона (8:59) и начала торгов (9:00)? STARTTIME выдаёт: "100000.000000" ("10:00:00")
Не приходит полная версия OnTrade
Пользователь
Сообщений: Регистрация: 02.01.2026
09.02.2026 20:57:14
User12501, по каким классам инструментов наблюдается? В самой таблице сделок trans_id есть?
onstop и колбек пользовательского окна
Пользователь
Сообщений: Регистрация: 02.01.2026
08.02.2026 08:52:00
Цитата
tohoki написал: поменять местами во времени реакцию на колбеки qtable_close и onstop, чтобы они обрабатывались в нормальном порядке. Именно в том, как они реально возникли.
Первым должен быть OnClose, а после - QTABLE_CLOSE.
onstop и колбек пользовательского окна
Пользователь
Сообщений: Регистрация: 02.01.2026
07.02.2026 14:49:27
Цитата
tohoki написал: и при закрытии скрипта и при закрытии терминала мы увидим в debugview только QTABLE_CLOSE и не увидим ONSTOP
Значит main завершился раньше. Надо ставить таймаут в конце main с ожиданием сигнала из OnClose / OnStop. Если по завершении этого времени сигнал не получен, считать, что таблица закрыта пользователем.
Цитата
tohoki написал: такая архитектура приводит к тому, .что нормальное человеческое событийное программирование придется разбавлять невнятным винегретом из каких то переменных и непонятных таймаутов с потолка.
написал: при закрытии скрипта и при закрытии терминала мы увидим в debugview только QTABLE_CLOSE и не увидим ONSTOP.
Всё с точностью до наоборот.
Может такое произойти, что скрипт остановится раньше, чем будет получен колбэк OnStop / OnClose (когда терминал долго закрывается, например).
Может ли уменьшиться количество свечей на графике в течение дня?
Пользователь
Сообщений: Регистрация: 02.01.2026
05.02.2026 19:06:46
Сегодня в 10:12 на минутном графике Сбербанка (TQBR) CreateDataSource показала 66725 свечей. После я перезагрузил QUIK (12.8.3), а когда подключился к тому же серверу, то свечей стало меньше - 65776 (в 10:59). Через час, в 11:59 - 65836 свечей.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 02.01.2026
04.02.2026 18:10:47
А, разобрался: функция Squeeze возвращает индекс в массиве "по кольцу" в пределах заданного периода.
При запусках коллбеков не восстанавливается состояние скрипта по сборке мусора (QUIK 12.2.1.2)
Пользователь
Сообщений: Регистрация: 02.01.2026
04.02.2026 15:06:07
Цитата
TGB написал: могут быть участки скрипта критичные по времени выполнения, на которых они имеют возможность отключать, но потом восстанавливать сборку мусора.
Можете привести пример кода, где отключение сборщика мусора увеличит его выполнение? А то у меня наблюдается ровно обратная ситуация.
При запусках коллбеков не восстанавливается состояние скрипта по сборке мусора (QUIK 12.2.1.2)
Пользователь
Сообщений: Регистрация: 02.01.2026
03.02.2026 17:14:48
Цитата
TGB написал: Разработчик скрипта может в какой-то момент отключить на какое то время уборку мусора
Можно. А зачем?
Лишние вызовы OnAllTrade
Пользователь
Сообщений: Регистрация: 02.01.2026
02.02.2026 18:50:57
Часть сделок прилетает повторно. Воспроизводится не всегда. Но, если в окне, где перезаказывали обезличенные сделки, нажать кнопку "Сохранить", то вероятность повторного получения сделок выше.
Лишние вызовы OnAllTrade
Пользователь
Сообщений: Регистрация: 02.01.2026
02.02.2026 17:20:47
При перезаказе обезличенных сделок суммарное количество вызовов OnAllTrade больше, чем есть сделок на самом деле. QUIK-Junior 12.8.3 и 12.5.0
Код
local run = false
function OnStop()
run = nil
end
local a = 0
function OnAllTrade(alltrade)
if run ~= true then return end
a = a + 1
end
function main()
local n, m
while run ~= nil and 0 < getNumberOf("all_trades") do -- ожидание перезаказа обезличенных сделок
n = getNumberOf("all_trades")
sleep(1)
end
if run ~= nil then
run = true
message("start: " .. a)
repeat
sleep(1)
m = getNumberOf("all_trades")
until not run or n <= m
run = false
message("getNumberOf: " .. m .. "\nOnAllTrade: " .. a)
end
end
Результат:
Цитата
getNumberOf: 194038 OnAllTrade: 239930
В таблице обезличенных сделок количество совпадает с тем, что показывает getNumberOf.
Вообще-то есть. Но куда она выводит текст - не понятно.
Проблема с нажатием правой кнопки
Пользователь
Сообщений: Регистрация: 02.01.2026
31.01.2026 22:23:04
Цитата
Anton Belonogov написал: Мы можем зарегистрировать пожелание на доработку ПО для добавления такой возможности в будущих версиях.
А толку?
Задавать списки классов и кодов инструментов, для которых будут вызываться колбэки OnAllTrade, OnParam, OnQuote в Lua-скрипте
Пользователь
Сообщений: Регистрация: 02.01.2026
31.01.2026 18:02:49
В Lua сделать возможным задавать списки классов и кодов инструментов, для которых будут вызываться колбэки OnAllTrade, OnParam, OnQuote в Lua-скрипте.
Пояснение: Сейчас, если в Lua-скрипте, заданы функции обратного вызова, в частности OnAllTrade, OnParam, OnQuote, то они будут вызываться для всех инструментов, данные по которым поступают в терминал, что влечёт высокий оверхэд на вызов этих самых колбэков. Под вызовом колбэков понимается именно их вызов терминалом. Не путать с исполнением Lua-кода пользовательской функции.
Проблемная работа программы с луа роботами, Проблемная работа программы с луа роботами
Пользователь
Сообщений: Регистрация: 02.01.2026
31.01.2026 17:34:27
Цитата
nikolz написал: измеряете время от входа в колбек до входа в функцию main.
Ясно, к вам вопросов больше нет. Очевидно (но, видимо, не всем), что таким образом не возможно измерить время, затрачиваемое на вызов колбэка. Не путать со временем исполнения кода пользовательской функции колбэка.
Проблемная работа программы с луа роботами, Проблемная работа программы с луа роботами
Проблемная работа программы с луа роботами, Проблемная работа программы с луа роботами
Пользователь
Сообщений: Регистрация: 02.01.2026
31.01.2026 14:07:33
Цитата
nikolz написал: На него затрачивается не более 5 мкс.
Интересно, как вы это измерили?
При запусках коллбеков не восстанавливается состояние скрипта по сборке мусора (QUIK 12.2.1.2)
Пользователь
Сообщений: Регистрация: 02.01.2026
31.01.2026 10:46:56
Нужно ли при завершении скрипта принудительно вызывать collectgarbage()?
Проблемная работа программы с луа роботами, Проблемная работа программы с луа роботами
Пользователь
Сообщений: Регистрация: 02.01.2026
30.01.2026 19:26:49
Оверхед от вызова колбэков высокий, независимо от кода внутри колбэка. Я вот думаю отказаться от OnAllTrade совсем. Да и от OnParam стоило бы отказаться, поскольку при включении "умного" заказа данных, терминал тянет данные почти по всем классам. Но в этом случае придётся постоянно в main опрашивать на наличие новых данных по инструментам, что отрицательно скажется на производительности.