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

Пост посвящен технике использование .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 которые кидают во внешние ресурсы информацию и получают результат.
Включаем фантазию и думаем, что можно делать дальше.

Similar posts

Ads
AdBlock has stolen the banner, but banners are not teeth — they will be back

More

Comments 3

    0
    А чего это в блоге С++? Неужели dll только на С++ пишутся? :)
      0
      Конечно нет, просто у C++ есть наибольший известный мне спектр аналитических тулов которые можно применить в форексе.
        0
        Хотел бы я на Java (точнее на Scala) к MetaTrader-у что-нибудь напейсать… Даже догадываюсь куда копать, но страшновато.

      Only users with full accounts can post comments. Log in, please.