Странно, как мы все эти годы пишем на языке. И на других языках. И как-то все пишется. И строки из таблиц удаляются. Да, есть проблемы с переходом на новую версию, но они не столь критичны.
Может, все же, надо изучить язык прежде чем мысли озвучивать, да и другим советовать.
Владимир, к сведению, если хотите чтобы в таблице были только числовые индексы (и даже целочисленные), то это не сложно сделать.
Вот несложный конструктор:
Код
local typedT = function(key_type, value_type, allow_nil)
local val_t = {}
local proxy = {}
if allow_nil == nil then allow_nil = true end
local check_type = function(value, c_type)
if (c_type or '') == '' then return true end
if (('integer|float'):find(c_type)) then
return math.type(value) == c_type
end
return type(value) == c_type
end
local mt = {
__index = val_t,
__newindex = function (_, k, v)
if not check_type(k, key_type) then
error("attempt to index with "..(type(k) == 'number' and math.type(k) or type(k)).. " type", 2)
end
if (not allow_nil and v == nil) or (v ~= nil and not check_type(v, value_type)) then
error("attempt to set a value "..(type(v) == 'number' and math.type(v) or type(v)).. " type", 2)
end
val_t[k] = v
end
}
setmetatable(proxy, mt)
return proxy
end
local t = typedT('number')
Также можно сделать только readonly объекты, можно сделать и объекты заданного типа, просто с ними придется работать не как с переменными, а через getter и setter. Было бы желание.
Странная дата сервера
Пользователь
Сообщений: Регистрация: 27.01.2017
15.10.2020 19:09:21
Что это за формат времени в поле Дата торгов? Как, спрашивается, понять, что здесь что?
Функции onInit, onStop, onClose
Пользователь
Сообщений: Регистрация: 27.01.2017
15.10.2020 15:25:33
А спецификацию языка недосуг прочитать:
Цитата
Приведения типов
Lua обеспечивает автоматическое преобразование между числами и строками во время выполнения программ. Любая числовая операция, примененная к строке, пытается преобразовать эту строку в число:
Lua применяет подобные преобразования не только в арифметических операциях, но и в других местах, где ожидается число, таких как аргумент math.sin. Верно и обратное — каждый раз, когда Lua находит число там, где ожидает строку, он преобразует это число в строку:
print(10 .. 20) --> 1020
(Операция .. служит в Lua для конкатенации строк. Когда вы записываете ее сразу после числа, вы должны отделить их друг от друга при помощи пробела; иначе Lua решит, что первая точка — это десятичная точка числа.)
Сегодня мы не уверены, что эти автоматические приведения типов были хорошей идеей в дизайне Lua. Как правило, лучше на них не рассчитывать. Они удобны в некоторых местах; но добавляют сложности как языку, так и программам, которые их используют. В конце концов, строки и числа — это разные вещи, несмотря на все эти преобразования. Сравнение вроде 10="10" дает в результате false, поскольку 10 — это число, а "10" — это строка.
Если вам нужно явно преобразовать строку в число, то вы можете воспользоваться функцией tonumber, которая возвращает nil, если строка не является правильным числом Lua:
line = io.read() -- читает строку n = tonumber(line) -- пытается преобразовать ее в число if n == nil then error(line .. " is not a valid number") else print(n*2) end
Для преобразования числа в строку вы можете использовать функцию tostring или конкатенировать число с пустой строкой: print(tostring(10) == "10") --> true print(10 .. "" == "10") --> true Эти преобразования всегда работают.
Отрывок из книги: Роберту Иерузалимски. «Программирование на языке Lua».
Возможно Вы привыкли, что компилятор вам дает безопасность типов. Но в lua это не так.
Функции onInit, onStop, onClose
Пользователь
Сообщений: Регистрация: 27.01.2017
15.10.2020 13:00:44
Ну и какой тип у a[i][1][1] Вы через message не увидите. Добавьте в вывод хотя бы message(i..": type(a[i][1][1]) "..type(a[i][1][1]))
Функции onInit, onStop, onClose
Пользователь
Сообщений: Регистрация: 27.01.2017
15.10.2020 12:48:08
Я вам говорю не про то, что надо тип индекса менять, приведя его к числу. А про то, что лучше складывать строки со строками, хоть lua и динамический язык. А то что индекс 2 и индекс "2" - это разные вещи, это уже вопрос дизайна. Хотите использовать нечитаемые конструкции типа a[b[1][c[2]]] - пожалуйста.
Функции onInit, onStop, onClose
Пользователь
Сообщений: Регистрация: 27.01.2017
15.10.2020 12:33:09
Возьмите за правило, что при сложении строк надо приводить значения к типу строка. lua умеет динамически преобразовать выражение вид: "a"..5 Но не умеет такое: "a"..nil Зато сможет так: "a"..tostring(nil)
Если у Вас в SP[a[i][1][1]] ничего нет, т.е. nil, то и будет ошибка.
get candle
Пользователь
Сообщений: Регистрация: 27.01.2017
15.10.2020 11:53:37
Кстати, такое поведение возникает и при заказе данных через CreateDataSource. Новый индекс бара уже есть, а время не заполнено. В результате попытка представить время через os.date дает ошибку "time result cannot be represented in this installation". Приходится добавлять проверки.
Более быстрый способ, all_trades
Пользователь
Сообщений: Регистрация: 27.01.2017
13.10.2020 15:00:33
Так, естественно, надо всегда запоминать последний прочитанный индекс. Какой смысл читать повторно, если один раз уже прочитал.
Функции onInit, onStop, onClose
Пользователь
Сообщений: Регистрация: 27.01.2017
13.10.2020 12:03:48
Видимо уже ничего... Смените инструмент на тот, по которому у Вас есть поток данных, раз SRZ0 нет. Но Вам уже разработчики ответили, так что просто добавьте параметры при вызове.
Функции onInit, onStop, onClose
Пользователь
Сообщений: Регистрация: 27.01.2017
13.10.2020 11:46:45
Ну вот Вам простой пример. Для одной ячейки функция вызывается со всеми аргументами, для другой нет
Код
local sec_code = 'SRZ0'
local class_code = 'SPBFUT'
local sleep = _G.sleep
local isRun = true
local t_id = nil
local SeaGreen = _G.RGB(193, 255, 193)
local RosyBrown = _G.RGB(255, 193, 193)
local getParamEx = _G.getParamEx
local GetCell = _G.GetCell
local SetCell = _G.SetCell
local SetColor = _G.SetColor
local ds
local def_c = _G.QTABLE_DEFAULT_COLOR
function _G.OnParam(class, sec)
if isRun and t_id and sec == sec_code and class == class_code then
local last_price = tonumber((getParamEx(class_code, sec_code, 'LAST') or {}).param_value) or 0
local last_vol = tonumber((getParamEx(class_code, sec_code, 'VALTODAY') or {}).param_value) or 0
local lp = GetCell(t_id, 1, 0).value or last_price
SetCell(t_id, 1, 1, tostring(last_vol), last_vol)
SetCell(t_id, 1, 0, tostring(last_price), last_price)
if lp < last_price then
SetColor(t_id, 1, 0, SeaGreen, def_c, SeaGreen, def_c)
SetColor(t_id, 1, 1, SeaGreen, def_c)
elseif lp > last_price then
SetColor(t_id, 1, 0, RosyBrown, def_c, RosyBrown, def_c)
SetColor(t_id, 1, 1, RosyBrown, def_c)
end
end
end
local function CreateTable()
t_id = _G.AllocTable()
_G.AddColumn(t_id, 0, "price", true, _G.QTABLE_DOUBLE_TYPE, 15)
_G.AddColumn(t_id, 1, "vol", true, _G.QTABLE_DOUBLE_TYPE, 15)
_G.CreateWindow(t_id)
_G.SetWindowPos(t_id, 90, 120, 270, 100)
_G.InsertRow(t_id, 1)
end
local function event_callback(_, msg)
if (msg == _G.QTABLE_CLOSE) then
isRun = false
end
end
function _G.OnInit()
CreateTable()
_G.SetTableNotificationCallback(t_id, event_callback)
end
function _G.main()
ds = _G.CreateDataSource(class_code, sec_code, 1)
isRun = ds ~= nil
if ds then
ds:SetEmptyCallback()
end
while isRun and ds do
sleep(500)
end
end
function _G.OnStop()
isRun = false
ds:Close()
ds = nil
if t_id and not _G.IsWindowClosed(t_id) then
_G.DestroyTable(t_id)
end
end
Функции onInit, onStop, onClose
Пользователь
Сообщений: Регистрация: 27.01.2017
13.10.2020 11:17:43
SetColor (iT, 1, 2, 255, 0)
Вы типы параметров этой функции в документации смотрели? 255 - это не цвет. Используйте либо функцию RGB, либо число hue цвета. Плюс надо не забывать передавать цвета выделеннной ячейки.
Более быстрый способ, all_trades
Пользователь
Сообщений: Регистрация: 27.01.2017
13.10.2020 11:11:15
Ну вот Вам пример.Их уже столько на просторах:
Код
---@param class_code string
---@param sec_code string
local function FilterTableLine(class_code, sec_code)
return class_code == Params.CLASS_CODE and
sec_code == Params.SEC_CODE
end
local t1 = SearchItems("all_trades", 0, getNumberOf("all_trades")-1, FilterTableLine, 'class_code,sec_code')
if t1 then
for i = 1, #t1 do
local trade = getItem("all_trades", t1[i])
if trade then
--- Сделать что-то
end
end
end
Более быстрый способ, all_trades
Пользователь
Сообщений: Регистрация: 27.01.2017
12.10.2020 18:51:14
Чтобы что-то ответить надо смотреть в исходники этой библиотеки. Не факт, что она поддерживает все глобальное окружение qlua.
Получение значения индикатора не открывая данных графика
Пользователь
Сообщений: Регистрация: 27.01.2017
12.10.2020 18:46:55
Нет. Так делать нельзя. При этом Вы опять пытаетесь совместить CreateDataSource и getCandlesByIndex. Эти функции предназначены для разных целей.
Получение значения индикатора не открывая данных графика
Пользователь
Сообщений: Регистрация: 27.01.2017
12.10.2020 12:01:41
Функция CreateDataSource заказывает данные баров, не данные индикатора по ним. Его же надо рассчитать. А кто его рассчитает, если график с индикатором не открыт. Если не хотите считать индикатор, то только считывать его с графика, который должен быть открыт. С другой стороны, MACD - это просто две скользящих. Что его считать...
Более быстрый способ, all_trades
Пользователь
Сообщений: Регистрация: 27.01.2017
12.10.2020 11:54:58
Используйте функцию SearchItems, чтобы не получать данные по каждой строке. Это даст уже фильтрованный массив индексов строк по нужному инструменту.
Далее, не надо использовать table.insert. Если необходимо просто увеличивать массив, то быстрее будет сделать как t[#t+1] = value.
Так Вы просто добавляете в конец массива новый элемент.
Кто как решил вопрос уведомления о сделках?
Пользователь
Сообщений: Регистрация: 27.01.2017
10.10.2020 17:00:20
Передача данных быстрая, да. А вот подключение...
Вот чистый lua, библиотека socket, никакого ssl, никакого Квика.
clock 0.007 Attempting connection to host 'localhost' and port 8005... clock 2.06 Connected! clock 2.06 strin = test clock 2.06 End
Не было желания постоянно держать открытое соединение.
Предложение к разработчикам
Пользователь
Сообщений: Регистрация: 27.01.2017
10.10.2020 09:59:51
Те, кто совершают такие сделки, да и большинство других "денег" не пользуются терминалом Квик. Да и зачем, если можно встать в стойку у ядра биржи.
Для всех есть регламент подачи заявок. Там и ограничения прописаны. Хочешь много - плати. И платят.
Как раз физ. лица часто просят добавить задержки в скрипты, чтобы их алгоритм не пытался бороться с заведомо более быстрыми алгоритмами, иначе приходит счет за чрезмерную активность.
Предложение к разработчикам
Пользователь
Сообщений: Регистрация: 27.01.2017
09.10.2020 20:14:41
Владимир, Вас опять куда-то в сторону уводит. Причем здесь разработчики терминала. Биржа, как и ее электронная площадка - это место и для спекулянтов, и для инвесторов, и для физ. лиц., и для юр. лиц и т.д.
Правила устанавливает частная коммерческая организация ПАО Мосбиржа или NASDAQ, или другая, под контролем соответствующих контролирующих органов, например SEC.
Возможно Вы только недавно для себя открыли этот новый мир, но он уже давно существует в таком виде.
Возможно ли запустить в индикаторе функцию из dll которая подключается в другом lua-скрипте?
Пользователь
Сообщений: Регистрация: 27.01.2017
08.10.2020 19:31:38
Вот пример такого решения, библиотека lua_share.
Кто как решил вопрос уведомления о сделках?
Пользователь
Сообщений: Регистрация: 27.01.2017
08.10.2020 19:03:44
Сделал небольшое решение для отправки сообщений в чат бота телеграма (Telrgram Bot Api).
Основа - это некое C# консольное приложение (многопоточный сервер), принимающее данные от lua скрипта и отправляющее уже сообщения в чат телеграм. Я предпочитаю делать так, дабы не связываться с проблемами совместимости библиотек lua.
Сначала сделал передачу данных на внутренний сервер через сокеты, но медленно оказалось. Переделал на Named Pipes, быстрее намного. Пришлось написать библиотеку Named Pipe клиента для lua.
Пока сделал только отправку сообщений, т.к. это самая частая просьба.
неужели OnParam самый быстрый?
Пользователь
Сообщений: Регистрация: 27.01.2017
05.10.2020 10:21:50
Вот я и не знаю. Лога получения нет, пытаюсь смоделировать. Надо ждать сильных движений а рынке, чтобы брокеры нагрузились. Может и у меня проблема, но эта часть кода уже столько времени работает...
Написал тестовый скрипт, чтобы отловить это. Раз было сказано, что TIME соответствует LAST, то, по идее, время не может стать меньше. Если поймается ошибка, то будет очевидно где проблема.
неужели OnParam самый быстрый?
Пользователь
Сообщений: Регистрация: 27.01.2017
05.10.2020 09:42:54
Да, конечно, OnParam это просто сигнал. Котировка получается через параметр LAST внутри колбека. Я не добавлял логирование в этом месте, по понятным причинам. Но реакция на значение была отмечена в другом месте.
Долгое исполнение сделки, Сделка на демо счете отработала более чем за 30 сек.
Пользователь
Сообщений: Регистрация: 27.01.2017
02.10.2020 13:48:57
Цитата
Олег написал: Идея хорошая, а можно показать краткий пример?
Это сложный вопрос. В самом lua нет многопоточности, поэтому надо организовать некие сущности, хранящие состояния и ждущие ответа. Проще всего это сделать на хеш-таблицах, т.е. на обычных таблицах.
Вы можете при подаче транзакции записать данные в некую таблицу по ключу, допустим код инструмента + номер транзакции. А далее организовать ожидание когда в этой таблице появится ответная информация. Ответ может туда записаться, в частности колбеком, или сами, опрашивая сделки, ордера, запишете.
Как только ответ получен, делаете что-то дальше. Нет ответа - пропускаете этот инструмент, ждете дальше. Тогда вы не будете зависеть от того как приходят ответы. В какие-то дни быстро, в какие-то очень медленно. Бывало до 10 минут доходило. Вы не можете предсказать когда он придет, поэтому и не можете поставить некое значение переменной ожидания в простом цикле. Как организовать ожидание, и саму подачу транзакции, здесь уже как удобнее. Можно через corutine, запуская их и проверяя в них состояние транзакции. Если нет ответа приостанавливаете ее и переходите к следующей.
Можно самому сделать некую сущность "Задача" и периодически опрашивая пул текущих задач, закрывать завершенные. А можно просто сделать таблицу транзакций, опрашивать ее и проверять состояние самой транзакции (допустим, записанное колбеком onTransReply), ордера, записанное другим колбеком и т.д.
Как прочитать таблицу Текущие торги?
Пользователь
Сообщений: Регистрация: 27.01.2017
02.10.2020 10:16:32
Имелось в виду, наверно, что функция loadstring вернет функцию, которую надо выполнить, т.е. вызвать через ().
Долгое исполнение сделки, Сделка на демо счете отработала более чем за 30 сек.
Пользователь
Сообщений: Регистрация: 27.01.2017
02.10.2020 10:10:21
Как правильно заметил Anton, сначала надо определиться что за заявку отправляете. Если цена "рыночная", то да, можно ожидать исполнения.
Что касается ожиданий, здесь вопрос организации этих циклов. Корректно не делать их в колбеках. Т.е. отправил транзакцию из main, там же циклы. А колбеки - это просто семафоры, что есть что-то. Также советую не делать циклы ожидания на транзакции. Если, допустим, скрипт работает с несколькими инструментами, то пока Вы ждете по одному, другие не смогут свои сигналы отработать. Лучше сделать так, чтобы ответный сигнал вызывал реакцию, но не простой всего алгоритма. Т.е. пока идет сигнал можно было бы выполнять что-то другое.
Долгое исполнение сделки, Сделка на демо счете отработала более чем за 30 сек.
Пользователь
Сообщений: Регистрация: 27.01.2017
02.10.2020 09:36:23
Зависит от схемы написания Вашего скрипта. Можете использовать колбек, как сигнал, что сделка прошла. Можете, наоборот, сами читать таблицу сделок, запоминая, допустим, последний индекс, для уменьшения последующих выборок.
Что касается времени срабатывания, то здесь нет понятия "нормально". Можно было бы сказать среднеожидаемое, и оно, действительно, будет небольшим, до 1 сек. Но сервер брокера может быть загружен, канал связи может плохим и т.д. Так что время может вырастать до минут.
Впрочем, еще есть один вариант, что некорректно производится ожидание сигнала, допустим, цикл ожидания в колбеке.
Как прочитать таблицу Текущие торги?
Пользователь
Сообщений: Регистрация: 27.01.2017
02.10.2020 09:28:13
И да, loadstring помимо того, что медленная, еще depricated.
Как прочитать таблицу Текущие торги?
Пользователь
Сообщений: Регистрация: 27.01.2017
02.10.2020 09:25:30
Странно... Ну да ладно. assert в С появился так давно, что даже не помню. В 90-х уже был.
А что касается документации, то:
Роботы всякие и прочие глупости
Пользователь
Сообщений: Регистрация: 27.01.2017
30.09.2020 19:17:11
Зачем спорить, тем более что аргументы как в детском саду. Это был просто пример. Пишите дальше. Для себя. Единственно что, хотелось бы на данном форуме не видеть комментариев не по теме.
Роботы всякие и прочие глупости
Пользователь
Сообщений: Регистрация: 27.01.2017
30.09.2020 18:39:55
Наговорили...
Владимир, года при выполнении такой простой команды getSecurityInfo('TQBR', 'SBER') получите nil, хотя у Вас будет подписка на поток данных по этому инструменту, то, возможно, вернетесь к этому вопросу.
неужели OnParam самый быстрый?
Пользователь
Сообщений: Регистрация: 27.01.2017
30.09.2020 10:51:27
То что обезличенные сделки будут самыми надежными это понятно.
Но все же, параметры TIME и LAST синхронизированы? Т.е. если мне брокер прислал в колбеке цену по времени пол часа назад, то параметр TIME укажет это?
неужели OnParam самый быстрый?
Пользователь
Сообщений: Регистрация: 27.01.2017
30.09.2020 09:41:04
Я не очень понимаю, что Вы так зацепились к этому времени, что в каждой теме призываете его синхронизировать. Мне не надо измерять реакцию колбека. Мне просто надо узнать диапазон колебания цены за квант времени. Т.е. начал измерять в реальном времени и закончил. Что там было в прошлом не интересует. Проще всего это сделать с OnParam и колбеком DataSource. Запоминаешь цены, сбрасываешь, когда данные не нужны.
Но если OnParam выдает неактуальные данные, то их надо либо фильтровать, либо не использовать этот колбек. Вот и возникает вопрос фильтрации по времени, если пришли данные из прошлого, то пропустить их.
А AllTrades - самый затратный вариант, хоть и более надежный т.к. у него время есть в потоке данных. Но не у всех включен поток обезличенных сделок. Если заказываем через Тиковые данные, приходят долго. После каждого разрыва связи и при новом заказе надо ждать пока придет последняя сделка, а это тоже долго. Плюс некоторые брокеры вообще не дают этот поток пока не позвонишь в поддержку.
Колбек DataSource самый медленный, возможны пропуски данных.
неужели OnParam самый быстрый?
Пользователь
Сообщений: Регистрация: 27.01.2017
29.09.2020 19:19:57
Подниму старое. Сегодня брокер выдал в OnParam по фьючерсу RIZ0 цену последней сделки из прошлого. В 17.37 цена была одна, а колбек выдал цену где-то на пол часа назад, очень далекую от текущей.
Вопрос: поможет ли как-то время последней сделки в этот же момент в колбеке. Т.е. будет ли время сделки TIME соответствовать тому, что получается из параметра LAST?
Уж очень не хочется переходить на обезличенные, тем более, что там порядок сделок тоже не соблюдается иногда.
Ошибка при считывании таблицы текущих торгов
Пользователь
Сообщений: Регистрация: 27.01.2017
28.09.2020 12:02:05
Если не включена трансляция параметра, то метод вернет nil вместо таблицы. Надо проверить, что трансляция включена, либо проверить что вернулась таблица. Уже обсуждалось
Преобразование целого числа в строку в QUIK 8.8+
Пользователь
Сообщений: Регистрация: 27.01.2017
24.09.2020 16:25:57
Не зачем, наверно. Но если использовать единый подход для форматирования, то он должен быть единым.
С другой стороны, не очень понятно зачем вообще применять форматирование для чисел типа integer. tostring итак их выводит корректно. Если только вы не гарантируете тип integer для номера заявки. Но тогда это будет уже другой разговор.
Касательно предложения в 10 вопросе tostring(math.tointeger(x) or x), попробуйте данное решение на числе tostring(math.tointeger(1.16*100) or 1.16*100) Увидите, что не работает.
Грядущие изменения на срочном рынке МБ: поддержка работы с 19-значными номерами заявок и сделок
Пользователь
Сообщений: Регистрация: 27.01.2017
24.09.2020 14:09:09
Интересно, а как же тогда демо счет брокера Финам получает 19 знаков. Хотелось бы иметь полноценный тестовый контур.
Грядущие изменения на срочном рынке МБ: поддержка работы с 19-значными номерами заявок и сделок
Пользователь
Сообщений: Регистрация: 27.01.2017
24.09.2020 12:50:46
Добрый день. В одном из сообщений было сказано, что ваш тестовый контур срочной секции транслируется биржей. Когда на нем появятся 19 знаков? А то как-то странно получается.
Перестали скачиваться тиковые данные
Пользователь
Сообщений: Регистрация: 27.01.2017
23.09.2020 12:32:02
Не замечал такой проблемы на этой версии. Единственное что, я не останавливаю поток через sleep. После заказа идет возврат в main и периодически проверяется все ли данные загружены. Приходят долго, но приходят.
Quik 8.6 Critical error ACCESS_VIOLATION
Пользователь
Сообщений: Регистрация: 27.01.2017
23.09.2020 09:34:19
Нет, не в колбеках.
Вот схематичный скрипт, падающий с этой ошибкой.
Код
local sleep = _G.sleep
local isRun = true
function _G.main()
local sec_code = 'SRZ0'
local class_code = 'SPBFUT'
local ds = _G.CreateDataSource(class_code, sec_code, _G.INTERVAL_M5)
if not ds then
isRun = false
end
local index = 0
if isRun then
while isRun do
local last = ds:Size()
if last ~= 0 then
while index < last-1 do
index = index + 1
ds:T(index)
end
ds:Close(last)
ds:T(last)
end
sleep(100)
end
end
end
Он с ошибкой, как у меня было (Close вместо C). Но хотелось бы внятного сообщения, типа - попытка индексировать значение nil.
И еще особенность: скрипт, упавший с этой ошибкой повторно не запустить, кнопка "Запустить" не активна. Приходится удалять и заново добавлять.
Quik 8.6 Critical error ACCESS_VIOLATION
Пользователь
Сообщений: Регистрация: 27.01.2017
21.09.2020 14:35:31
Отмена тревоги. В одном месте была ошибка вызова. Вместо ds:C() вызвано ds:Close().
Quik 8.6 Critical error ACCESS_VIOLATION
Пользователь
Сообщений: Регистрация: 27.01.2017
21.09.2020 12:46:11
Сегодня тоже первый раз (за все время использования версий > 8.5) словил такую ошибку на 8.8.4.3.
При этом это не тики, а M5, и произошла она на уже загруженных данных. Т.е. это была новая порция, скорее всего. Индекс бара фиксируется в переменной перед чтением.
Скрипт упал, хотя часть кода работы с свечками обернута pcall.
С другой стороны, никакой доп. информации нет, поэтому пока могу предположить, что это именно доступ к барам, как и в примере выше. Но кто знает, что это было на самом деле. Хотелось бы, конечно, чтобы секции pcall давали больше информации.
Использование памяти скриптами Lua
Пользователь
Сообщений: Регистрация: 27.01.2017
17.09.2020 16:07:56
Это безумно много. Если только Вы не храните в таблицах обезличенные сделки или некие расчеты на огромное число ключей. Но даже с этим больше 50-100 мб. это явно где-то утечка. Возможно часто получаются данные произвольных таблиц.
Я на > 8.5 версиях больше 70 мб. не получал. При 20 мб. я уже начинаю отлаживать и исправлять утечки памяти или оптимизировать код.
Зависание QUIK
Пользователь
Сообщений: Регистрация: 27.01.2017
17.09.2020 15:57:51
А почему она там должна выскочить? Если колбек выполняется, то там 1, а если висит основной поток, то, по идее, колбек не выполнится. Либо, можно предположить, что после "отвисания" он просто вызовет все колбеки в очереди. Последовательно.
Преобразование целого числа в строку в QUIK 8.8+
Пользователь
Сообщений: Регистрация: 27.01.2017
15.09.2020 16:25:47
Только сейчас увидел, что Вы пытаетесь сделать. lua не может преобразовать double с таким числом цифр как 9152336732254970146.0
4-ое издание Programming in Lua, глава 4 ()
For floating-point numbers, Standard Lua uses double precision. It represents each number with 64 bits, 11of which are used for the exponent. Double-precision floating-point numbers can represent numbers withroughly 16 significant decimal digits, in a range from -10308 to 10308. (Small Lua uses single-precisionfloats, with 32 bits. In this case, the range is from -1038 to 1038, with roughly seven significant decimaldigits.)
Any integer up to 2^53 (which is 9007199254740992) has an exact representation as a double-precisionfloating-point number. Integers with larger absolute values may lose precision when converted to a float.
Поэтому если число имеет тип math.type = integer, то до 2^53 (9007199254740992) нет проблем представления. А если это уже double, то его не будет.
Преобразование целого числа в строку в QUIK 8.8+
Пользователь
Сообщений: Регистрация: 27.01.2017
15.09.2020 12:43:04
Попробуйте использовать паттерн "%.0f".
Отладка QUIK 8.8
Пользователь
Сообщений: Регистрация: 27.01.2017
15.09.2020 12:34:02
Цитата
TGB написал: - ссылка на мою тестовую программу (с кодами и инструкцией по ее запуску). Старая ссылка удалена. При запуске этой программы дампы возникают быстро (у меня в течении 5 минут), но в произвольные моменты. Эта же программа (с dll оттранслированными для Lua 5.1) непрерывно (месяцами) без проблем работает во всех версиях QUIK < 8.5. Одна из функций данной программы, которая включена сейчас по умолчанию, это тестирование автоматического управления памятью в QLua. Особенностью теста является высокая нагрузка (1500 обращений в секунду) на управление автоматической памятью QLua в условиях многопоточности. Можете также посмотреть обсуждение по ссылке , начиная с комментария № 145.
А Ваше решение только под qlua? Тесты на vanilla lua 5.3 не пробовали запускать? Тогда бы было понятно, что проблема именно в реализации qlua.
Использование памяти скриптами Lua
Пользователь
Сообщений: Регистрация: 27.01.2017
15.09.2020 12:29:03
Еще больший расход памяти будет если объявить локальную переменную и в нее записывать полученный результат. Память тратится как раз на хранение текущих и промежуточных данных. Каждый раз получая данные с сервера, их надо хранить. В вашем примере переменная глобальная, но ее бы стоило инициализировать ранее, чтобы под нее была выделена память.
А сбрасывается память при автоматическом запуске garbage collector. При этом очищается "мусор", т.е. выделенная память под локальные переменные (неиспользуемые ключи таблиц и т.д.), которые уже не нужны. Вы также можете вручную запустить collectgarbage, но разработчики не советуют это делать.
Не пойму, где ошибка.
Пользователь
Сообщений: Регистрация: 27.01.2017
28.08.2020 10:28:09
Без полного кода сложно будет получить ответ. Где часть кода создания таблицы и ее колонок?