Как стать автором
Обновить

Использование dll в Meta Traider 4

Время на прочтение 2 мин
Количество просмотров 13K
Пост посвящен технике использование .dll ресурсов в MetaTrader4, а точнее в mql4.

Эта техника позволяет дооснастить аналитику и функционал 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 которые кидают во внешние ресурсы информацию и получают результат.
Включаем фантазию и думаем, что можно делать дальше.
Теги:
Хабы:
+3
Комментарии 3
Комментарии Комментарии 3

Публикации

Истории

Работа

Программист C++
121 вакансия
QT разработчик
13 вакансий

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн
PG Bootcamp 2024
Дата 16 апреля
Время 09:30 – 21:00
Место
Минск Онлайн
EvaConf 2024
Дата 16 апреля
Время 11:00 – 16:00
Место
Москва Онлайн