Помогите подключить dll созданную в Matlab к эксперту.

 

Я так понимаю, это задача типовая, но почему-то подробного описания нигде нет. 

В Matlab создаётся функция (в данном случае нейронная сеть). С помощью Compiler создаётся dll, которую можно использовать только при установленном Matlab runtime (установлено). Дальше по идее эту dll можно подключить в эксперте и использовать. Вот тут и проблема. Подключить удалось, но не получается определить необходимую функцию и правильно передать/получить данные. При выводе ответа dll из эксперта на печать получается только  "-nan(ind)".


Может кто-то помочь интегрировать какую-то из этих dll в эксперт? Они отличаются только компиляцией под разные платформы.


Исходные данные.

Есть Matlab 2014a, Visual Studio 2012 x32.

Подозреваю, что необходима какая-то "обёртка".

В dll лежит нейросеть, на входе данные типа double 100 шт, на выходе 1 переменная типа double.

Если нужны ещё какие-то данные - пишите.

Файлы:
dlls.zip  111 kb
 

DLL экспортирует такие функции:

#import "myNeuralNetworkFunction.dll"
   void myNeuralNetworkFunction( int nargout, mwArray& Y, mwArray& Xf, mwArray& Af, const mwArray& X, const mwArray& _U4b, const mwArray& _U4c );
   bool mlxMyNeuralNetworkFunction( int nlhs, mxArray* plhs[], int nrhs, mxArray* prhs[] );
   bool myNeuralNetworkFunctionInitialize();
   bool myNeuralNetworkFunctionInitializeWithHandlers( mclOutputHandlerFcn error_handler, mclOutputHandlerFcn print_handler );
   void myNeuralNetworkFunctionPrintStackTrace();
   void myNeuralNetworkFunctionTerminate();
#import

Перед этим должен быть определён класс mwArray.

В функцию mlxMyNeuralNetworkFunction передаётся массив указателей на класс. Вы не сможете это сделать из MQL.

В функцию myNeuralNetworkFunctionInitializeWithHandlers передаются указатели на функцию. Это также не сделать из MQL.

Хотя вполне возможно, они Вам и не нужны.

 
Koldun Zloy:

DLL экспортирует такие функции:

Перед этим должен быть определён класс mwArray.

В функцию mlxMyNeuralNetworkFunction передаётся массив указателей на класс. Вы не сможете это сделать из MQL.

В функцию myNeuralNetworkFunctionInitializeWithHandlers передаются указатели на функцию. Это также не сделать из MQL.

Хотя вполне возможно, они Вам и не нужны.

я так понимаю, без промежуточной dll тут не обойтись? Т.е. нужно что-то, что соединит mql4 и матлабовскую dll.

Вы можете с этим помочь? А точнее можете помочь с шаблоном для VS2012, редактируя и компилируя который, можно получить необходимый коннектор?

P.S. Представление о программировании на С есть, но в данном случае его не достаточно.

 
К сожалению я не работал с Матлабом и плохо представляю, как сделать такой коннектор.
 
Dmitriy Voevodkin:
 


Подозреваю, что необходима какая-то "обёртка".


Так и есть.

Может быть по этому пути лучше двигаться   https://www.mql5.com/ru/articles/1567 ?

Взаимодействие между MеtaTrader 4 и MATLAB Engine (виртуальная машина MATLAB)
Взаимодействие между MеtaTrader 4 и MATLAB Engine (виртуальная машина MATLAB)
  • 2009.03.30
  • Andrey Emelyanov
  • www.mql5.com
В настоящее время MetaTrader 4 и математический пакет MATLAB успели получить высокую оценку пользователей за многие свои положительные характеристики, в том числе за «гибкость» при создании сложных вычислительный систем. Математический пакет MATLAB имеет три основных способа связи с вешними приложениями, но лишь один из них рекомендован –...
 

Если вы сюда попали, значит у вас похожая проблема. Решить мне её не удалось, но нашёлся немного другой вариант. Немного криво и ректально, но работает. Можно всё организовать обменом через диск.

Пишем вот такую простую функцию в матлабе, не забывая менять пути на нужные вам.

a=0
while a==0    
    if exist ('E:\Program Files\Alpari Limited MT4\MQL4\Files\EURUSD.csv') ==2
        n=load ('E:\Program Files\Alpari Limited MT4\MQL4\Files\EURUSD.csv')
        delete ('E:\Program Files\Alpari Limited MT4\MQL4\Files\EURUSD.csv')
        n=transpose(n)
        myNeuralNetworkFunction(n)
        save ('E:\Program Files\Alpari Limited MT4\MQL4\Files\ans.csv','ans','-ascii')
    end
    pause(1)
end

Через while организуем бесконечный цикл.

exist - проверяет наличие файла на диске.  ==2 - тип обнаруженной переменной "файл". Если файл не найден, то переходит к ближайшему end

load - загружает содержимое файла в переменную.

delete - удаляет файл, чтобы советник в МТ4 понял, что данные матлабом получены.

transpose - разворачивает матрицу. Т.к. МТ сохраняет данные в строчку, а матлаб из матрицы берёт данные в столбик.

myNeuralNetworkFunction - натренированная нейронная сеть сохраняется с таким названием по-умолчанию (необходимо после обучения нажать нужную кнопку).

save - сохраняет переменную в файл. Вызов нейронной сети сохраняет ответ по-умолчанию в переменную ans.

pause - задержка типа Sleep в mql4, измеряется в секундах. Ставится, чтобы не спамить диск обращениями.

Ещё нюанс - при работе в реалтайме эксперты сохраняют файлы в папку \MQL4\Files\, при запуске в тестере - \tester\files\

Чтобы не убить диск, лучше создать виртуальный диск в памяти и МТ поставить туда и обмен организовывать через него.

Чтобы прервать бесконечный цикл достаточно в Command Window нажать CTRL+BREAK

Причина обращения: