Необходимо каждый день находить код обновляемого инструмента. Из данных имеется только лишь его префикс от короткого имени. Обычно делается следующим кодом:
Код
function findSecurity()
local mdt = 0
local now = os.time()
local foundcode = ""
for i = 0,getNumberOf("SECURITIES") - 1 do
local row = getItem("SECURITIES", i)
if(row.class_code == "PSAU") and (autolib.CheckAssetName(row.short_name) == true) then
--message(row.short_name)
local info = getSecurityInfo(row.class_code, row.code)
if info ~= nil then
local expdt = strDateToEpoch(info.mat_date)
--message(tostring(info) .. " " .. tostring(expdt) .. " " .. tostring(now))
if expdt > mdt and expdt > now then
mdt = info.mat_date
foundcode = row.code
--message(tostring(info.mat_date) )
end
end
end
end
if foundcode ~= "" then
autobuyerlib.LogU8(string.format("Найден инструмент %s", foundcode))
end
end
Проблема в том, что часто (процентов 20% случаев) запуск кода дает ошибку ACCESS VIOLATION. Есть ли иной способ решить задачу?
Виталий написал: Необходимо каждый день находить код обновляемого инструмента. Из данных имеется только лишь его префикс от короткого имени. Обычно делается следующим кодом:
Код
function findSecurity ()
local mdt = 0
local now = os.time ()
local foundcode = ""
for i = 0 , getNumberOf ( "SECURITIES" ) - 1 do
local row = getItem ( "SECURITIES" , i)
if (row.class_code = = "PSAU" ) and ( autolib.CheckAssetName (row.short_name) = = true ) then
--message(row.short_name)
local info = getSecurityInfo (row.class_code, row.code)
if info ~ = nil then
local expdt = strDateToEpoch(info.mat_date)
--message(tostring(info) .. " " .. tostring(expdt) .. " " .. tostring(now))
if expdt > mdt and expdt > now then
mdt = info.mat_date
foundcode = row.code
--message(tostring(info.mat_date) )
end
end
end
end
if foundcode ~ = "" then
autobuyerlib.LogU8 ( string.format ( "Найден инструмент %s" , foundcode))
end
end
Проблема в том, что часто (процентов 20% случаев) запуск кода дает ошибку ACCESS VIOLATION. Есть ли иной способ решить задачу?
Проще надо быть, зачем такой огород городить то?
Код
local sec_list=getClassSecurities(class_code)
for test_sec_code in string.gmatch(sec_list,"("..pref.."[^,]+)") do
-- в test_sec_code инструмент с нужным префиксом, далее ищите по mat_date нужный вам, мне лень писать
end
s_mike@rambler.ru написал: Access violation - это проблема внешней библиотеки или неправильная работа с потоками qlua. Других вариантов не вилится
Я переделал код, сократив количество запросов через getClassSecurities, и терминал начал падать именно на некоторых запросах getSecurityInfo. Причем разных и рандомно.
Код
function CustomGetSecurityInfo(msg)
local class_code = msg["class_code"]
local sec_code = msg["code"]
utils.dprint("Get info "..class_code.." "..sec_code)
local res = getSecurityInfo (class_code, sec_code)
utils.dprint("Got info")
local r = {}
r["jstring"] = json.encode(res)
return r
end
В отладчике видно, что параметры правильные поступают, но терминал валится до появления строки "Got Info"
[5504] Get info PSAU RU000A0ZZXZ7
Терминал на этом месте падает. Причем на аналогичных предыдущих запросах функция возвращает необходимые данные.
Можно ли отсюда как-то разработчикам сообщить, или новую тему создавать надо?
Виталий написал: Все заработало как следует - терминал перестал падать.
Вы в какой версии Quik работаете? При выкладывании ошибок надо указывать версию QUIK, в которой эта ошибка возникает.
Думаю, уже неактуально. Причину выяснил. Это ascii кодировка некоторых данных в таблице getSecurityInfo и модуль json. Я добавил перекодировку в utf8 и все заработало стабильно и как следует.