Пост посвящен технике использование .dll ресурсов в MetaTrader4, а точнее в mql4.
Эта техника позволяет дооснастить аналитику и функционал MT4 практически ничем неогранниченными возможностями, начиная от импорта результатов сложных вычислений (IMSL, MatLab) до написания собственной инфраструктуры, которая использует MT4 как адаптер к брокеру.
Ресурсы в интернете говорят о том, что необходимо создавать MFC .dll, которая, во-первых, доступна не во всех версиях VS, во-вторых, усложняет код излишней MFC инициализаций.
В качестве тренировки напишем две функции:
1. Функция возвращает максимум из массива double.
2. Процедура сортирует массив.
В MVS: File -> New Project -> Win32 App.
В открывшемся окне: Next -> ApplicationType: DLL -> Finish
Дальше будем обозначать имя проекта FxDll.
Сразу добавляем FxDll.def файл к нашему проекту и пишем туда название двух будущих функций:
Советую добавлять двойное подчеркивание пред именем, для того, чтобы потом в MT4 не перепутать внешние функции с внутренними.
Добавляем к проекту: FxDll.h и объявляем две наши функции:
То что стоит перед функцией выглядит страшно, не будем это трогать, это не предмет этой статьи — а это необходимость для экспорта функции из dll.
Добавляем файл FxDll.cpp и пишем функции:
Понятно, что так дела не делаются, и нужно проверять на null, оборачивать exception' ами,
и предусматривать механизм передачи этого в MT4, но тем не менее на валидных данных это работать будет.
И так наша часть с++ готова.
Нужно сбилдить и положить FxDll.dll файл в каталог с программой.
/experts/libraries
И так у нас есть FxDll.dll которая лежит в libraries.
Создаём .mqh файл — он подтянет необходимые функции из dll.
В первой функции массив передаётся по значению и то что произойдёт с ним во вне MT4 не узнает.
Во второй по ссылке. Как это сделано в MT4 я не знаю, но, возможно, тот же смысл что и в с++.
На этом описание задачи выполнено. У нас есть две функции в MT4 которые кидают во внешние ресурсы информацию и получают результат.
Включаем фантазию и думаем, что можно делать дальше.
Эта техника позволяет дооснастить аналитику и функционал MT4 практически ничем неогранниченными возможностями, начиная от импорта результатов сложных вычислений (IMSL, MatLab) до написания собственной инфраструктуры, которая использует MT4 как адаптер к брокеру.
Пишем .dll при помощи VS
Ресурсы в интернете говорят о том, что необходимо создавать MFC .dll, которая, во-первых, доступна не во всех версиях VS, во-вторых, усложняет код излишней MFC инициализаций.
В качестве тренировки напишем две функции:
1. Функция возвращает максимум из массива double.
2. Процедура сортирует массив.
Создаём проект
В MVS: File -> New Project -> Win32 App.
В открывшемся окне: Next -> ApplicationType: DLL -> Finish
Дальше будем обозначать имя проекта FxDll.
Сразу добавляем FxDll.def файл к нашему проекту и пишем туда название двух будущих функций:
LIBRARY @FxDll
VERSION 0.1
EXPROTS
__getMax
__doSort
Советую добавлять двойное подчеркивание пред именем, для того, чтобы потом в MT4 не перепутать внешние функции с внутренними.
Объявляем функции
Добавляем к проекту: FxDll.h и объявляем две наши функции:
__declspec(dllexport) double __stdcall __getMax(double* arr, const int size);
__declspec(dllexport) void __stdcall __doSort(double* arr, const int size );
То что стоит перед функцией выглядит страшно, не будем это трогать, это не предмет этой статьи — а это необходимость для экспорта функции из dll.
Добавляем файл FxDll.cpp и пишем функции:
double __stdcall _getMax(double* arr, const int size)
{
return *std::max_element(arr, arr + size) ;
}
void __stdcall __doSort(double* arr, const int size )
{
std::sort(arr, arr + size);
}
Понятно, что так дела не делаются, и нужно проверять на null, оборачивать exception' ами,
и предусматривать механизм передачи этого в MT4, но тем не менее на валидных данных это работать будет.
И так наша часть с++ готова.
Нужно сбилдить и положить FxDll.dll файл в каталог с программой.
/experts/libraries
Готовим сторону MT4
И так у нас есть FxDll.dll которая лежит в libraries.
Создаём .mqh файл — он подтянет необходимые функции из dll.
//@FxDll.mqh
#import "@FxDll.dll"
double __getMax(double arr[], int);
void __doSort(double &arr[], int);
#import
В первой функции массив передаётся по значению и то что произойдёт с ним во вне MT4 не узнает.
Во второй по ссылке. Как это сделано в MT4 я не знаю, но, возможно, тот же смысл что и в с++.
На этом описание задачи выполнено. У нас есть две функции в MT4 которые кидают во внешние ресурсы информацию и получают результат.
Включаем фантазию и думаем, что можно делать дальше.