Поиск инструмента по названию

Страницы: 1
RSS
Поиск инструмента по названию
 
Необходимо каждый день находить код обновляемого инструмента. Из данных имеется только лишь его префикс от короткого имени. Обычно делается следующим кодом:
Код
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. Есть ли иной способ решить задачу?
 
Цитата
Виталий написал:
autolib.CheckAssetName(row.short_name)
Вероятнее всего проблема там
 
Скорее всего нет - там примитивная функция проверки строки на подстроку и ОБЫЧНО она работает как следует. Попробую через searchitems поискать.
 
Access violation - это проблема внешней библиотеки или неправильная работа  с потоками qlua. Других вариантов не вилится
 
Цитата
s_mike@rambler.ru написал:
Access violation - это проблема внешней библиотеки или неправильная работа  с потоками qlua. Других вариантов не вилится
Хорошо, тогда там попробую поискать. Спасибо.
 
Цитата
Виталий написал:
Необходимо каждый день находить код обновляемого инструмента. Из данных имеется только лишь его префикс от короткого имени. Обычно делается следующим кодом:
Код
   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

Терминал на этом месте падает. Причем на аналогичных предыдущих запросах функция возвращает необходимые данные.

Можно ли отсюда как-то разработчикам сообщить, или новую тему создавать надо?

 
UPD а вообще в любом месте падает и до получения данных и после...По разному.
 
Убрал строку
Код
r["jstring"] = json.encode(res)

Все заработало как следует - терминал перестал падать.
 
Цитата
Виталий написал:
Все заработало как следует - терминал перестал падать.
  Вы в какой версии Quik работаете?  При выкладывании ошибок надо указывать версию QUIK, в которой эта ошибка возникает.
 
Цитата
TGB написал:
Цитата
Виталий написал:
Все заработало как следует - терминал перестал падать.
   Вы в какой версии Quik работаете?  При выкладывании ошибок надо указывать версию QUIK, в которой эта ошибка возникает.
Думаю, уже неактуально. Причину выяснил. Это ascii кодировка некоторых данных в таблице getSecurityInfo и модуль json. Я добавил перекодировку в utf8 и все заработало стабильно и как следует.
Страницы: 1
Читают тему (гостей: 1)
Наверх