Перестают работать события SetTableNotificationCallback
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
09.01.2021 14:29:44
При нажатии клавиш с кодами 107 (+), 109 (-), 111 (/) на цифровом блоке клавиатуры не работают события QTABLE_CHAR и QTABLE_VKEY.
Надо делать так, как надо. А как не надо - делать не надо.
Изменить версию Lua с 5.4.1 до 5.4.2
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
09.01.2021 14:23:47
Чтобы обход таблицы был более корректным, изменим тестовый скрипт, так, чтобы добавление и удаление полей таблицы осуществлялось в одном потоке:
Скрытый текст
Код
local run = true
function OnStop()
run = nil
end
local function f(t)
for i = 1, 100 do
t[""..i] = i
end
for k, v in pairs(t) do
t[k] = nil
end
t = {}
return t
end
p = {}
function OnParam(class_code, sec_code)
p = f(p)
end
a = {}
function OnAllTrade(alltrade)
a = f(a)
end
m = {}
function main()
while run do
m = f(m)
sleep(1)
end
end
Ошибка "invalid key to 'next'" никуда не делась. Для форсирования: перезаказать все обезличенные сделки.
Надо делать так, как надо. А как не надо - делать не надо.
Изменить версию Lua с 5.4.1 до 5.4.2
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
08.01.2021 17:34:38
Цитата
Roman Azarov написал: С некоторой вероятностью может появиться следующая ошибка?
Верно
Цитата
Roman Azarov написал: У себя подобного за целый день не увидели
Можете форсировать события:
Скрытый текст
Код
local p = {}
function OnParam(class_code, sec_code)
for i = 1, 20 do
p[sec_code..i] = class_code
end
end
local t = {}
function OnAllTrade(alltrade)
for i = 1, 20 do
t[alltrade.sec_code..i] = alltrade
end
end
function main()
while run do
for k, v in pairs(p) do
p[k] = nil
end
for k, v in pairs(t) do
t[k] = nil
end
sleep(1)
end
end
и сделать перезаказ всех обезличенных сделок.
Надо делать так, как надо. А как не надо - делать не надо.
Изменить версию Lua с 5.4.1 до 5.4.2
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
07.01.2021 09:40:25
В Lua 5.3 и Lua 5.4:
Цитата
invalid key to 'next'
Надо делать так, как надо. А как не надо - делать не надо.
Изменить версию Lua с 5.4.1 до 5.4.2
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
06.01.2021 11:25:27
Существует ненулевая вероятность, что сборщик придёт как раз во время обхода таблицы в одном из потоков.
Скрытый текст
Код
local p = {}
function OnParam(class_code, sec_code)
p[sec_code] = class_code
end
local t = {}
function OnAllTrade(alltrade)
t[alltrade.sec_code] = alltrade.class_code
end
function main()
while run do
for k, v in pairs(p) do
p[k] = nil
end
for k, v in pairs(t) do
t[k] = nil
end
sleep(1)
end
end
Надо делать так, как надо. А как не надо - делать не надо.
Кривые шибки в QLua
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
26.12.2020 17:00:43
QUIK v.8.11.0.66, Lua 5.4 Однократная ошибка
Цитата
attempt to call a nil value
в цикле for in pairs в main:
Код
local T = {}
function main()
while run do
...
for k, v in pairs(T) do -- тут ошибка
...
end
...
sleep(1)
end
end
stack traceback:
Цитата
in for iterator 'for iterator'
На момент возникновения ошибки таблица T была пуста: за время работы (3 часа) робота в таблицу элементы не добавлялись. Написать тестовый скрипт для воспроизведения или повторить ошибку не удалось.
Надо делать так, как надо. А как не надо - делать не надо.
У снятой заявки не заполняется поле canceled_uid, если заявка снята вскоре после выставления
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
23.12.2020 12:22:26
Цитата
swerg написал: Согласитесь, то, что речь про демо-сервер
Да, как оказалось, отсутствие canceled_uid в заявках для "KILL_ORDER" относится к только демо-серверу. В боевом квике все заявки без canceled_uid были сняты "MOVE_ORDERS".
Надо делать так, как надо. А как не надо - делать не надо.
У снятой заявки не заполняется поле canceled_uid, если заявка снята вскоре после выставления
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
23.12.2020 09:37:43
Roman Azarov, В заявках, снятых транзакцией "KILL_ORDER", не заполняется UID снявшего, если транзакция снята вскоре после выставления. В 8.11 наблюдается в junior. В заявках, снятых в результате транзакций "MOVE_ORDERS" на FORTS и "Изменение заявки" на ФР, UID снявшего не заполняется в любом случае. Наблюдается как на демо, так и на боевом.
Будете ли вы это исправлять в своём ПО - это ваше решение.
Надо делать так, как надо. А как не надо - делать не надо.
У снятой заявки не заполняется поле canceled_uid, если заявка снята вскоре после выставления
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
22.12.2020 15:43:42
Хотя инициатором "MOVE_ORDERS" был пользователь. Иногда, не сразу разберёшь... Логичнее всё же проставлять canceled_uid
Надо делать так, как надо. А как не надо - делать не надо.
У снятой заявки не заполняется поле canceled_uid, если заявка снята вскоре после выставления
Видимо, canceled_uid = 0 - торговая система. Вопрос можно пока закрывать, спасибо.
Надо делать так, как надо. А как не надо - делать не надо.
У снятой заявки не заполняется поле canceled_uid, если заявка снята вскоре после выставления
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
22.12.2020 13:34:25
В боевом квике v.8.11 для "KILL_ORDER" вопрос снимается. Для "MOVE_ORDERS" актуально.
Надо делать так, как надо. А как не надо - делать не надо.
Отладка QUIK 8.11
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
22.12.2020 13:13:04
Цитата
Anton написал: Так-то компилятор (одного файла) выглядит вот так и запускается в самом квике
Скомпилил библиотеку в 4к строк данным скриптом и в luac54.exe по ссылке . Результаты совпадают до байта.
Надо делать так, как надо. А как не надо - делать не надо.
У снятой заявки не заполняется поле canceled_uid, если заявка снята вскоре после выставления
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
22.12.2020 13:07:51
И ещё: у снятой заявки в результате транзакции "MOVE_ORDERS" вообще не заполняется UID снявшего.
Цитата
Roman Azarov написал: Действительно наблюдаем подобное поведение.
Я не понял: наблюдаете или нет? Запустите предложенный скрипт на своём демо.
Надо делать так, как надо. А как не надо - делать не надо.
Метки
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
22.12.2020 09:16:20
Цитата
Andrey Bezrukov написал: Зарегистрировали пожелание на возврат возможности изменения прозрачности меток и их фона из окна настроек метки.
У программиста всегда будет работа
Надо делать так, как надо. А как не надо - делать не надо.
Индикатор объема Volume, Корректность индикатора под сомнением
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
21.12.2020 10:13:44
Цитата
Евгений написал: растет цена или падает на свече тоже видно на свечках
На свече цены. Это надо ещё виртуальную линию провести от объёма к свече цены, и попасть в правильную. При мелком масштабе - не очевидно.
Цитата
Евгений написал: сигнал индикатора объема в том и состоит чтобы видеть быстро скачки объемов
Скачки объёмов сразу видно, и цветовая индикация тут не помощник, имхо. Ну раскрасили вы объёмы по росту-падению. Тут объём вырос на два лота, тут - упал, какая разница?
Надо делать так, как надо. А как не надо - делать не надо.
У снятой заявки не заполняется поле canceled_uid, если заявка снята вскоре после выставления
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
21.12.2020 10:04:28
swerg, canceled_uid - это UID снявшего заявку. Смотреть можно в скрипте или в визуальной таблице заявок.
Цитата
Roman Azarov написал: Уточните, пожалуйста, версию терминала, на котором была обнаружена проблема.
Версия любая, вплоть до 8.11
Надо делать так, как надо. А как не надо - делать не надо.
У снятой заявки не заполняется поле canceled_uid, если заявка снята вскоре после выставления
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
21.12.2020 08:46:30
Цитата
Anton написал: Что будет, если в OnTransReply строку run = nil перенести после sendTransaction?
Можно эту строку вообще убрать, без разницы.
Цитата
Anton написал: Зе пойнт что уже во время sendTransaction в колбеке скрипт мертв и что там серверу на самом деле посылается - загадка.
KILL_ORDER посылается, раз заявка снята. А заполнение полей в заявке - это уже дело сервера.
Надо делать так, как надо. А как не надо - делать не надо.
У снятой заявки не заполняется поле canceled_uid, если заявка снята вскоре после выставления
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
21.12.2020 08:25:40
Цитата
Anton написал: мейн завершается раньше sendTransaction из колбека
Как это должно повлиять на заполнение поля сервером?
Надо делать так, как надо. А как не надо - делать не надо.
Индикатор объема Volume, Корректность индикатора под сомнением
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
21.12.2020 08:24:15
Цитата
Евгений написал: При присвоении индикатору объема Volume цветовых настроек с учетом цвета для роста и падения учитывается рост и падение свечи
Вроде, норм, так и должно быть.
Цитата
Евгений написал: Должно быть так: Цвет столбца гистограммы меняется в зависимости от предыдущего объема
Больше, меньше и так видно
Надо делать так, как надо. А как не надо - делать не надо.
У снятой заявки не заполняется поле canceled_uid, если заявка снята вскоре после выставления
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
20.12.2020 21:07:17
Пример
Скрытый текст
Код
function main()
if sendTransaction{
TRANS_ID = tostring(trans_id),
ACTION = "NEW_ORDER",
ACCOUNT = account,
CLIENT_CODE = client,
CLASSCODE = class_code,
SECCODE = sec_code,
OPERATION = "B",
TYPE = "L",
PRICE = price,
QUANTITY = "1"
} == "" then run = true end
while run do sleep(1) end
end
function OnTransReply(trans_reply)
if trans_reply.trans_id ~= trans_id then return end
run = nil
sendTransaction{
TRANS_ID = tostring(trans_id + 1),
ACTION = "KILL_ORDER",
CLASSCODE = class_code,
ORDER_KEY = tostring(trans_reply.order_num)
}
end
function OnStop()
run = nil
end
Надо делать так, как надо. А как не надо - делать не надо.
Как определить абсолютный путь к исполняемому файлу lua?
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
18.12.2020 14:17:09
Цитата
TGB написал: вариант с локальным объявлением gcrunner
Так __gc вызывается до OnInit
Скрытый текст
Код
local run = true
local tid = nil
local gcrunner = {}
setmetatable(gcrunner, { __gc = function()
if tid then DestroyTable(tid) end
message('__gc', 2)
end })
function OnInit(script_path)
file = io.open(script_path .. ".log", "w")
file:write("OnInit\n")
message("OnInit")
end
function main()
message("main")
tid = AllocTable()
AddColumn(tid, 1, '1', true, QTABLE_INT_TYPE, 1)
CreateWindow(tid)
collectgarbage()
while run do sleep(300) end
end
function OnStop()
run = nil
end
Убираем какую-нибудь строку, например
Код
file:write("OnInit\n")
и срабатывает при вызове collectgarbage. Как-то так.
Цитата
TGB написал: вариант с локальным объявлением gcrunner не работает в QLua 5.3.5 для финализации скрипта.
Без collectgarbage сработает и для финализации.
Надо делать так, как надо. А как не надо - делать не надо.
Как определить абсолютный путь к исполняемому файлу lua?
написал: Цитата TGB написал:-- collectgarbage () --- Если эту строку раскомментировать и при этом local gcrunner = {}, то при запуске collectgarbage () сработает __gc. Вроде, не срабатывает.
Здравствуйте! При этом необходимо, чтобы gcrunner был объявлен локальным: local gcrunner = {}
__gc срабатывает до вызова collectgarbage, возможно при автоматической сборке.
Надо делать так, как надо. А как не надо - делать не надо.
Как определить абсолютный путь к исполняемому файлу lua?
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
18.12.2020 09:58:27
Цитата
TGB написал: -- collectgarbage () --- Если эту строку раскомментировать и при этом local gcrunner = {}, то при запуске collectgarbage () сработает __gc.
Вроде, не срабатывает.
Надо делать так, как надо. А как не надо - делать не надо.
Не работают горячие клавиши
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
17.12.2020 19:48:21
При активном окне "Доступные скрипты" не работают никакие горячие клавиши.
Надо делать так, как надо. А как не надо - делать не надо.
Надо делать так, как надо. А как не надо - делать не надо.
Отладка QUIK 8.11
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
17.12.2020 18:58:45
Цитата
Евгений написал: Key removed from a table during traversal may not be accepted by 'next'.
Очень похоже:
Цитата
TGB написал: при существующей архитектуре обработки событий в QLua, уборка мусора в нем должна быть потокобезопасной
Наверное, придётся согласиться ))
Надо делать так, как надо. А как не надо - делать не надо.
На демо сервере junior quik не передается таблица firms при смене пользователя
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
16.12.2020 16:31:39
Цитата
Nikolay написал: По какому признаку мне понять, что пока рано идти и смотреть позицию в таблице futures_client_holding?
Цитата
Andrey Bezrukov написал: можем зарегистрировать пожелание на индикацию в скрипте о том, что необходимые для отображения таблиц данные были получены с сервера после очистки
Может, будет полезно добавить трансляцию таблицы sys_events со шлюза?
Скрытый текст
Надо делать так, как надо. А как не надо - делать не надо.
Highlight с дробным timeout, не работает, но возвращает true
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
16.12.2020 12:12:14
Было бы неплохо в руководстве указывать тип данных, как для передаваемых параметров, так и возвращаемых, не number, а dooble или integer, раз уж теперь это важно.
Надо делать так, как надо. А как не надо - делать не надо.
Отладка QUIK 8.11
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
15.12.2020 11:14:26
Цитата
Александр написал: Как понять в каком окружении запущен скрипт?
_VERSION
Надо делать так, как надо. А как не надо - делать не надо.
Отладка QUIK 8.11
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
15.12.2020 08:49:46
После этой ошибки при закрытии QUIK (крестиком) с остановленными скриптами - падение с дампом
Надо делать так, как надо. А как не надо - делать не надо.
Отладка QUIK 8.11
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
15.12.2020 08:46:31
Lua 5.3.5 в QUIK 8.11 в падает с ошибкой
Цитата
Critical error ACCESS_VIOLATION in script
Про Lua 5.4.1 пока сказать ничего могу.
Надо делать так, как надо. А как не надо - делать не надо.
Надо делать так, как надо. А как не надо - делать не надо.
Зависание QUIK
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
14.12.2020 19:13:55
Отправлял три дампа. Ответили:
Цитата
есть синхронизационная ошибка возникающая в момент остановки скрипта. Мы исправим её в очередном обновлении ПО.
Цитата
Речь идет об аварийной остановке скрипта из-за ошибки, сообщение о которой Вы не получаете по причине зависания терминала.
Думаю, это ошибки вида: , Об устранении самой проблемы, из-за которой возникают ошибки в рабочих скриптах, ни слова.
А тем временем поймал ещё одно зависание, уже в колбеке. Тестовый скрипт для воспроизведения:
Скрытый текст
Код
local run = true
local z = {0, 1}
local table_ssort = table.ssort
function c(func)
table_ssort(z, function()
func()
return true
end)
end
local string_format = string.format
local function f()
string_format('%.1f / %.f', 100 / 1000, 10)
end
function OnQuote(class_code, sec_code)
for i = 1, 50 do
c(f)
end
end
function OnParam(class_code, sec_code)
for i = 1, 50 do
c(f)
end
end
function main()
local class_code = 'QJSIM'
local s = {}
local n = 0
for sec_code in string.gmatch(getClassSecurities(class_code), '([^,]+)') do
if Subscribe_Level_II_Quotes(class_code, sec_code) == true then
n = n + 1
s[n] = sec_code
end
end
while run do
sleep(1)
end
for i = 1, n do
Unsubscribe_Level_II_Quotes(class_code, s[i])
end
end
function OnStop()
run = nil
end
Запустил 4 скрипта. Через несколько часов квик повесился.
Надо делать так, как надо. А как не надо - делать не надо.
Отключение горизонтальных полос прокруток на графиках цен
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
14.12.2020 12:08:15
Цитата
Andrey Bezrukov написал: Мы постараемся рассмотреть его и сообщить Вам результаты анализа.
Рассмотреть пока не удалось?
Надо делать так, как надо. А как не надо - делать не надо.
Отключение горизонтальных полос прокруток на графиках цен
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
08.12.2020 19:36:30
+1
Надо делать так, как надо. А как не надо - делать не надо.
Некорректная выгрузка DLL при завершении скрипта, Некорректная выгрузка DLL при завершении скрипта
local run = true
local tid = nil
local file
local gcrunner = (function()
local t = {}
setmetatable(t, { __gc = function()
local t = tid
tid = nil
if t then DestroyTable(t) end
file:write("__gc\n")
file:close()
end })
return t
end)()
function OnInit(script_path)
file = io.open(script_path .. ".log", "w")
file:write("OnInit\n")
end
function main()
file:write("main\n")
tid = AllocTable()
AddColumn(tid, 1, '1', true, QTABLE_INT_TYPE, 1)
CreateWindow(tid)
while run do sleep(300) end
file:write("main stopped\n")
end
function OnStop()
run = nil
file:write("OnStop\n")
end
В логе:
Цитата
OnInit main OnStop main stopped
Надо делать так, как надо. А как не надо - делать не надо.
[BUG] Сортировка в таблицах
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
02.12.2020 12:55:55
Цитата
Roman Azarov написал: Значки не перепутаны, а сделаны как задумано.
Надо делать так, как надо. А как не надо - делать не надо.
[BUG] Сортировка в таблицах
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
02.12.2020 11:51:29
Из проводника Windows:
Надо делать так, как надо. А как не надо - делать не надо.
[BUG] Сортировка в таблицах
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
02.12.2020 11:41:32
Треугольник, указывающий вверх, показывает восходящий порядок. Он соответствует порядку с самым малым элементом (вершиной треугольника) вверху списка и самым большим (основанием треугольника) внизу.
Надо делать так, как надо. А как не надо - делать не надо.
[BUG] Сортировка в таблицах
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
02.12.2020 11:11:54
Да мало ли, где что написано. ( тоже писали... как оказалось неправду) Вы сами не видите, что значки перепутаны?
Надо делать так, как надо. А как не надо - делать не надо.
[BUG] Сортировка в таблицах
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
02.12.2020 10:43:32
Вроде как значок сортировки показывает увеличение, а по факту - убывание.
Надо делать так, как надо. А как не надо - делать не надо.
FAQ: Оптимизация производительности клиентского места QUIK, Обсуждение
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
30.11.2020 10:27:34
Цитата
Roman Azarov написал: Обеспечить хорошее качество каналов связи с учетом большого количества трейдеров - это задача Вашего брокера
Вы (ваши коллеги) пишите, что у вас нет возможности подключения к реальным торговым серверам. Вопрос: как вы осуществляете нагрузочные тестирования в боевых условиях и проводите ли их вообще? Имеете ли вы возможность дать брокеру рекомендации по организации серверного оборудования в зависимости от количества клиентов?
Надо делать так, как надо. А как не надо - делать не надо.
FAQ: Оптимизация производительности клиентского места QUIK, Обсуждение
Надо делать так, как надо. А как не надо - делать не надо.
FAQ: Оптимизация производительности клиентского места QUIK, Обсуждение
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
27.11.2020 13:14:40
Цитата
Александр Кашников написал: Берем таблицу "securities" и сохраняем в файл, а там - дохлые инструменты (опционы, фьючерсы) аж с 2018г. о какой производительности речь? Вот откуда берутся 17к + инструментов - из них 70% просто не существуют.
В таблицу securities только добавляются новые инструменты. Старые не удаляются. Чтобы избавиться от дохлых инструментов, удалите файл sec.dat. После подключения к серверу у вас будут только актуальные инструменты.
Надо делать так, как надо. А как не надо - делать не надо.
Lua-таблицы. Интерфейс. Управление свойствами lua-таблиц., Как тонко настроить lua-таблицу? Механизмы взаимодействия пользователя с lua-таблицами.