По всей видимости, терминал не видит dll матлаба, похоже, что они хранятся не в стандартных папках Винды.
Попробуйте дописать переменную окружения (среды) path путями к этим библиотекам.
По всей видимости, терминал не видит dll матлаба, похоже, что они хранятся не в стандартных папках Винды.
Попробуйте дописать переменную окружения (среды) path путями к этим библиотекам.
О да! Заработало - это ж просто прекрасно, спасибо большое.
Небольшая ремарка, может поможет кому то - после запуска со включенным интернетом через vpn соединение и подключенным советником с матлабовской длл терминал начинает потреблять 50% ресурсов и ничего не происходит. Такая же ситуация как и у стендэлон приложений матлаба - глюк. Надо отключить vpn, запустить метатрейдер присоединить советник/индикатор с матлаб длл и только после этого включить инет снова. Тогда работает. Видимо решение это сменить тип соединения с инетом.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Уважаемые господа.
Имеется Matlab R2010a 32bit, VisualStudio 2008 sp1, MT5, Windows 7 64bit
В матлабе:
1. Пишу простую m функцию которая возвращает результат
function s = sinus()
s = sin(2);
end
2. Start > Matlab > MatlabCompiler > Deployment Tool
3. Target устанавливаю "C++ Shared Library", пишу название проекта dll_test, жму ОК.
4. Появляется окошко Deployment tool справа - в Exported Functions тащу sinus.m
5. Перед тем как нажать Build отключаю vpn соединение интернет (это официальный глюк матлаба в win7/vista - эту мантру
надо делать перед установкой, входом в матлаб, перед компиляцей и как я понял перед запуском стэнделон
приложения - не знаю насчет dll - после интернет можно снова включить)
6. Так же выполняю команду mbuild -setup - она выставляет текущий компилятор - выбираю микрософтовский компилятор.
7. Build > имеем 4 файла > dll_test.dll, dll_test.h, dll_test.lib и ткстшник его игнорируем.
8. Dll с функцией матлаба готова.
В Visual Studio 2008
1. File > New > Project > MFC Dll
2. Имя проекта matlab_dll_wrapper > OK
3. Содержимое matlab_dll_wrapper.def
; matlab_dll_wrapper.def : Declares the module parameters for the DLL.
LIBRARY "matlab_dll_wrapper"
EXPORTS
; Explicit exports can go here
Hello
4. Содержимое matlab_dll_wrapper.cpp
// matlab_dll_wrapper.cpp : Defines the initialization routines for the DLL.
//
#include "stdafx.h"
#include "matlab_dll_wrapper.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define _DLLAPI extern "C" __declspec(dllexport)
_DLLAPI double __stdcall Hello(double a, double b)
{
return a + b;
}
5. аутпут ставлю в папку с mql5, это выставляю matlab_dll_wrapper > Properties > Configuration Properties > General > Output Directory > C:\Program Files (x86)\MetaTrader 5\MQL5\Libraries
6. Компилю Release Win32 - кнопкой (f7) > Итого по вышеобозначенному адресу появились следующие 4 файла: matlab_dll_wrapper .dll / .exp / .lib / .pdb
Иду в метатрейдер запускаю редактор
#import "matlab_dll_wrapper.dll"
double Hello(double a, double b);
#import
void OnInit()
{
double a = 1.5;
double b = 1.5;
Print("а плюс б =", Hello (a, b));
}
Компилирую - f5 > присоединяю к графику
Чудесно! Всё работает. Выводится сообщение а плюс б = 3
Вот, а теперь тоже самое с функцией матлаба
В Visual Studio
1. Копирую 3 matlab файла(.dll .lib .h) в папку с VS проектом там где def cpp и прочее...
корректирую приведенный выше код
2. matlab_dll_wrapper.cpp
// matlab_dll_wrapper.cpp : Defines the initialization routines for the DLL.
//
#include "stdafx.h"
#include "matlab_dll_wrapper.h"
#include "dll_test.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define _DLLAPI extern "C" __declspec(dllexport)
_DLLAPI double __stdcall Hello(double a, double b)
{
//дальше как я это понимаю происходит следующее...
if(mclInitializeApplication(NULL,0) == 0) //открываем matlab compilator runtime
{
//std::cerr << "Could not initialize MCR" << std::endl;
return -2;
}
if (dll_testInitialize() == 0) // открываем нашу чудо длл из матлаба
{
//fprintf(stderr,"Could not initialize the library.\n");
return -3;
}
else // если открылось
{
int z = 1; // инициализируем аутпут
mwArray zz(0); // пишем аутпут сюда
sinus(z, zz); // вызываем многострадальный синус
dll_testTerminate(); // закрываем длл
}
mclTerminateApplication(); //закрываем matlab compilator runtime
return a + b; // но возвращаем по-прежнему все по старому просто чтобы убедится что работает
}
3. Проект > properties > C/C++ > General > Additional Include Directories = C:\MATLAB\R2010a\extern\include
4. Проект > properties > Linker > General > Additional Library Directories = C:\MATLAB\R2010a\extern\lib\win32\microsoft
5. Проект > properties > Linker > Input > Additional Dependencies > libemlrt.lib libeng.lib libfixedpoint.lib libmat.lib libmex.lib libmwblas.lib libmwblascompat32.lib libmwlapack.lib libmwmathutil.lib libmwservices.lib libmwsl_fileio.lib libmwsl_solver_rtw.lib libmx.lib libut.lib mclcommain.lib mclmcr.lib mclmcrrt.lib mclxlmain.lib ne_mli.lib ne_rtl.lib physmod_foundation_util.lib rtwcg.lib dll_test.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib
тут видимо я переборщил подключив все советы которые нашел в интернете
6. Поставил Matlab Compilator Runtime я правда не уверен надо это делать для dll или нет. Скопировал в корень его установки mclmcrrt713.dll - иначе почему экзешники скомпиленные из матлаба не пашут.
7. Похоже, что всё - скомпилил - захожу в метатрейдер и что вы думаете - не пашет - ругается
2010.05.16 20:42:10 cindyrellaIndicator (EURUSD,M1) Cannot find 'Hello' in 'matlab_dll_wrapper.dll'
2010.05.16 20:42:11 cindyrellaIndicator (EURUSD,M1) Cannot open 'C:\Program Files (x86)\MetaTrader 5\MQL5\Libraries\matlab_dll_wrapper.dll' (126)
Вот, если закомментить матлабовский кусок
_DLLAPI double __stdcall Hello(double a, double b)
{
//дальше как я это понимаю происходит следующее...
if(mclInitializeApplication(NULL,0) == 0) //открываем matlab compilator runtime
{
//std::cerr << "Could not initialize MCR" << std::endl;
return -2;
}
// if (dll_testInitialize() == 0) // открываем нашу чудо длл из матлаба
//{
////fprintf(stderr,"Could not initialize the library.\n");
//return -3;
//}
//else // если открылось
//{
//int z = 1; // инициализируем аутпут
// mwArray zz(0); // пишем аутпут сюда
//
// sinus(z, zz); // вызываем многострадальный синус
// dll_testTerminate(); // закрываем длл
//}
mclTerminateApplication(); //закрываем matlab compilator runtime
return a + b; // но возвращаем по-прежнему все по старому просто чтобы убедится что работает
}
то все работает - раскомментить - не работает. Пробовал подключать отключать vpn - пофиг. Запустил метатрейдер с администраторскими правами - тоже не помогло.
Подскажите пожалуйста кто знает - в чём мой косяк?