Блог им. 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
3.8К | ★20
7 комментариев
не забывайте только закрывать и обнулять матлаб объекты, а то наплодите в системе кучу матлаб процессов в скрытом режиме с каждым запуском скрипта lua
avatar
Андрей К, сколько я не пытался делать по мануалу — выход из матлаба, удаление ссылок, потом collectgarbage()  — сплошные ошибки.

Заметил, что при остановке скрипта COM сервер закрывается автоматически, решил, что в моей сборке dll отчистки происходят самостоятельно. По крайней мере, видимых процессов не остаётся, через диспетчер процессов / задач тоже ничего не остаётся. 
avatar
Kot_Begemot, 
через диспетчер процессов / задач тоже ничего не остаётся. 
а ну норм тогда
avatar
Спасибо за мысль про СОМ объект. Давно пользовался квиком (но не матлабом) но до идеи вынести управление квиком наружу ещё не доходил  
avatar
я познакомился с терминалом QUICK и языком его скриптов — LUA

Мои сочувствия, убожество из убожеств.
avatar
Для любителей дотнета, подобное хорошо умеет https://github.com/finsight/QUIKSharp
avatar
а еще можно dll-ку свою написать, зарекваирить ее и дергать оттуда функции… даж без кома…

Читайте на SMART-LAB:
Фото
Рынок облигаций. Расходы бюджета несут риски
Игорь Галактионов Рассказываем о ключевых событиях прошедшей недели и интересных выпусках облигаций. Низкая инфляция, но большой дефицит...
Фото
День инвестора ВТБ
17 мая собираем в Москве опытных и начинающих инвесторов в кластере «Ломоносов». В программе: 🔵 Финансовые результаты,...
💰 СД Займера рекомендовал направить на дивиденды 100% чистой прибыли IV квартала 2025
Совет директоров Займера на заседании 12 мая рекомендовал направить на выплату дивидендов за IV квартал 2025 года 1,11 млрд рублей. Это...
Мозговой штурм! Что нового на текущий момент?
Доброго дня, дорогие товарищи! Сегодня у нас в офисе прошел традиционный мозговой штурм. Делюсь  основным.

теги блога Kot_Begemot

....все тэги



UPDONW
Новый дизайн