Так уж вышло, что пару дней назад я познакомился с терминалом 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 и, тем более обратно, с ограничениями :
- LUA не получает массивы, поэтому записывать массивы приходится в цикле (по крайней мере в моей сборке)
- 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 можно, например,
здесь .
Пример реализации:
Осуществление листинга доступных инструментов
Отслеживание портфеля (аналог таблицы «Клиентский портфель»).
Связка работает быстро, надёжно, без изнасилования HDD. Главное — она даёт полный контроль над исполнением скриптов LUA Матлабу и позволяет, таким образом, экономить машинное время. Скорость загрузки данных при выставлении периода обращения к Матлабу 300 мс составляет около 500 мс за 12 лет истории, включая все преобразования и сортировку по датам.
Заметил, что при остановке скрипта COM сервер закрывается автоматически, решил, что в моей сборке dll отчистки происходят самостоятельно. По крайней мере, видимых процессов не остаётся, через диспетчер процессов / задач тоже ничего не остаётся.
Мои сочувствия, убожество из убожеств.