Владимир, у меня нет навыка чтения мыслей. В той кода, что вы привели нет tonumber. Вы можете привести полный код скрипта или продолжить возмущаться, но лучше не на этом форуме, т.к. тут общаются взрослые дяди
Надо делать так, как надо. А как не надо - делать не надо.
Как убрать нуль после точки?, .0
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
08.10.2020 13:30:26
Владимир, мой скил не так высок, чтобы по приведённому кусочку кода дать ответ
Надо делать так, как надо. А как не надо - делать не надо.
Как убрать нуль после точки?, .0
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
08.10.2020 13:17:33
Цитата
Anton написал: все остальное там это кэш информации
Кешировать степень числа (pwr10) не имеет смысла, т.к. возведение в степень быстрее в два раза, чем вытащить значение из таблицы. А вот операции со строками в Lua на порядок дольше, т.ч. strf будет полезно.
Надо делать так, как надо. А как не надо - делать не надо.
Как убрать нуль после точки?, .0
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
08.10.2020 13:12:02
Цитата
Владимир написал: а не хочу я узнать тип переменной - мне нужно, чтобы она не меняла свой тип,
В Lua, как и большинстве (или всех?) других языков, тип переменной произвольно не меняется. Тип может измениться только при определённых действиях над переменной. И опытный программист всегда знает, какой тип переменной будет при той или иной операции над переменной.
Надо делать так, как надо. А как не надо - делать не надо.
Зависание QUIK
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
06.10.2020 09:41:18
: запустил скрипт 1 и три скрипта 3 (дабы быстрее получить результат) с вашей патченой длл. Сделал несколько тестов. Ошибки не дождался, т.к. QUIK зависал по уже знакомой схеме: main одного скрипта прибит, остальные скрипты крутятся, основной поток остался в состоянии ожидания.
Сейчас вышла версия 8.9. Посмотрим насколько она стабильнее.
Надо делать так, как надо. А как не надо - делать не надо.
Надо делать так, как надо. А как не надо - делать не надо.
неужели OnParam самый быстрый?
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
05.10.2020 10:11:44
Понятней не стало )) Мож, ваша ошибка, мож, баг квика, мож, кривые ручки брокера...
Цитата
Nikolay написал: Но все же, параметры TIME и LAST синхронизированы? Т.е. если мне брокер прислал в колбеке цену по времени пол часа назад, то параметр TIME укажет это?
Если ошибка не на вашей стороне, то какие тут могут быть гарантии?
Надо делать так, как надо. А как не надо - делать не надо.
неужели OnParam самый быстрый?
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
05.10.2020 09:03:50
Цитата
Nikolay написал: Сегодня брокер выдал в OnParam по фьючерсу RIZ0 цену последней сделки из прошлого. В 17.37 цена была одна, а колбек выдал цену где-то на пол часа назад, очень далекую от текущей.
Можете подробней? Как это произошло? Вы только запустили робота и получили старый результат? Или работал себе робот, получал актуальные данные, и тут раз и однократно проскакивает цена из прошлого? Сам колбек OnParam возвращает только класс и код инструмента, в котором произошли изменения. Каким образом получаете котировку?
Надо делать так, как надо. А как не надо - делать не надо.
Зависание QUIK
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
29.09.2020 10:34:33
Цитата
Anton написал: для сбора статистики предлагаю заинтересованным коллегам повторить эксперименты у себя
: заменил длл вашей, подключился к серверу, запустил оба скрипта и, и почти сразу ошибка:
Цитата
attempt to compare number with function
Надо делать так, как надо. А как не надо - делать не надо.
Зависание QUIK
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
29.09.2020 10:29:56
Цитата
Anton написал: вы тоже наблюдаете такой эффект: если много этих тестовых скриптов запущено, таблица всех сделок не успевает обновляться, перерисовывается изредка сразу с большим шагом.
У меня в таблицу обезличенных сделок добавлен только один инструмент: либо какой-нибудь старый уже истёкший фьючерс либо какой-то неторговый. Т.ч., по факту само окно пустое, а сделки заказываю через фильтры (либо скриптом).
Надо делать так, как надо. А как не надо - делать не надо.
написал: А логические ошибки, когда в непредсказуемом месте вылезает nil, типа attempt to compare number with nil и т.п., они могут как-то в будущем повлиять? QUIK перегружать нужно?
Когда после ошибки в одном скрипте начинают сыпаться ошибки в других, или в нем же после рестарта, это показывает, что стек был покоцан, дальше уже как повезет, насколько сильно и т.д., где-то закончится небольшой утечкой, где-то уже серьезные повреждения, которые вылезут позже.
Я про логические ошибки скрипта, когда где-то что-то недосмотрел, не проверил на nil полученные данные и т.п. И в какой-то момент вместо данных там оказался nil. Скрипт остановился. Это может повлиять на будущую работу?
Надо делать так, как надо. А как не надо - делать не надо.
Зависание QUIK
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
28.09.2020 22:11:12
JUNIOR 1 [91.209.122.220:15100:info]
Надо делать так, как надо. А как не надо - делать не надо.
Зависание QUIK
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
28.09.2020 21:18:07
А логические ошибки, когда в непредсказуемом месте вылезает nil, типа attempt to compare number with nil и т.п., они могут как-то в будущем повлиять? QUIK перегружать нужно?
Надо делать так, как надо. А как не надо - делать не надо.
Не, знаю, после долгого тестирования, QUIK ошибки накапливает или чё? После перезапуска скрипта словил ошибку
Цитата
bad argument #2 to 'write' (string expected, got FILE*)
в строке
Код
file:write(s)
Я понимаю, стресс-тест, в торговых скриптах столько циклов гонять никто не будет.
Но в боевом квике в реальных условиях всё же виснет на строке
Код
local arg = {...}
Надо делать так, как надо. А как не надо - делать не надо.
Зависание QUIK
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
28.09.2020 20:05:39
Цитата
Anton написал: Приведенный здесь тест у меня не воспроизвелся
Ну тут как повезёт: может и несколько дней проработать без зависаний.
Цитата
Anton написал: не желаете патченую qlua.dll запробовать со своими тестами?
Погоняю с вашей библиотекой, посмотрим.
Цитата
Anton написал: Особо нагружать боевой сервер я стесняюсь
Так можно на гонять.
Надо делать так, как надо. А как не надо - делать не надо.
Зависание QUIK
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
28.09.2020 19:57:36
Получил ошибку
Цитата
stack overflow
в строке
Код
local arg = {...}
(Это с оригинальной qlua.dll пока)
Надо делать так, как надо. А как не надо - делать не надо.
Зависание QUIK
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
27.09.2020 08:56:14
Код
local run
local file
local function log(s)
file:seek('set')
file:write(s)
file:flush()
end
function c(func, ...)
log('1')
local arg = {...}
log('2')
end
function OnInit(path)
local err
file, err = io.open(path..'.log', 'w+')
if file == nil then
message(err, 3)
else
run = true
end
end
function OnAllTrade(alltrade)
end
function OnParam(class, sec)
end
function OnStop()
run = nil
end
local f2 = function() end
function main()
if not run then return end
while run do
for i = 1, 100 do
log('0')
c(f2, i, 1, 2, 3)
log('3')
end
sleep(1)
end
file:close()
end
В логе:
Цитата
1
Как и в прошлый раз поток main скрипта прибит. Основной поток остался в состоянии ожидания.
Скрытый текст
Надо делать так, как надо. А как не надо - делать не надо.
Зависание QUIK
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
26.09.2020 23:53:34
Похоже, источник проблемы - функция с переменным числом аргументов. Возникает либо при вызове функции
Код
c(func, ...)
либо при формировании таблицы аргументов
Код
local arg = {...}
Код демонстрационного скрипта:
Код
local run = true
function c(func, ...)
local arg = {...}
end
local f1 = function() end
function OnAllTrade(alltrade)
c(f1, alltrade)
end
function OnParam(class, sec)
end
function OnStop()
run = nil
end
local f2 = function() end
function main()
while run do
for i = 1, 100 do
c(f2, i, 1, 2, 3)
end
sleep(1)
end
end
Надо делать так, как надо. А как не надо - делать не надо.
написал: В таблице транзакций параметр "Транзакция" приходит с сервера или клиент сам вычисляет его?
Добрый день.
С сервера.
В OnTransReply как прочитать этот параметр?
Надо делать так, как надо. А как не надо - делать не надо.
Кривые шибки в QLua
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
25.09.2020 19:08:44
Цитата
Anton написал: у вас всегда параллельно со скриптами работает хоть один луа-индикатор
Если вопрос по скриптам из текущей и тем, то нет, в тестовом квике даже графики не открыты. Открытые окна:
Скрытый текст
Надо делать так, как надо. А как не надо - делать не надо.
Кривые шибки в QLua
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
25.09.2020 15:17:42
Скрипт тот же, строка та же: Ошибка
Цитата
attempt to call a nil value
Надо делать так, как надо. А как не надо - делать не надо.
Кривые шибки в QLua
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
25.09.2020 13:07:25
Никто и не обещал, что ошибка появляется всегда и сразу. Можно запустить несколько копий скрипта, как , сделать перезаказ обезличенных сделок... В общем, ошибка именно в этом коде и именно в этом месте присутствует. А как гарантированно воспроизвести - без понятия. Надо смотреть сорцы, откуда там nil.
Надо делать так, как надо. А как не надо - делать не надо.
Таблица транзакций
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
25.09.2020 11:49:42
В таблице транзакций параметр "Транзакция" приходит с сервера или клиент сам вычисляет его?
Для транзакций "Переставить заявки" и "Снятие заявки" в поле "Операция" отображается не реальное направление заявки, а всегда - "Купля".
Надо делать так, как надо. А как не надо - делать не надо.
Кривые шибки в QLua
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
25.09.2020 11:11:33
Код
local run = true
function OnAllTrade(alltrade)
end
function OnParam(class, sec)
end
function main()
local getinfo = debug.getinfo
while run do
for i = 1, 100 do
getinfo(1)
end
sleep(1)
end
end
function OnStop()
run = nil
end
Ошибка в строке getinfo(1)
Цитата
bad argument #1 to 'getinfo' (number expected, got nil)
Надо делать так, как надо. А как не надо - делать не надо.
Кривые шибки в QLua
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
25.09.2020 11:11:20
Здесь будут публиковаться кривые ошибки, возникающие, очевидно, из-за двухпоточной схемы работы QLua. Некоторые ошибки указаны здесь:
Надо делать так, как надо. А как не надо - делать не надо.
Изменяется порядок нахождения сделок в таблице all_trades в зависимости от параметров таблицы все сделки.
написал: Этот флаг никак не должен менять порядок сделок в хранилище
Сам по себе да, а вкупе с шаловливыми ручками? Поставить флажок, накачать чего, снять флажок, накачать еще.
Проверьте. При снятии флага пропущенные сделки закачиваются только при перезаказе. Так что как раз теоретически в пределах одного тикера накрутить невозможно. А что на практике - так это не шаловливые ручки виноваты.
Надо делать так, как надо. А как не надо - делать не надо.
Изменяется порядок нахождения сделок в таблице all_trades в зависимости от параметров таблицы все сделки.
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
18.09.2020 11:24:02
Цитата
Anton написал: флагу "получать с текущего момента"
Этот флаг никак не должен менять порядок сделок в хранилище
Надо делать так, как надо. А как не надо - делать не надо.
Зависание QUIK
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
18.09.2020 08:30:14
Цитата
Anton написал: Результат - уровень рекурсии стоит 1 как влитой.
Погонял ваш тест. Единичка осталась.
Надо делать так, как надо. А как не надо - делать не надо.
Изменяется порядок нахождения сделок в таблице all_trades в зависимости от параметров таблицы все сделки.
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
18.09.2020 08:27:35
Надо делать так, как надо. А как не надо - делать не надо.
Таблица всех сделок
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
18.09.2020 08:26:57
Запрашиваемые данные были отправлены 16.10.2019, 03.04.2020
Надо делать так, как надо. А как не надо - делать не надо.
Зависание QUIK
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
17.09.2020 09:28:12
Цитата
Anton написал: Где-то этот лок захвачен и не выпущен, возможно, в одном из (других) скриптов, возможно, косячок в самом квике.
7500 и 5364 - потоки двух скриптов. Они большую часть времени стоят на SleepEx. Один из них, известно точно, периодически просыпается и шлёт отладочную информацию. Так что, лок захвачен явно не ими. А вот, где поток третьего скрипта, не пойму, может прибит уже?
Скрытый текст
Цитата
Anton написал: Там совсем другая картина, квик пытается получить колбек через lua_getglobal и падает из-за access violation.
Помимо описанных ошибок и падений в теме, несколько раз были и зависания. Но зависает не скоро, и написать демонстрационный скрипт, гарантированно приводящий к зависанию в течение разумного времени после запуска не представляется возможным.
Надо делать так, как надо. А как не надо - делать не надо.
Зависание QUIK
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
17.09.2020 00:11:26
Цитата
Anton написал: Квик хочет вызвать колбек OnAllTrade и заполняет для него табличку с очередной сделкой. Все данные из ТВС уже вытащены, почти вся табличка заполнена, в последнюю очередь квик создает вложенную табличку datetime, пытается воткнуть в нее строку "day" и в этот момент виснет на lua_pushstring, как написал выше. В общем, это все мало что дает, косяк где-то в синхронизации все равно.
Первые два трейда - это видимо, два скрипта из трёх запущенных. Один из которых, как я написал, выше, раз в минуту шлёт отладочную информацию. Второй просто молча работает (вроде, работает).
А третий скрипт, я также предполагал, что застрял перед вызовом одного из колбеков, потому и не отображается в логе. Что касается бесконечной рекурсии, то их нет в скрипте. И я почти на 100% уверен, что QUIK "завис" не из-за логической ошибки в скрипте. За эту версию говорит также тот довод, что неоднократно похожая проблема наблюдалась на скриптах из этой .
Надо делать так, как надо. А как не надо - делать не надо.
QUIK не совсем завис, а только основной поток находится в ожидании чего-то. Один из скриптов в main периодически шлёт отладочную информацию через PrintDbgStr.
Надо делать так, как надо. А как не надо - делать не надо.
Склейка графика приводит к сбросу ряда настроек
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
16.09.2020 16:41:10
Цитата
Egor Zaytsev написал: Мы предлагаем исследовать не вам, а нам.
Если склейка (сам этой опцией не пользуюсь) приводит к перезагрузке настроек, то о проблеме сброса фильтров потока всех сделок сообщалось 5 мес. назад:
Надо делать так, как надо. А как не надо - делать не надо.
SetCell
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
16.09.2020 12:01:22
Это указано и в 6, 7, 8.1 версиях. И там SetCell работает нормально с необязательным пятым параметром
Надо делать так, как надо. А как не надо - делать не надо.
Зависание QUIK
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
16.09.2020 10:14:17
Добрый день.
QUIK 8.8.4.3. Стандартная схема оформления. Иногда после нескольких дней работы зависает. При этом загрузка ЦП процессом 0 Сначала грешил на потокобезопасные функции. Но анализ логов показывает, что зависании происходит вне потокобезопасных функций (но это не точно )) Можно ли по стеку определить последнюю вызванную QLua функцию?
Надо делать так, как надо. А как не надо - делать не надо.
SetCell
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
15.09.2020 16:40:46
Код
id = AllocTable()
AddColumn(id, 1, "", true, QTABLE_STRING_TYPE, 20)
CreateWindow(id)
local col = InsertRow(id, 1)
local value = "Text"
message(tostring(SetCell(id, 1, col, tostring(value), tonumber(value) or 0)))
Надо делать так, как надо. А как не надо - делать не надо.
Преобразование целого числа в строку в QUIK 8.8+
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
15.09.2020 16:23:25
Выше пример преобразования числа без потери точности (поэтому format с ним справляется) А это с потерей точности:
Код
a = 1952336732254970146
b = a + 0.0
print(a == b)
Надо делать так, как надо. А как не надо - делать не надо.
Преобразование целого числа в строку в QUIK 8.8+
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
15.09.2020 16:18:14
Цитата
Александр М написал: проблему не решило, если произошло изменение типа
При преобразовании в double произошла потеря точности. Первоначальное значение никакими ухищрениями уже не вернуть.
Код
a = 1952336732254970112
b = a + 0.0
print(a == b)
Надо делать так, как надо. А как не надо - делать не надо.
SetCell
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
15.09.2020 15:54:21
SetCell стал ругаться false на такую конструкцию для строковых ячеек:
Код
SetCell(id, row, col, tostring(value), tonumber(value) or 0)
Надо делать так, как надо. А как не надо - делать не надо.
Потокобезопасные функции в Lua 5.3
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
11.09.2020 15:14:39
А у вас студия открывает дамп, созданный диспетчером задач?
Надо делать так, как надо. А как не надо - делать не надо.
MOVE_ORDER на фондовом рынке мос.биржи?
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
11.09.2020 14:39:06
На Junior будет этот вид транзакций?
Надо делать так, как надо. А как не надо - делать не надо.
Потокобезопасные функции в Lua 5.3
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
11.09.2020 11:30:01
Цитата
Anton написал: Падает на lua_getglobal. В qlua.dll основным потоком квика вызывается некая функция, она пытается вызвать lua_getglobal(state, "OnAllTrade") и, если успешно, далее заполняет табличку all_trade и вызывает полученную луа-функцию. То есть это как раз место, где вызывается OnAllTrade.
Где вы это смотрите?
Надо делать так, как надо. А как не надо - делать не надо.
Debug function name
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
05.09.2020 11:04:19
Анонимная функция
Надо делать так, как надо. А как не надо - делать не надо.
Потокобезопасные функции в Lua 5.3
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
18.08.2020 12:16:48
Ложная тревога. Скрипт 4 написан некорректно, потому сделки теряются.
Надо делать так, как надо. А как не надо - делать не надо.
Потокобезопасные функции в Lua 5.3
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
18.08.2020 11:59:26
Скрипт 4
Скрытый текст
Код
local run, id
local AllTrades = {}
local get, process = 0, 0
function OnAllTrade(alltrade)
if not run then return end
table.sinsert(AllTrades, alltrade)
local n = getNumberOf('all_trades')
SetCell(id, 1, 1, tostring(n), n)
if n == 1 then
get = 1
process = 0
else
get = get + 1
end
SetCell(id, 1, 2, tostring(get), get)
end
function main()
id = AllocTable()
AddColumn(id, 1, 'all', true, QTABLE_INT_TYPE, 10)
AddColumn(id, 2, 'get', true, QTABLE_INT_TYPE, 10)
AddColumn(id, 3, 'process', true, QTABLE_INT_TYPE, 10)
CreateWindow(id)
SetWindowPos(id, 0, 0, 193, 61)
InsertRow(id, -1)
run = true
while run do
if #AllTrades ~= 0 then
while #AllTrades ~= 0 do
table.sremove(AllTrades, 1)
process = process + 1
end
SetCell(id, 1, 3, tostring(process), process)
else sleep(1) end
end
end
function OnStop()
run = nil
DestroyTable(id)
end
Запускаю несколько копий. Делаю перезаказ обезличенных сделок. Предполагается, что все скрипты обработают одинаковое количество сделок. Ан, нет. Спустя чуть больше часа разрываю соединение, чтобы проверить. Часть скриптов потеряла по одной сделке.
Скрытый текст
Надо делать так, как надо. А как не надо - делать не надо.
Отладка QUIK 8.8
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
17.08.2020 12:10:50
Вернее так:
Код
SetCell(id, row, col, tostring(value), tonumber(value) or 0)
Надо делать так, как надо. А как не надо - делать не надо.
Потокобезопасные функции в Lua 5.3
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
17.08.2020 10:54:32
Скрипт 1 оставляем. Скрипт 2 меняем на Скрипт 3:
Скрытый текст
Код
local run = true
local function work(alltrade, n)
for i = 1, n do
local d = alltrade.flags % 2
d = bit.band(alltrade.flags, 2)
end
end
local AllTrades = {}
function OnAllTrade(alltrade)
table.ssort({0, 0}, function()
AllTrades[#AllTrades+1] = alltrade
work(alltrade, 10)
return true
end)
end
function main()
while run do
while #AllTrades ~= 0 do
local alltrade = table.sremove(AllTrades, 1)
table.ssort({0, 0}, function()
work(alltrade, 100)
return true
end)
end
sleep(1)
end
end
function OnStop()
run = nil
end
Можно также запустить несколько копий, чтоб наверняка. Изредка выскакивает ошибка
Цитата
bad argument #1 to 'ssort' (table expected, got nil)
в строке
Код
table.ssort({0, 0}, function()
Иногда падает. Причём, может длительное время работать без сбоев. После появления первой ошибки и перезапуска скрипта, ошибки начинают сыпаться чаще.
Надо делать так, как надо. А как не надо - делать не надо.