Ошибка при запуске Луа-скрипта

Страницы: 1
RSS
Ошибка при запуске Луа-скрипта
 
Винда семёрка, Установлен свежий LuaForWindows на диск С. Квик обновлен до последней версии у брокера 6.16.1.15
 
Здравствуйте,
Lua не может найти модуль
попробуйте указать путь к папке с ним в переменной package.cpath
 
самое интересное, что если удалить скрипт из списка и опять добавить - то, всё находится без проблем:)
 
sam063rus пишет:
Цитата
самое интересное, что если удалить скрипт из списка и опять добавить - то, всё находится без проблем
Самое интересное в том что если путь не указан то файл ищется по относительному пути. и так как при первом запуске он правильный то все работает.
Но как только путь где-либо поменять (например открыть другой скрипт из другой папки), то первый теряет свою папку и после перезапуска уже не запускается. Но как только Вы его удалите и добавите снова, то путь восстановится.
Решение уже было озвучено. Надо явно указать путь к модулю.
 
У меня та же проблема. При изменении каталога скрипт уже не запускается.

Вот структура каталогов:
Код
f:\Programming\lua\cs\ 
   .\socket\core.dll 
   .\libzmq-v100-mt.dll  
   .\zmq.dll 
   .\cSd.lua 
   .\helper.lua 
   .\queue.lua

Вот скрипт cSd.lua который запускаю
Код
local pd = ';F:\\Programming\\lua\\cs'

package.cpath = package.cpath .. pd .. pd..'\\?.dll' ..pd..'\\?\\?.dll'
package.path = package.path .. pd .. pd..'\\?.lua'

message('package.cpath  '..package.cpath)
message('package.path  '..package.path)
message('getScriptPath()  '..  getScriptPath())

local helper = require("helper")
local queue = require("queue")
local zmq = require("zmq")
local socket = require("socket.core")

function main()
  message('cs' .. " starting.")
  message('cs' .. " stopping.")
end

Добавляем запускаем скрипт. Все ок.
Вот вывод скрипта.
Код
package.cpath  .\?.dll;C:\Program Files\quik_47517\?.dll;C:\Program Files\quik_47517\loadall.dll;F:\Programming\lua\cs;F:\Programming\lua\cs\?.dll;F:\Programming\lua\cs\?\?.dll
package.path  ;.\?.lua;C:\Program Files\quik_47517\lua\?.lua;C:\Program Files\quik_47517\lua\?\init.lua;C:\Program Files\quik_47517\?.lua;C:\Program Files\quik_47517\?\init.lua;C:\Program Files\Lua\5.1\lua\?.luac;F:\Programming\lua\cs;F:\Programming\lua\cs\?.lua  
getScriptPath()  F:\Programming\lua\cs 
cs starting. 
cs stopping.

Но стоит сменить каталог(запустить любой другой скрипт не из f: \Programming\lua\cs\) и снова запустить скрипт cSd.lua
тут же получаем ошибку. error loading module 'zmq' from file 'F  :\  Programming\lua\cs\zmq.dll': Не найден указанный модуль.

И вывод скрипта при запуске с ошибкой
Код
package.cpath .\?.dll;C:\Program Files\quik_47517\?.dll;C:\Program Files\quik_47517\loadall.dll;F:\Programming\lua\cs;F:\Programming\lua\cs\?.dll;F:\Programming\lua\cs\?\?.dll 
package.path  ;.\?.lua;C:\Program Files\quik_47517\lua\?.lua;C:\Program Files\quik_47517\lua\?\init.lua;C:\Program Files\quik_47517\?.lua;C:\Program Files\quik_47517\?\init.lua;C:\Program Files\Lua\5.1\lua\?.luac;F:\Programming\lua\cs;F:\Programming\lua\cs\?.lua 
getScriptPath()  F:\Programming\lua\cs 
error loading module 'zmq' from file 'F:\Programming\lua\cs\zmq.dll': Не найден указанный модуль.

Версия QUIK 6.16.1.15

Подскажите плиз где ошибка?
 
Цитата
Sergey Gorokhov пишет:
Надо явно указать путь к модулю
куда уж явней - когда в элементе диалогбокса - мы явно указываем строчку запускаемого скрипта?
это Ваш косяк - признайте и исправьте это.
 
Цитата
sam063rus пишет:
Цитата
Sergey Gorokhov пишет:
Надо явно указать путь к модулю
куда уж явней - когда в элементе диалогбокса - мы явно указываем строчку запускаемого скрипта?
это Ваш косяк - признайте и исправьте это.
В чем конкретно по Вашему мнению ошибка?
 
Цитата
Sergey Gorokhov пишет:
Но как только путь где-либо поменять (например открыть другой скрипт из другой папки), то первый теряет свою папку и после перезапуска уже не запускается.
включаю квик, никаких других путей/открытых файлов/скриптов - НЕТ. возникает ошибка. алгоритм действий - отправить файл для анализа в арку->получить ответ, что у них это не воспроизводится->технично похерить тему.
 
Цитата
sam063rus пишет:
Цитата
Sergey Gorokhov пишет:
Но как только путь где-либо поменять (например открыть другой скрипт из другой папки), то первый теряет свою папку и после перезапуска уже не запускается.
включаю квик, никаких других путей/открытых файлов/скриптов - НЕТ. возникает ошибка. алгоритм действий - отправить файл для анализа в арку->получить ответ, что у них это не воспроизводится->технично похерить тему.
То что у нас проблема не воспроизводится, не значит что мы ее закрыли.
Это значит что у нас не достаточно информации для определения причин сбоя.
Это могут быть какие-либо нюансы, которые Вы не указали, но они приводят к проблеме (может использование любимого Вами IDA Pro?)
А также просьба (пока еще) сдерживать эмоции и общаться культурно.
 
Цитата
Sergey Gorokhov пишет:
любимого Вами IDA Pro
:)))))))))))))))))))))))а я нигде не сказал, что я его использую. это всё Ваши мысли:))))))))))))))))))))))))
 
Цитата
sam063rus пишет:
))))))))))))))))))))))а я нигде не сказал, что я его использую. это всё Ваши мысли )))))))))))))))))))))))
Я не в курсе обстоятельств озвученной проблемы. Поэтому если не затруднит, уточните тему письма которое писали или дайте ссылку где Вы описывали суть проблемы.
 
Прошу прощения! А мое сообщение ктонить прокомментирует? Это мой косяк или все же разработчики подтвердят что косяк гдето на их стороне и я буду ждать фикс?
 
Цитата
asteroid пишет:
Прошу прощения! А мое сообщение ктонить прокомментирует? Это мой косяк или все же разработчики подтвердят что косяк гдето на их стороне и я буду ждать фикс?
Если исключить из кода строку
Код
local zmq = require("zmq") 
то ошибка не воспроизводится.
 
Цитата
asteroid пишет:
Цитата
asteroid пишет:
Прошу прощения! А мое сообщение ктонить прокомментирует? Это мой косяк или все же разработчики подтвердят что косяк гдето на их стороне и я буду ждать фикс?
Если исключить из кода строку
Код
 local zmq = require("zmq") 
 
то ошибка не воспроизводится.
Добрый день.
Наших "косяков" тут нет.
Попробуйте воспользоваться функцией getScriptPath()

Код
gPath = do_smth_with_path(getScriptPath())  -- настраиваете пути как Вам надо относительно скрипта
package.cpath = gPath .. "\\?.dll;" .. package.cpath 
package.path = gPath .. "\\?.lua;" .. package.path 
 
Michael Bulychev, я вроде так и делаю. Нет?
 
Цитата
asteroid пишет:
Michael Bulychev , я вроде так и делаю. Нет?
zmq.dll какие функции экспортирует?
 
Цитата
Michael Bulychev пишет:
Цитата
asteroid пишет:
Michael Bulychev , я вроде так и делаю. Нет?
zmq.dll какие функции экспортирует?
Там много функций.
Кажется удалось локализовать проблему.
Сама zmq.dll обращается к .\libzmq-v100-mt.dll, но ищет ее не package.cpath или package.path, а в директории из которой вызывается lua интерпретатор(в нашем случае это каталог с info.exe) или там где лежит lua.exe если установлен в системе(C: \Program Files\Lua\5.1\).
Скопировав libzmq-v100-mt.dll в директорию с квиком удалось решить проблемы. Но это конечно не очень красиво.
Может подскажите как решить вопрос более изящно, чтобы не засорять папку с квиком разного рода дллками?
 
Ну вот опять.
Скопировал на чистую машину Quik, скрипты с необходимыми библиотеками и ZeroBrain Studio (ide для луа)
В скриптах поменял все пути на адекватные.
Запускаю скрипт в квике получаю ошибку:
error loading module 'zmq' from file 'C:\projects\lua\cs\zmq.dll':
Не найден указанный модуль.

Запускаю этот же скрипт в  ZeroBrain Studio все ок.
Уважаемые разработчики, помогите разобраться. Может быть гденить какието переменные среды прописать или еще чтото.
От чего зависит найдет qlua путь к либе или не найдет?
 
Цитата
asteroid пишет:
В скриптах поменял все пути на адекватные.
Как и в прошлый раз, не факт что проблема в lua.
Проверьте все библиотеки и модули
 
Добрый день.
Откуда Вы скачали zmq.dll?
 
https://github.com/downloads/Neopallium/lua-zmq/luajit2.0_beta11_zmq2.2_llthreads.zip


Там в архиве в папке bin лежат zmq.dll и libzmq-v100-mt.dll
 
Все!
Оказывается еще нужны правильные lua51.dll и lua5.1.dll в папке с квиком.
Два дня убил))
Спасибо.
 
Если я правильно понял, то эта реализация для LuaJIT, и библиотека lua5.1 собраны для нее

Сомневаюсь что все это взлетит в терминале, особенно если там есть еще какие-либо модули.
А lua5.1.dll, которая идет в комплекте с терминалом, является прокси библиотекой для qlua.dll
 
А чем грозит замена  
Цитата
Michael Bulychev пишет:
А lua5.1.dll, которая идет в комплекте с терминалом, является прокси библиотекой для qlua.dll
на другую lua5.1.dll
 
Кстати, я папку с квиком закинул lua51.dll и lua5.1.dll которые идут в поставке с обычным луа.
 
Потенциально это приводит к падениям терминала. Часть кода будет работать в qlua.dll, часть в lua51.dll
 
Michael Bulychev, еще вопрос. А почему dependency walker не показывает зависимость квиковской lua5.1.dll не показывает зависимость от qlua.dll
 
Вот вроде нашел  на github и таки  рабочий вариант

Код
package.cpath = package.cpath .. ";" .. getScriptPath() .. [[\?51.dll]]
--require"QL"
require"zmq"
local json=require("dkjson")
--require"zhelpers"
is_run=false
itosend={}
postosend={}
new_postosend={}
acctosend={}
filter_acc=''
instruments={}
accounts={}
positions={}
positions_keys={}
--accounts_list=""
publisher_binding="tcp://10.1.1.108:5563"
subscriber_binding="tcp://10.1.1.108:5562"
accounts_keys={}
is_connected=false
local sfind=string.find
FUT_OPT_CLASSES="FUTUX,SPBFUT,OPTUX,SPBOPT"


function OnParam(class,sec)
   if is_run and is_connected and (class=='SPBFUT' or class=='FUTUX' or class=='OPTUX' or class=='SPBOPT') then
      --local st=os.clock()
      -- or class=='OPTUX' class=='SPBOPT' or 
      local i=instruments[sec].Dynamic
      i.LastPrice=tonumber(getParamEx(class,sec,"Last").param_value)
      i.Volatility=tonumber(getParamEx(class,sec,"Volatility").param_value)
      i.TheorPrice=tonumber(getParamEx(class,sec,"theorprice").param_value)
      i.Bid=tonumber(getParamEx(class,sec,'BID').param_value)
      i.Ask=tonumber(getParamEx(class,sec,'OFFER').param_value)
      i.BidVol=tonumber(getParamEx(class,sec,'BIDDEPTH').param_value)
      i.AskVol=tonumber(getParamEx(class,sec,'OFFERDEPTH').param_value)
      if class=='FUTUX' or class=='SPBFUT' then
         i.SettlePrice=tonumber(getParamEx(class,sec,'settleprice').param_value)
      else
         i.SettlePrice=tonumber(getParamEx(instruments[sec].Static.BaseContractClass,static.BaseContract,'last').param_value)
      end
      itosend[#itosend+1]=json.encode(i)
      --[[if instruments[sec]==nil then message("nil "..sec,3) return end
      --if pr~=i.LastPrice or volat~=i.Volatility or theorpr~=i.TheorPrice then
         --table.insert(tosend,tostring(sec.."="..pr))
         
         --message('sended',1)
         --publisher:send(sec..' Last='..pr)
         --..' Volat='..volat..' TheorPrice='..theorpr
         i.LastPrice=pr
         i.Volatility=volat
         i.TheorPrice=theorpr
      end
      ]]
      --message("time="..(os.clock()-st),3)
   end
end

function OnFuturesClientHolding(hold)
   if is_run and is_connected and hold~=nil and (filter_acc=='' or string.find(filter_acc,hold.trdaccid)~=nil) then
      --toLog(log,'New holding update')
      --table.insert(acctosend,jsonhold)
      local key=positions_keys[hold.trdaccid..hold.sec_code]
      if key==nil then
         positions[#positions+1]={
         ['AccountName']=hold.trdaccid,
         ['SecurityCode']=hold.sec_code,
         ['TotalNet']=hold.totalnet,
         ['BuyQty']=hold.openbuys,
         ['SellQty']=hold.opensells,
         ['VarMargin']=hold.varmargin
         }
         positions_keys[hold.trdaccid..hold.sec_code]=#positions
         new_postosend[#new_postosend+1]=json.encode(positions[#positions])
      else
         local t=positions[key]
         t.TotalNet=hold.totalnet
         t.BuyQty=hold.openbuys
         t.SellQty=hold.opensells
         t.VarMargin=hold.varmargin
         postosend[#postosend+1]=json.encode(t)
      end
   end
end

function OnStop()
   is_run=false
   --publisher:close()
   --context:term()
end

function OnInitDo()
   --context=zmq.init(1)
   --publisher=context:socket(zmq.PUB)
   --publisher:bind("tcp://127.0.0.1:5563")
   local id=1
   for cl in string.gmatch(FUT_OPT_CLASSES,"%a+") do
      local sec_list=getClassSecurities(cl)
      for sec in string.gmatch(sec_list,"%w+%.?%w+") do
         instruments[sec]={}
         instruments[sec].Static={}
         instruments[sec].Dynamic={}
         local static=instruments[sec].Static
         local dynamic=instruments[sec].Dynamic
         static.Class=cl
         static.Code=sec
         static.FullName=getParamEx(cl,sec,'LONGNAME').param_image
         static.Id=id
         if cl=='FUTUX' or cl=='SPBFUT' then
            static.InstrumentType='Futures'
            static.BaseContractClass='RTSIND'
            static.BaseContract=getParamEx(cl,sec,"OPTIONBASE").param_image..'I'
         else
            static.InstrumentType='Option'
            static.BaseContractClass=getSecurityInfo('',sec).class_code
            static.BaseContract=getParamEx(cl,sec,"OPTIONBASE").param_image
         end

         static.OptionType=getParamEx(cl,sec,"OPTIONTYPE").param_image
         static.Strike=tonumber(getParamEx(cl,sec,"STRIKE").param_value)
         
         static.DaysToMate=getParamEx(cl,sec,"DAYS_TO_MAT_DATE").param_image
         static.MaturityDate=getParamEx(cl,sec,"MAT_DATE").param_image
         
         dynamic.LastPrice=tonumber(getParamEx(cl,sec,'last').param_value)
         dynamic.Volatility=tonumber(getParamEx(cl,sec,'volatility').param_value)
         dynamic.TheorPrice=tonumber(getParamEx(cl,sec,'theorprice').param_value)
         if cl=='FUTUX' or cl=='SPBFUT' then
            dynamic.SettlePrice=tonumber(getParamEx(cl,sec,'settleprice').param_value)
         else
            dynamic.SettlePrice=tonumber(getParamEx(static.BaseContractClass,static.BaseContract,'last').param_value)
         end
         dynamic.Bid=tonumber(getParamEx(cl,sec,'BID').param_value)
         dynamic.Ask=tonumber(getParamEx(cl,sec,'OFFER').param_value)
         dynamic.BidVol=tonumber(getParamEx(cl,sec,'BIDDEPTH').param_value)
         dynamic.AskVol=tonumber(getParamEx(cl,sec,'OFFERDEPTH').param_value)
         dynamic.Id=id
         --dynamic.MsgType='INSTRUMENT'
         id=id+1
      end
   end
   local sf=string.find
   id=1
   for i=1,getNumberOf('trade_accounts') do
      local itm=getItem('trade_accounts',i)
      if ((accounts_keys[itm.trdaccid]==nil) and (sf(itm.class_codes,'FUTUX')~=nil or sf(itm.class_codes,'OPTUX')~=nil or sf(itm.class_codes,'SPBFUT')~=nil or sf(itm.class_codes,'SPBOPT')~=nil )) then
         accounts[#accounts+1]={['Name']=itm.trdaccid,['Id']=id}
         id=id+1
         --account_list=accountListt..','..itm.trdaccid
         accounts_keys[itm.trdaccid]=#accounts
      end
   end
   for i=1,getNumberOf('futures_client_holding') do
      local itm=getItem('futures_client_holding',i)
      positions[#positions+1]={
         ['AccountName']=itm.trdaccid,
         ['SecurityCode']=itm.sec_code,
         ['TotalNet']=itm.totalnet,
         ['BuyQty']=itm.openbuys,
         ['SellQty']=itm.opensells,
         ['VarMargin']=itm.varmargin
      }
      positions_keys[itm.trdaccid..itm.sec_code]=#positions
   end
   return true
   --is_run=true
end
function OnConnected(rep,pub)
   --reply:recv()
   message('Connected',3)
   rep:send('CONNECTED')
   for k,v in pairs(instruments) do
      pub:send('NEWINSTRUMENT',zmq.SNDMORE)
      pub:send(json.encode(v.Static))

      pub:send('INSTRUMENT',zmq.SNDMORE)
      pub:send(json.encode(v.Dynamic))

   end
   for k,v in ipairs(accounts) do
      pub:send('NEWACCOUNT',zmq.SNDMORE)
      pub:send(json.encode(v))
   end
   for k,v in ipairs(positions) do
      pub:send('NEWPOSITION',zmq.SNDMORE)
      pub:send(json.encode(v))
   end

   pub:send('COMMON',zmq.SNDMORE)
   pub:send('INITIALSYNCEND')
   message('INITIALSYNCEND',3)
   return true
end
function main()
   is_run=OnInitDo()
   local context=zmq.init(1)
   local publisher=context:socket(zmq.PUB)
   local reply=context:socket(zmq.REP)
   publisher:bind(publisher_binding)
   reply:bind(subscriber_binding)
   
   while is_run do
      msg=reply:recv(zmq.NOBLOCK)
      if msg~=nil then
         -- send info for new connections
         message('start onconnect',3)
         is_connected=OnConnected(reply,publisher)
         message('end onconnect '..tostring(is_connected),3)
      end
      if #itosend~=0 then
         for i=1,#itosend do
            local msg=table.remove(itosend,i)
            if msg~=nil then
               publisher:send("INSTRUMENT",zmq.SNDMORE)
               res=publisher:send(msg)
            end
         end
         --message("#"..#tosend,)2zmq
      end
      if #postosend~=0 then
         for i=1,#postosend do
            local msg=table.remove(postosend,i)
            if msg~=nil then
               publisher:send("POSITION",zmq.SNDMORE)
               res=publisher:send(msg)
            end
         end
         --message("#"..#tosend,2)
      end
      if #new_postosend~=0 then
         for i=1,#new_postosend do
            local msg=table.remove(new_postosend,i)
            if msg~=nil then
               publisher:send("NEWPOSITION",zmq.SNDMORE)
               res=publisher:send(msg)
            end
         end
         --message("#"..#tosend,2)
      end
      sleep (1)
   end
   publisher:close()
   reply:close()
   context:term()
   
   --while is_run do sleep(100) end
end


 
 
Цитата
asteroid пишет:
А почему dependency walker не показывает зависимость квиковской lua5.1.dll не показывает зависимость от qlua.dll
скорей всего потому, что она подключается через функцию winapi LoadLibrary.
 
Цитата
asteroid пишет:
Michael Bulychev , еще вопрос. А почему dependency walker не показывает зависимость квиковской lua5.1.dll не показывает зависимость от qlua.dll
там динамическая загрузка.
 
ага. и я про тоже :) )
http://www.dependencywalker.com/faq.html
 
Всем привет! Пытаюсь оживить пример из сообщения выше, получаю ошибку:
error loading module 'zmq' from file '.\zmq.dll': Не найден указанный модуль.

zmq.dll и все остальные dll скопированы в папку с квиком, а так же, на всякий случай, и в папку с инсталляцией Lua for Windows.
Подскажите, что именно тут не так.
 
Добрый день.
Тут разбиралась похожая проблема.
 
Разобрался. Оказалось, что с lua и квиком все было в порядке, но при помощи dependency walker обнаружил, что не хватает зависимостей для zmq.dll из числа minwin. Все запустилось нормально на Win 7 + .Net Framework redistributable.
 
Драсте у меня такая ошибка вылетает при запуске луа, ребят помогите, а то писец, край мне )  
 
Цитата
диман ааппаампма написал:
Драсте у меня такая ошибка вылетает при запуске луа, ребят помогите, а то писец, край мне )
https://github.com/patchua/QL
 
Добрый день,

Пишу первый тестовый скрипт на Lua, к которому хочу подключить qlua.dll через require(). Поместил все quik-овские dll в одну папку, при запуске через командную строку ошибка
Код
lua53: error loading module 'qlua' from file 'E:\Programs\qlua.dll':
        Не найдена указанная процедура.
При запуске через терминал (без require()) отрабатывает нормально.
 
Юрий Петухов,
просто не нужно подключать qlua.dll через require()
 
А каким образом тогда использовать функции библиотеки (например, CreateDataSource())? Или из-под командной строки это невозможно?
 
Spadar,

Использовать скрипты при запуске в терминале QUIK.
Страницы: 1
Читают тему (гостей: 1)
Наверх