Обновился до QUIK версии 8.7.0.6 и появилась следующая проблема: В таблицах, создаваемых Lua скриптом, теперь при клике правой кнопкой в каждой ячейке появляется контекстное меню с настройками сортировки. В итоге коллбэк, который в скрипте навешивается на событие QTABLE_RBUTTONDBLCLK, не работает. У меня этот эвент активно используется, и я не могу его ничем заменить. Как разрешить эту ситуацию ?
Планируется ли ввести поддержку нескольких мониторов в QUIK. Хотелось бы одновременно видеть содержимое одной вкладки на первом мониторе, и второй вкладки - на втором мониторе.
Скрипт на Lua, Обычный обход item'ов таблицы "depo_limits".
Код
local items_num = getNumberOf("depo_limits")
for i = 0, items_num - 1 do
local table_item = getItem("depo_limits", i)
--дальнейшие действия с table_item
end
Цикл работает чрезвычайно медленно, что приводит к тормозам моего скрипта. Всего кол-во строк в таблице (items_num) чуть более ста. Трассировка говорит, что вызов getItem занимает 0,015 с. Можно посчитать, что каждый такой цикл занимает 1,5с.
Проявляется на новых версиях QUIK'а. Последняя версия QUIK где работает нормально - 7.19.3.1.
В связи с этим больше не обновляю QUIK.
Данный код просто лишь загружает в мою таблицу баланс по инструменту. Кол-во отслеживаемых инструментов более сотни, можете посчитать, сколько у меня занимает инциализация таблицы (1,5с x 100 = 150сек это в лучшем случае).
SearchItems работает аналогично для этой таблицы. Остальные таблицы кажется отрабатывают корректно, но проверял не все.
Начиная с версии 7.16, поле Позиция в доске опционов иногда показывает неправильное значение. Какой-то конкретной закономерности не заметил, но что-то точно не так. В версиях 7.14 и ранее это поле всегда показывало корректное значение.
Есть проблема, с которой борюсь довольно давно, но к сожалению, так ее и не удалось решить, и похоже все дело именно в связке QUIK-QLua-Lua. Я написал скрипт на Lua, который периодически записывает данные о параметрах опционов (волатильность и т.д.) в БД, чтобы в дальнейшем использовать данную информацию для сложных запросов. Для записи в БД пробовал пользоваться несколькими сторонними библиотеками: LuaSQL (https://keplerproject.github.io/luasql/) и LuaSQLite3 (http://lua.sqlite.org/index.cgi/index). При этом в случае LuaSQL пробовал реализацию для sqlite и mysql. Сами библиотеки прикрутить к QUIK'у удалось, хотя это непросто. Но итоговый результат к сожалению печальный: скрипт работает определенное время, делает записи в БД, как надо, но потом QUIK просто падает (без дампа, без всего). Если записи в БД делать два раза в секунду, то падает через несколько минут. Если писать раз в минуту (как изначально мной предполагалось), то падает через полчаса, а может через пару часов. Мне нужна стабильная работа в течение всего дня. За одну итерацию пишу около сотен строк в БД, что полная ерунда для современных мощностей. Смотрел на использование ЦП QUIK'ом во время работы скрипта - все нормально. Пробовал запись как из потока main, так и из функций обратного вызова - результат один и тот же. То, что один и тот же результат воспроизводится для различных библиотек и различных СУБД, говорит о том, что дело не в них, а в QUIK'е или QLua. Если записывать все нужные данные просто в файл csv, а не в БД, то все стабильно работает. По опыту могу сказать, что падение может быть вызвано ошибкой при одновременном доступе к одному участку памяти в QUIK'е или запил памяти, но так как у меня нет исходного кода ни qlua.dll, ни quik.exe, то я не могу ничего сказать и сделать. Неужели моя задача никак не решается с использованием QUIK? Хотелось бы получить ответ от разработчиков. Я могу дать код скрипта, если нужно. Пробовал на версиях QUIK 7.14 и 7.16.
Многократные вызовы SearchItems для поиска нужного инструмента в таблице лимитов по бумагам приводят к утечкам памяти, которые не может устранить сборщик мусора Lua.
Следующий метод возвращает баланс по заданному инструменту и коду клиента:
Код
function TradeItem:get_balance()
local res = 0
if self.bal_func == nil then
self.bal_func = function(t) return t.limit_kind == 2 and t.client_code == self.clientcode and t.sec_code == self.seccode end
end
local sec_table = SearchItems("depo_limits", 0, getNumberOf("depo_limits") - 1, self.bal_func)
if sec_table and #sec_table > 0 then
local table_item = getItem("depo_limits", sec_table[1])
if table_item then
res = table_item.currentbal
end
end
return res
end
Вызывается этот метод часто (несколько раз в секунду) и приводит к серьезным утечкам памяти (объем используемой памяти проверяю через функцию collectgarbage("count")). За день работы набирается больше 2 Гб.
Если я буду искать нужный инструмент просто прямым перебором всех строк в таблице, то все нормально.
Могут ли разработчики взглянуть на данную проблему? Версия QUIK 7.5.0.72, Lua версии 5.1.
Как известно, информацию о котировках в стакане можно получить с помощью функции getQuoteLevel2. Но она возвращает только цены и количество заявок. В интерфейсе же QUIK, если в таблицу котировок добавить столбец "Доходность", доступна также информация о доходности облигации, вычисленной для каждой котировки в стакане. Как мне программно ее получить? По сути нужна функция getYield(price), возвращающая для конкретной облигации доходность по цене заявки.