MQL для чайников, программирование на MQL4, MQL5
18 Янв
Доброе время суток, Уважаемые читатели!
Хотел сегодня рассмотреть очередного советника форекс, но понял, что мне надоело копировать функции из одного советника в другой. Поэтому сегодня рассмотрим что такое «Библиотеки функций 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://mql4you.ru |
//±-----------------------------------------------------------------+
#property copyright "Copyright © 2010, MQL для тебя."
#property link "http://mql4you.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
Если Вы хотите изучать язык MQL или вам понравилась данная публикация - Вы можете подписаться на получение новых материалов сайта mql4you.ru по |
8 комментариев на «Язык MQL — Урок 9 «Библиотека функций»»
[...] теперь не надо, достаточно подключить нашу библиотеку “MyLib”. Добавим новые параметры для индикатора форекс ZigZag: [...]
Весь инет перерыл но ответа не нашол... Буду признателен если поможете... Есть другой способ подключения в место —
#import «MyFirstDLL.dll»
string Hello(string a, string b);
#import
Валерий
Нет. В MQL именно так импортируются функции из DLL. Кроме того необходимо такому советнику или скрипту «Разрешить импорт функций из DLL».
[...] нашу библиотеку MyLib и укажем внешние параметры: [...]
Приветствую! Пока не получаетца привезать #include . Компелятор кидает ’MyLib.mgh’-cannot open the program faile Как с этим боротца?
Ув. администрация сейчас занимаюсь тестированием одной пока еще сыроватой ТС и возник собственно такой вопрос на который не могу найти ответ: возможно ли реализовать скриптом открытие отложенных ордеров при пересечении ценой на определенное количество пунктов определенной диагонали проведенной вручную, и определение типа ордера в зависимости от направления самой диагонали+ в зависимости от таймфрейма определить уровень трейлинг стопа заданного заранее. Заранее благодарю за ответ каким бы он не был.
Не понял как записывать функции в созданной библиотеке. Для каждой функции нужно создавать новую библиотеку, или все можно записать в одной? И каким образом записывать функции в библиотеке?
При компиляции обновленного скрипта ошибок нет. Но когда запускаю его , в журнале выдает ошибку: Cannot find 'GetLot' in 'MyLib.ex4'
Почему система не видит библиотеку?