Я пробовал так. Создал DLL в HiAsm
Add(DLL,2953706,343,119)
{
WorkPoints=#3:asd|
EventPoints=#7:GoMyDll|
link(GoMyDll,6656957:doData,[])
}
Add(DoData,6656957,392,119)
{
Data=String(Hello from DLL!)
link(onEventData,2953706:asd,[(436,125)(436,113)(331,113)(331,125)])
}
Потом попытался вызвать функцию из этой dll в программе на языке mql4. Делается это там вот так:
#import "MyDll.dll" // добавляем dll
string GoMyDll(); // указываем какую функцию импортировать
#import
int init()
{
Comment(GoMyDll()); // пробуем вызвать импортируемую функцию из dll.
return(0);
}
int start()
{
return(0);
}
Для того, чтобы запустить этот код, дужно скачать терминал MT4 http://nordfx.com/download/1312388140/nfx4setup.exe
1. Устанавливаем терминал
2. Ложим, созданную в HiAsm dll в папку ...MetaTraderexpertslibraries. Имя dll должно быть такое MyDll.dll
3. Запускаем ...MetaTraderMetaEditor.exe
4. Нажимаем кнопку "создать", выбираем "советник", жмём "далее", вводим любое имя, жмём "готово"
5. Копируем второй код в созданный советник.
6. Нажимаем "компилировать"
Если в процессе компиляции ошибок нет, значит идём дальше.
1. Запускаем ...MetaTrader erminal.exe
2. Открываем демо счёт
3. Слева будет окошко "обзор рынка". Жмём правой кнопкой на любую строчку. К примеру EURUSD. И выбираем "окно графика" и разворачиваем на всё рабочее пространство
4. Внизу, слева есть окошечко "навигатор". Выбираем в нём созданный в предыдущей инструкции советник и тянем его на график.
5. В открывшемся окне отмечаем галочками "Разрешить импорт функций из DLL". Жмём Ок.
По идее программа должна импортировать функцию GoMyDll из нашей dll. И эта функция должна вернуть такой текст Hello from DLL! Этот текст должен появиться в левом верхнем углу графика. Но этого не происходит.
Про импорт функций из dll в mql4:
Импорт функций осуществляется из откомпилированных модулей MQL4 (файлы *.ex4) и из модулей операционной системы (файлы *.dll). Имя модуля указывается в директиве #import. Для того, чтобы компилятор мог правильно оформить вызов импортируемой функции и организовать правильную передачу параметров, необходимо полное описание функций. Описания функций следуют непосредственно за директивой #import "имя модуля". Новая команда #import (можно без параметров) завершает блок описания импортируемых функций.
#import "имя_файла"
func1 define;
func2 define;
...
funcN define;
#import
Импортируемые функции должны иметь уникальные имена. Нельзя одновременно импортировать из разных модулей функции с одинаковыми именами. Импортируемые функции не должны иметь имен, совпадающих с именами встроенных функций.
Так как импортируемые функции находятся вне компилируемого модуля, компилятор не может проверить правильность передаваемых параметров. Поэтому, во избежание ошибок выполнения, необходимо точно описывать состав и порядок параметров, передаваемых в импортируемые функции. Параметры, передаваемые в импортируемые функции (как из EX4, так и из DLL-модулей), не могут иметь значения по умолчанию.
Примеры:
#import "user32.dll"
int MessageBoxA(int hWnd, string lpText, string lpCaption, int uType);
#import "stdlib.ex4"
string ErrorDescription(int error_code);
int RGB(int red_value, int green_value, int blue_value);
bool CompareDoubles(double number1, double number2);
string DoubleToStrMorePrecision(double number, int precision);
string IntegerToHexString(int integer_number);
#import "ExpertSample.dll"
int GetIntValue(int);
double GetDoubleValue(double);
string GetStringValue(string);
double GetArrayItemValue(double arr[], int, int);
bool SetArrayItemValue(double& arr[], int,int, double);
double GetRatesItemValue(double rates[][6], int, int, int);
int SortStringArray(string& arr[], int);
int ProcessStringArray(string& arr[], int);
#import
Для импорта функций во время выполнения mql4-программы используется так называемое позднее связывание. Это значит, что пока не вызвана импортируемая функция, соответствующий модуль (ex4 или dll) не загружается.
Не рекомендуется использовать полностью квалифицированное имя загружаемого модуля вида Drive
