Блог им. Kot_Begemot

COM интерфейс МаtLab в LUA

Так уж вышло, что пару дней назад я познакомился с терминалом QUICK и языком его скриптов — LUA

   Естественно, сразу возникла необходимость передать полный контроль над этим двумя сложнейшими приложениями чему-то более простому и понятному, например Матлабу, чтобы нажимая разноцветные кнопочки «Обыграть рынок» и «Что там опять у волатильности?» оставить конечному пользователю, то есть мне, только наслаждение от наблюдения за происходящим.


     Теоретически, для этого надо нанять менеджера COM из LUACOM.dll и дать ему в управление пару простых исполнителей — объектов LUA, чтобы высшее руководство МатЛаба могло эффективно распоряжаться ресурсами в иерархии 

 Руководство МатЛаб -> менеджер интерфейса  COM -> исполнитель  объект LUA 


       Но в силу каких-то неведомых причин (от сборки dll, до сборки MS Windows и даже предустановленного железа) сделать по теории управления с ходу не получилось, поэтому была использована альтернативная схема:


Исполнитель (объект LUA) самостоятельно ищет сдельную работу на рынке труда (COM — объект Матлаб), на котором высшее руководство (Матлаб) размещает свои предложения и оферты. Когда работа для исполнителя находится, то он её исполняет и получает печеньку, точнее дырку от печеньки, но это, в данном случае, не важно.


   Итак, первым делом, нам нужно организовать рынок труда : 

require "luacom"

local Visibility=1; -- Логическое значение видимости командной строки МатЛаба


function Start()

MatLab = luacom.CreateObject("matlab.application.single")  -- создать COM - объект Матлаб
assert(MatLab); - проверить выполнение операции

-- message("MatLab Server Started"); 


MatLab.Visible = Visibility;  -- установить видимость окна Матлаба 0 - не видно, 1 - видно
MatLab : PutWorkspaceData("Status","base",1); -- установить флаг " режим ожидания"
MatLab : PutWorkspaceData("Reupdate","base",10); -- установить скорость (частоту) соединения с Матлабом 1 раз за 10 секунд
 
end

   Обращаться к этому рынку можно несколькими функциями:


  • ObjName: Execute ( ' function ' ); 
                   где  function   -  функция, заданная строкой, например  " c=a+b; ",  которая исполняется в Матлаб и не возвращает ничего (!).


  • ObjName: Feval ('fun',out, inp1,inp2 ...),                     
                   где fun — вызов функции матлаб, например ( ' median ' ), out — число возвращаемых аргументов, inp1, inp2… — входящие аргументы.

  • ObjName: PutWorkspaceData('var','base', x); 
                   функция передачи данных,  где var — имя переменной в Матлаб, 'base' — назначение отправки данных, x — переменная в LUA.

  •  x= ObjName: GetWorkspaceData('var','base');

                  функция получения данных где x — получаемая переменная в LUA, var — имя переменной в  Матлаб. 



       
     Сo стороны Матлаба всё аналогично, с той лишь разницей, что двоеточие после ObjName заменяется на точку, а сам ObjName получается                 
вызовом функции:

  • ObjName = actxGetRunningServer('matlab.application'); 


        Данные из   COM в Matlab конвертируются без проблем, а из LUA в COM и, тем более обратно, с ограничениями :

  1. LUA не получает массивы, поэтому записывать массивы приходится в цикле (по крайней мере в моей сборке)
  2. LUA передает численные массивы в качестве строковых (cell array) и поэтому их требуется после передачи конвертировать обратно
    Таким образом, некоторый простейший код, например, построение графика индекса РТС, будет выглядеть следующим образом:

local C={}; 
-- будем считать, что C это массив индекса РТС (close).


-- Передаём массив
MatLab : PutWorkspaceData('RTSI','base',C);

-- Конвертируем массив
MatLab: Execute('RTSI=str2double(RTSI)');

-- строим график

MatLab : Execute('plot(RTSI)');

    Аналогично, пользуясь различными ToolBoxa'ми можно строить поверхности волатильности (наверное), рассчитывать портфели, запускать роботов — то есть выполнять из LUA любые операции Матлаб.

Собственно, вся технология. Скачать библиотеку luacom.dll можно, например, здесь .



Пример реализации: 

COM интерфейс МаtLab в LUA
Осуществление листинга доступных инструментов

COM интерфейс МаtLab в LUA
Отслеживание портфеля (аналог таблицы «Клиентский портфель»).



Связка работает быстро, надёжно, без изнасилования HDD. Главное — она даёт полный контроль над исполнением скриптов LUA Матлабу и позволяет, таким образом, экономить машинное время. Скорость загрузки данных при выставлении периода обращения к Матлабу 300 мс составляет около 500 мс  за 12 лет истории, включая все преобразования и сортировку по датам.



  • обсудить на форуме:
  • Quik Lua
★21 | ₽ 100
не забывайте только закрывать и обнулять матлаб объекты, а то наплодите в системе кучу матлаб процессов в скрытом режиме с каждым запуском скрипта lua
avatar

Андрей К

Андрей К, сколько я не пытался делать по мануалу — выход из матлаба, удаление ссылок, потом collectgarbage()  — сплошные ошибки.

Заметил, что при остановке скрипта COM сервер закрывается автоматически, решил, что в моей сборке dll отчистки происходят самостоятельно. По крайней мере, видимых процессов не остаётся, через диспетчер процессов / задач тоже ничего не остаётся. 
avatar

Kot_Begemot

Kot_Begemot, 
через диспетчер процессов / задач тоже ничего не остаётся. 
а ну норм тогда
avatar

Андрей К

Спасибо за мысль про СОМ объект. Давно пользовался квиком (но не матлабом) но до идеи вынести управление квиком наружу ещё не доходил  
я познакомился с терминалом QUICK и языком его скриптов — LUA

Мои сочувствия, убожество из убожеств.
avatar

Иван Иванов

Для любителей дотнета, подобное хорошо умеет https://github.com/finsight/QUIKSharp
avatar

Dmitryy

а еще можно dll-ку свою написать, зарекваирить ее и дергать оттуда функции… даж без кома…

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.

Залогиниться

Зарегистрироваться
....все тэги
UPDONW