Язык MQL — Урок 9 “Библиотека функций”

Доброе время суток, Уважаемые читатели!

Хотел сегодня рассмотреть очередного советника форекс, но понял, что мне надоело копировать функции из одного советника в другой. Поэтому сегодня рассмотрим что такое «Библиотеки функций MQL» и как с ними работать.

Для создания библиотеки функций MQL4 вызываем мастера создания советников в Metaeditor-е торгового терминала MT4:

Мастер создания библиотек

Вводим имя библиотеки функций (например MyLib):

Параметры библиотеки функций

Копируем в созданную библиотеку наши функции GetLot(), NewOrder(), DelOrders(), DelOrder(), EditOrder() и CloseOrder(). Компилируем и получаем ошибку:

Ошибки компиляции

Не определены переменные TakeProfit и StopLoss. Дело в том, что мы в функции NewOrder() используем их для вычисления тейк-профита и стоп-лосса. Но они были определены не в функции NewOrder(), а как параметры экспертов. Давайте и в библиотеке их опишем как внешние для исключения ошибок.

extern int TakeProfit=0;
extern int StopLoss=0;

Компилируем. Ошибок нет. Теперь мы можем не копировать каждый раз наши функции в новые скрипты или советники Forex, а просто подключать нашу библиотеку.

Но это еще не все. Дело в том, что в MQL4 можно использовать не только свои библиотеки, но и библиотеки разработанные другими пользователями и даже системные библиотеки операционной системы DLL.

В большинстве случаев эти библиотеки уже скомпилированы и необходимо компилятору указать какие функции они содержат. Для этого создается «Заголовочный файл».

Для его создания запускаем мастер еще раз:

Мастер создания

Задаем имя (можно использовать то же имя что и у нашей библиотеки):

Параметры заголовочного файла

Внутри заголовочного файла необходимо подключить библиотеку:
#import «MyLib.ex4»
И описать какие она содержит функции:
double GetLot(int Risk);
int NewOrder(int Cmd,double Lot,double PR=0,double TP=0,double SL=0);
void DelOrders(int Cmd);
void DelOrder();
void EditOrder(double sl);
void CloseOrder();

Компилируем. Ошибок нет.

Для использования нашей библиотеки достаточно в начале каждого советника форекс или скрипта написать:
#include <MyLib.mqh>

Например наш скрипт для расчета лота и открытия ордеров с использованием библиотеки «MyLib» станет еще короче:
//+——————————————————————+
//| test.mq4 |
//| Copyright © 2010, MQL для тебя. |
//| http://strategy4you.ru |
//+——————————————————————+
#property copyright «Copyright © 2010, MQL для тебя.»
#property link «http://strategy4you.ru»
#property show_inputs
#include <MyLib.mqh>
extern int MaxRisk=2;
extern bool Buy=false; //для открытия ордера на покупку
extern bool Sell=false; //для открытия ордера на продажу
extern int TakeProfit=100;
extern int StopLoss=100;
//+——————————————————————+
int start()
{double Lot=GetLot(MaxRisk);
if(Lot==0) {Alert(«Недостаточно средств!»);return(0);}
RefreshRates();
if(Buy) NewOrder(OP_BUY,Lot,0,0,0);
if(Sell) NewOrder(OP_SELL,Lot,0,0,0);
return(0);}
//+——————————————————————+

Сразу возникает вопрос:

Возможно ли написать вирус на MQL4?

Ведь есть возможность использовать системные библиотеки DLL.
Использования DLL в языке MQL4 открывает практически неограниченные возможности, но вместе с тем таит и опасности. Вирус написать навряд ли удасться, а вот другой вредоносный код (например: для воровства паролей) вполне возможно. Поэтому разработчики из MetaQuotes ввели ограничение на запуск скриптов и советников Forex с DLL:

Параметры советника

Рекомендую не включать галочку «Разрешить импорт функций из DLL» кроме программ полученных из надежных источников и которые не могут без этого работать.

Скачать: библиотека mylib заголовочный файл mylib скрипт test

Похожие статьи:

8 комментариев

  1. Весь инет перерыл но ответа не нашол.. Буду признателен если поможете.. Есть другой способ подключения в место —
    #import «MyFirstDLL.dll»
    string Hello(string a, string b);
    #import

  2. Валерий
    Нет. В MQL именно так импортируются функции из DLL. Кроме того необходимо такому советнику или скрипту «Разрешить импорт функций из DLL».

  3. Приветствую! Пока не получаетца привезать #include . Компелятор кидает ’MyLib.mgh’-cannot open the program faile Как с этим боротца?

  4. Ув. администрация сейчас занимаюсь тестированием одной пока еще сыроватой ТС и возник собственно такой вопрос на который не могу найти ответ: возможно ли реализовать скриптом открытие отложенных ордеров при пересечении ценой на определенное количество пунктов определенной диагонали проведенной вручную, и определение типа ордера в зависимости от направления самой диагонали+ в зависимости от таймфрейма определить уровень трейлинг стопа заданного заранее. Заранее благодарю за ответ каким бы он не был.

  5. Не понял как записывать функции в созданной библиотеке. Для каждой функции нужно создавать новую библиотеку, или все можно записать в одной? И каким образом записывать функции в библиотеке?

  6. При компиляции обновленного скрипта ошибок нет. Но когда запускаю его , в журнале выдает ошибку: Cannot find ‘GetLot’ in ‘MyLib.ex4’

    Почему система не видит библиотеку?

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *