Новая версия терминала 8.13 для отладки должна была появиться в этой папке:
но там на момент написания этого сообщения пусто. Не повезло 13-й версии, к сожалению.
Разработчики, пожалуйста, выложите файл, ссылку на который вы прислали по почте:
Отладка QUIK 8.12
Пользователь
Сообщений: Регистрация: 31.01.2015
26.01.2021 17:54:21
Новая версия терминала 8.12 для отладки:
Поправили SEH-исключения, сохранение настроек и др.
Изменить версию Lua с 5.4.1 до 5.4.2
Пользователь
Сообщений: Регистрация: 31.01.2015
07.01.2021 08:13:21
Этот тест воспроизводит ошибку? Если да, то разработчикам, всё-таки, стоит зарегистрировать пожелание.
Утечка памяти, Происходит утечка памяти
Пользователь
Сообщений: Регистрация: 31.01.2015
07.01.2021 08:11:56
Это не утечка. Это Lua не делает уборку мусора, пока его не накопится "достаточно" для того, чтобы уборка имела смысл. Если постоянно дёргать сборщик мусора, то это будет замедлять исполнение программы. Возможно, что Lua имеет свои "представления" о том, когда надо запускать сборку мусора, и они не совпадают с Вашими. Можете, как уже советовали, запускать сборку мусора самостоятельно в подходящие на Ваш взгляд моменты.
Получение данных из таблицы текущих торгов
Пользователь
Сообщений: Регистрация: 31.01.2015
07.01.2021 08:07:40
Правильный вопрос. Можно попробовать вот такую конструкцию, где используется синхронизация через table.ssort (см. документацию для прояснения деталей; в потоке коллбэков эта конструкция не нужна, а в потоке main нужна):
Код
local paramTable = {}
table.ssort({ 0, 1 }, function(a, b)
-- Тут делаем нужные операции, которые, по идее, должны быть выполнены атомарно
paramTable["bid"] = GetParamEx(аргументы для получения bid).param_value
paramTable["offer"] = GetParamEx(аргументы для получения offer).param_value
-- Далее аналогично
return true
end)
Но вопрос к разработчикам терминала такой: этим мы достигнем требуемого (см. первое сообщение темы)?
Как установить поддержку сокетов в скриптах QUIK ?
Пользователь
Сообщений: Регистрация: 31.01.2015
23.12.2020 06:50:16
Проверил socket core.dll, вроде работает. Спасибо большое!
Изменить версию Lua с 5.4.1 до 5.4.2
Пользователь
Сообщений: Регистрация: 31.01.2015
22.12.2020 14:47:25
Заходит пациент в кабинет к доктору. -- На что жалуетесь? -- Доктор, меня все игнорируют. -- Следующий.
Как установить поддержку сокетов в скриптах QUIK ?
Пользователь
Сообщений: Регистрация: 31.01.2015
22.12.2020 14:45:06
Кто-нибудь из знающих товарищей может либо подсказать, как это делается, либо просто скомпилировать и выложить на форум socket core.dll для Quik 8.11 и Lua 5.4.1?
Изменить версию Lua с 5.4.1 до 5.4.2
Пользователь
Сообщений: Регистрация: 31.01.2015
17.12.2020 19:18:12
Поскольку известно, что в Lua 5.4.1 есть неприятный баг
исправленный в Lua 5.4.2, имеет смысл поднять версию внутри QUIK.
Отладка QUIK 8.11
Пользователь
Сообщений: Регистрация: 31.01.2015
14.12.2020 17:38:12
Цитата
Андрей написал: а релиз 8.10 где???)))) или его только ВТБ брокер получил и распространял.
Уже не важно.
Отладка QUIK 8.11
Пользователь
Сообщений: Регистрация: 31.01.2015
14.12.2020 17:37:48
Не скажите, много кто помогает.
Как установить поддержку сокетов в скриптах QUIK ?
Пользователь
Сообщений: Регистрация: 31.01.2015
14.12.2020 17:36:57
В связи с выходом QUIK 8.11 становится актуальным файл core.dll для socket для Lua 5.4.1.
Также mime.dll и ssl.dll надо искать, но уже для других целей.
Отладка QUIK 8.11
Пользователь
Сообщений: Регистрация: 31.01.2015
14.12.2020 17:08:36
В частности, появилась Lua 5.4.1, исправлены ошибки, на которые Anton указывал, и прочее. Кто может -- потестируйте.
Полный список внутри архива в папке UpdateDocs.
Отладка QUIK 8.11
Пользователь
Сообщений: Регистрация: 31.01.2015
14.12.2020 16:54:43
Новая версия терминала QUIK 8.11 для отладки.
Изменений очень много.
Отладка QUIK 8.9
Пользователь
Сообщений: Регистрация: 31.01.2015
02.12.2020 17:31:31
Просто напоминаю, что аварийные падения терминала продолжаются, а на отосланные дампы приходит ответ разработчиков:
Цитата
К сожалению, нам не удалось точно установить причину возникшей ошибки. Однако, в ближайшей версии мы изменим работу с коллбэками Lua. Ожидаем, что изменения исключат возникающую ошибку.
Приносим извинения за причинённые неудобства.
При этом новой версии уже давно нет. Как-то плохо это выглядит со стороны пользователей.
LuaFileSystem
Пользователь
Сообщений: Регистрация: 31.01.2015
27.11.2020 20:51:57
Благодарю, очень помогли.
LuaFileSystem
Пользователь
Сообщений: Регистрация: 31.01.2015
27.11.2020 19:10:13
Добрый день всем!
Пытаюсь подключить LuaFileSystem (lfs), чтобы это заработало в QUIK 8 с Lua 5.3.
Код
local lfs = require("lfs")
Нужен файл lfs.dll. Если есть у кого, поделитесь, пожалуйста.
Спасибо.
Как установить поддержку сокетов в скриптах QUIK ?
Пользователь
Сообщений: Регистрация: 31.01.2015
19.11.2020 06:21:26
Я у себя сделал так:
1) создал в папке терминала подпапку socket и положил туда файл core.dll, который взял отсюда:
2) в папке с lua-скриптами создал папку lib, куда положил файл socket.lua, который взял отсюда:
(в этой же папке ещё и другие файлы библиотек лежат)
3) в скриптах пишу
Код
local socket = require("lib.socket")
Возможно, есть какие-то другие способы.
Отладка QUIK 8.9
Пользователь
Сообщений: Регистрация: 31.01.2015
19.11.2020 06:12:26
Хорошо, как будут аварийные завершения, так буду отправлять вам дампы. Хочется уже стабильности, в конце-концов.
Отладка QUIK 8.9
Пользователь
Сообщений: Регистрация: 31.01.2015
18.11.2020 14:33:08
В общем-то, терминал 8.9.0.107 по-прежнему падает во время торгов с дампами.
Расширить список функций обратного вызова
Пользователь
Сообщений: Регистрация: 31.01.2015
18.11.2020 13:36:02
Идея прикольная :) Осталось окно скрипта куда-нибудь спрятать и будет "зачётный костыль".
Терминал является уже достаточно сложной системой, чтобы в нём были такого рода "дыры", которыми можно пользоваться в благих целях.
Ладно, а разработчики могут нам что-то человеческое предоставить?
P.S. Вот было бы здорово создать реестр подобного рода маленьких хитростей. А то я, кажется, только
Код
table.ssort({ 0, 1 }, function(a, b)
Ваш код здесь
return true
end)
для синхронизации знаю.
Расширить список функций обратного вызова
Пользователь
Сообщений: Регистрация: 31.01.2015
18.11.2020 11:44:50
Костыли типа отправки какой-нибудь транзакции на сервер, чтобы OnTransReply сработал, не предлагать.
Расширить список функций обратного вызова
Пользователь
Сообщений: Регистрация: 31.01.2015
18.11.2020 11:42:41
Есть список слушателей, которых надо уведомлять о коллбэках (каждого слушателя о своём подмножестве коллбэков) как можно быстрее. При этом в main() время от времени возникают вычислительно тяжёлые задачи (заранее нельзя контролировать время их выполнения и разбивать на мелкие подзадачи).
Если пробрасывать события из потока коллбэков в поток main(), то будут возникать задержки, чего не стоит допускать.
Есть потребность в отключении слушателей по таймауту (а не когда придёт очередной коллбэк) и подключении новых вне зависимости от приходящих коллбэков. При этом итерирование по таблице с добавлением/удалением сразу в двух потоках без должной синхронизации как-то плохо выглядит.
Выходит, что удобно иметь возможность инициировать какой-то коллбэк из потока main, не надо думать про синхронизацию. Пункты 1 и 2 были обсуждением таких возможностей.
Расширить список функций обратного вызова
Пользователь
Сообщений: Регистрация: 31.01.2015
18.11.2020 10:52:52
Антон, спасибо за предложенные варианты по п.1. Опасения по поводу п.2 понял. Получается, что лучше просить разработчиков реализовать п.1.
swerg, я же не просто так написал, что
Цитата
Надо всё это для того, чтобы можно было выполнять в потоке коллбэков регулярные задачи, которые удобнее и архитектурно правильнее делать там, а не в main.
Расширить список функций обратного вызова
Пользователь
Сообщений: Регистрация: 31.01.2015
18.11.2020 08:58:10
Не помню, предлагали уже такие пожелания или нет.
1) Добавить функцию обратного вызова OnTimer(), которая будет вызываться терминалом с некоторой периодичностью. Надо понять, как указывать период срабатывания. Конкретно для моих задач хватит срабатывания раз в секунду, но мало ли кому чаще надо. Предлагаю обсудить, кому интересно.
Пускай первый раз функция OnTimer() запускается сразу после OnInit() и возвращает число число миллисекунд, через которое будет сделан следующий вызов функции OnTimer(). Если возвращается не число, то пусть следующий вызов будет через 1 секунду.
Реализация на стороне терминала кажется несложной.
2) Дать пользователю возможность из main-потока подать команду на запуск своей функции в потоке коллбэков. Нормальное название не придумал, но надо что-то типа
Код
executeAsCallback(function() ... end)
В принципе, имея п.2, пользователь сможет самостоятельно реализовать п.2, если только в main-потоке не выполняются тяжёлые вычислительные задачи.
Надо всё это для того, чтобы можно было выполнять в потоке коллбэков регулярные задачи, которые удобнее и архитектурно правильнее делать там, а не в main.
getMoneyEx иногда выдает nil., Интересно почему?
Пользователь
Сообщений: Регистрация: 31.01.2015
09.11.2020 06:50:21
В документации про getMoneyEx написано:
Цитата
Функция возвращает таблицу Lua с таблицы «Позиции по деньгам».
В случае ошибки функция возвращает «nil».
Что за ошибка у вас или не у вас возникает -- неясно, но раз в документации написано, что может быть nil, это надо предусматривать. Но осадочек остаётся, согласен.
Critical error ACCESS_VIOLATION in script на версии 8.10, После обновления, ошибка запуска луа скрипта.
Пользователь
Сообщений: Регистрация: 31.01.2015
06.11.2020 12:02:27
Цитата
Alex написал: Версии 8.7 и 8.9 работали отлично, с 8.10 появилась данная проблема.
Не соглашусь с оценкой 8.7 и 8.9, там есть проблемы при активной эксплуатации. 8.9 лучше, конечно, чем 8.7.
Critical error ACCESS_VIOLATION in script на версии 8.10, После обновления, ошибка запуска луа скрипта.
Пользователь
Сообщений: Регистрация: 31.01.2015
06.11.2020 11:48:07
Тогда это страшный симптом. Я надеялся, что следующая версия терминала уже будет без ошибок. :(
Изменения в работе с колбеками LUA в новой версии
Пользователь
Сообщений: Регистрация: 31.01.2015
06.11.2020 10:55:02
Не придётся. А тема показывает, насколько У СТРАХА ГЛАЗА ВЕЛИКИ.
Critical error ACCESS_VIOLATION in script на версии 8.10, После обновления, ошибка запуска луа скрипта.
Пользователь
Сообщений: Регистрация: 31.01.2015
06.11.2020 10:52:49
А где вы взяли такую версию терминала? Официально только 8.9.0.107 есть, если не ошибаюсь.
Функция getParamEx возвращает нули по параметрам максимальная, минимальная цена для акций, проблемы с переходом на новую версию qlua
Пользователь
Сообщений: Регистрация: 31.01.2015
05.11.2020 12:56:00
Спасибо. Это тоже вариант, который позволит узнать нужные заголовки.
Функция getParamEx возвращает нули по параметрам максимальная, минимальная цена для акций, проблемы с переходом на новую версию qlua
Пользователь
Сообщений: Регистрация: 31.01.2015
03.11.2020 12:05:25
Про особенности национальной DestroyTable и, вообще, о корректной работе с окнами в QLua написал бы кто-нибудь хороший мануал с примерами и объяснениями, почему именно так надо. И на форум выложить на память и для начинающих. Или уже есть где такое в интернете?
Функция getParamEx возвращает нули по параметрам максимальная, минимальная цена для акций, проблемы с переходом на новую версию qlua
Пользователь
Сообщений: Регистрация: 31.01.2015
03.11.2020 11:06:33
Проверил Ваш прототип. Думаю, что эта штука вполне может заменить рекомендуемый разработчиками подход с DDE-экспортом. Спасибо!
Отдельное уважение за скорость реакции!
Функция getParamEx возвращает нули по параметрам максимальная, минимальная цена для акций, проблемы с переходом на новую версию qlua
Ваше пожелание зарегистрировано, мы постараемся его рассмотреть. Впоследствии, по результатам анализа, будет приниматься решение о реализации пожелания в будущих версиях ПО.
Вот тоже самое хочется сказать. Похоже, очередной выпуск на пенсию состоялся. Варились в собственном соку 40 лет да так, что протухли уже.
Я только одним утешаюсь: если начать торговать по-крупному на свои деньги, то с таким психологическим бэкграундом разорение будет весьма быстрым, после чего посты на форуме закончатся.
Функция getParamEx возвращает нули по параметрам максимальная, минимальная цена для акций, проблемы с переходом на новую версию qlua
Пользователь
Сообщений: Регистрация: 31.01.2015
27.10.2020 15:34:22
Цитата
Можно довольно простую программку сделать для приема дде-соединения ради только имен столбцов.
Я не умею, да и разбираться с устаревшими технологиями как-то не хочется.
Цитата
А давайте другого пожелаем, чтоб нам дали функцию в луа типа STRING getClassParameters(STRING classcode). А то как-то непорядочек, количество параметров в getClassInfo есть, а самих их негде взять.
Цитата
Я другое хотел предложить: возвращать таблицу вида: {["Имя параметра"] = "Формальный заголовок", } Но не знаю, насколько это юзабельно, поэтому не стал
Наверное, это неплохие варианты. Надобность в таком, по-видимому, будет редкая (один раз запустил и всё). Как сделать по уму и наиболее просто, пусть разработчики подумают.
Функция getParamEx возвращает нули по параметрам максимальная, минимальная цена для акций, проблемы с переходом на новую версию qlua
Пользователь
Сообщений: Регистрация: 31.01.2015
27.10.2020 13:57:25
Спасибо за ответ.
Хотелось бы иметь возможность без DDE обойтись. У меня нет Excel на компьютере, а LibreOffice не поддерживает эту давным давно устаревшую технологию.
Зарегистрируйте тогда пожелание о возможности выгрузки формальных заголовков в обычный текстовый файл выбором пункта меню.
Про настройки на стороне брокера я уточню у брокера.
Время ММВБ, Servertime не предлагать
Пользователь
Сообщений: Регистрация: 31.01.2015
27.10.2020 11:14:36
Цитата
при временных остановках никто о них не думает и не меняет в них 1 на что-то другое
Да, бирже пофиг на это. В крайнем случае, она вас за неэффективные транзакции оштрафует. Трейдер за всё в ответе, даже если не виноват. :)
А если серьёзно, то для ликвидных инструментов можно отслеживать количество сделок по классу или по классу+инструменту. И если в последние, скажем, 10 секунд нет ни одной сделки, полагаем, что торговля остановлена. Для неликвидных инструментов это будет плохо работать, понятное дело.
Функция getParamEx возвращает нули по параметрам максимальная, минимальная цена для акций, проблемы с переходом на новую версию qlua
Пользователь
Сообщений: Регистрация: 31.01.2015
27.10.2020 10:00:58
Похоже, что параметры "Мин." и "Макс." -- это что-то непонятное, а для акций TQBR и облигаций TQOB параметры "Мин. возм. цена" и "Макс. возм. цена" просто не транслируются.
Ещё вопрос, почему при запросе параметра last для TQBR и SBER за 10 минут до начала торгов мы видим нули:
а не отсутствие результата result="0"? Это биржа нули транслирует или терминал нулём заполняет отсутствующее значение?
Функция getParamEx возвращает нули по параметрам максимальная, минимальная цена для акций, проблемы с переходом на новую версию qlua
Пользователь
Сообщений: Регистрация: 31.01.2015
27.10.2020 08:37:52
Во прямо сейчас я вижу в ТТТ для класса RTSIDX и инструмента RTSI значения Мин. 1151,45 и Макс. 1165,58, но внутри QLua эти значения пока не смог получить.
А в потоке котировок для Акций вообще нет параметров Макс. и Мин. (есть Максимальная цена сделки и Минимальная цена сделки, но это же не то, кажется), при том, что сервер квик на аутсорсинге у Арки стоит и должен быть настроен как надо.
Функция getParamEx возвращает нули по параметрам максимальная, минимальная цена для акций, проблемы с переходом на новую версию qlua
Пользователь
Сообщений: Регистрация: 31.01.2015
27.10.2020 08:31:24
Вопрос, как узнать английское название для параметров Мин. и Макс. остаётся открытым.
Функция getParamEx возвращает нули по параметрам максимальная, минимальная цена для акций, проблемы с переходом на новую версию qlua
Пользователь
Сообщений: Регистрация: 31.01.2015
27.10.2020 07:49:36
И как понять название параметра на английском, если в справке они перечислены в разделе про QPile, а он уже не обновляется? Как называются параметры "Мин." и "Макс." внутри Qlua?
Не пора ли перенести эти описания в справку QLua и актуализировать?
Функция getParamEx возвращает нули по параметрам максимальная, минимальная цена для акций, проблемы с переходом на новую версию qlua
Пользователь
Сообщений: Регистрация: 31.01.2015
27.10.2020 07:34:22
Продолжим тему. Получается, что в Lua-скрипте для получения верхней границы цены надо писать примерно так:
Код
local paramName = "priceMax"
if classCode == "TQBR" or classCode == "RTSIDX" then
paramName = "Max" -- тут точно такое название параметра???
end
local param = getParamEx(classCode, secCode, paramName)
Какие ещё коды классов помимо TQBR и RTSIDX надо указать, чтобы это всё работало корректно?
Изменяется порядок нахождения сделок в таблице all_trades в зависимости от параметров таблицы все сделки.
Пользователь
Сообщений: Регистрация: 31.01.2015
26.10.2020 10:02:09
Нет никакой проблемы, просто убрать сортировку по номеру сделки и всё станет нормально.
Таблица "Доступные скрипты", lua-скрипты и их эксплуатация. За что пользователи не любят QUIK
Пользователь
Сообщений: Регистрация: 31.01.2015
26.10.2020 10:01:15
Цитата
У себя воспроизвести не смогли, просим предоставить снимок экрана, на котором наблюдается проблема, будем разбираться.
Да чинили же такое в версии 8.6, кажется. Странно, что техподдержка не помнит об этом.
Версию 8.5.2.11 надо СРОЧНО обновлять до последней 8.9, поскольку 8.5 совсем нестабильная версия была.
Объём (volume) на графиках, *
Пользователь
Сообщений: Регистрация: 31.01.2015
26.10.2020 09:56:24
Это известный глюк с удвоением. Бывает такое. По-хорошему, надо исправлять.
isConnected и пара неприятных моментов
Пользователь
Сообщений: Регистрация: 31.01.2015
20.10.2020 13:26:20
Я понимаю, что нельзя гарантировать, что в терминале есть вся последняя информация с биржи. Но трудно писать код, когда ты проверил в if условие, что всё должно быть хорошо, а после then всё сразу стало плохо (ситуация поменялась). Нет атомарности.
Вот и приходится без проверки всяких условий isConnected() делать какой-нибудь getXXX(), а потом проверять заполненность полей таблицы внутри результата, потому, что с очень малой вероятностью "что-то пошло не так".
isConnected и пара неприятных моментов
Пользователь
Сообщений: Регистрация: 31.01.2015
20.10.2020 13:17:54
Может, я что-то не до конца понимаю, и мне кто-нибудь прояснит ситуацию по приведённым ниже пунктам.
1) isConnected(), конечно, хорошая функция, но мне кажется, что её корректное использование таково: если она вернула 0, то разработчик может предусмотреть запрет на выполнение каких-то действий в скрипте, поскольку информация в терминале не соответствует действительности (устарела). А вот если isConnected() вернула 1, то это ничего не гарантирует: может, нужные шлюзы ещё не подключены, может информация не до конца загрузилась с сервера. Т.е. мы можем избежать гарантированных ошибок при isConnected() == 0, но не сделать ошибок при isConnected() == 1 эта функция не помогает.
2) При разрыве соединения и повторном подключении терминала к серверу в какой-то момент происходит пропадание информации в ТТТ (и других) и её повторное появление. При работе скриптов в момент "пропадания" информации справочные функции типа getSecurityInfo() могут вернуть пустые таблицы. Это приводит к тому, что скрипт, скажем, читает информацию о размере лота, а там его нет. Неприятно.
По второму пункту хотелось бы понять, как избежать постоянных проверок, что информация отсутствует. Возможно, что при перезагрузке данных в таблицах имеет смысл блокировать запросы к функциям типа getSecurityInfo(), пока они не могут вернуть данные. Пусть скрипты подождут на этой блокировке.
Может кто поделиться своим опытом по данному поводу? Из каких ещё функций, кроме getSecurityInfo(), будут получаться пустые таблицы в моменты перезагрузки данных? Могут ли разработчики прокомментировать это (и отразить в документации, что возвращается, если нет данных)?
Предложение к разработчикам
Пользователь
Сообщений: Регистрация: 31.01.2015
20.10.2020 12:55:04
Да откуда же вы такие берётесь?
Как убрать нуль после точки?, .0
Пользователь
Сообщений: Регистрация: 31.01.2015
08.10.2020 14:38:22
В начало функции поставьте проверку на nil и выводите сообщение (через message, например, или в лог, если он у есть). При работе со вложенными массивами/таблицами часто бывает, что забыли внутренние структуры инициализировать.
Цитата
Я уже до ручки дошёл: перед вызовом функции обуваю аргумент в tostring, а внутри функции переворачиваю его в tonumber - пофиг: "attempt to concatenate a nil value (local 's')".
Тут же явно на nil намёк.
Можно ещё всё в xpcall завернуть и печатать стек, чтобы было понятно, откуда вы попали со значением nil. Пример, как это обычно делается в моём коде приведён ниже. При любой ошибке видно, где она произошла.
Код
logger:info("STARTED")
local status, errMessage = xpcall(function()
if isConnected() ~= 1 then
local msg = config.name .. " is not connected on start. Shutdown."
logger:error(msg)
else
initialize()
run()
end
end, function(err)
logger:error(tostring(err))
logger:error(debug.traceback())
end)
if not status and errMessage ~= nil then
logger:error(errMessage)
end