Это первая статья по программированию на языке MQL5 на этом сайте. Следует сразу отметить, что на сайте mql5.com Вы найдёте очень большое количество материала по программированию на MQL5, а материал, который будет публиковаться на этом сайте следует рассматривать, как дополнение.
Я начну с простых примеров, чтобы те, кто только начинает изучать программирование могли плавно погрузиться в изучение этого языка. Я вспоминаю, как я начинал изучать разработку и программирование торговых систем, и признаться, мне это было довольно сложно, так как это мой первый язык. До этого я вообще считал, что это не моё и навряд ли я смогу с этим когда-нибудь разобраться.
Но всё оказалось не так сложно и уже через несколько месяцев я создал довольно сложную программу. Вы можете ознакомиться с этим продуктом на сайте разработчиков терминала в статье Безграничные возможности с MetaTrader 5 и MQL5.
Я постараюсь вести начинающего экспертописателя по принципу "от простого к сложному". Я не буду переписывать Справочное руководство и клавишей F1 в редакторе MetaEditor Вам придётся пользоваться часто. Но зато в этой серии статей Вы найдёте множество примеров, готовых функций и схем, которые можете использовать в своих разработках, как в исходном, так и в изменённом своими собственными силами виде.
Итак. В этой статье создадим простой скрипт, который выводит в печать некоторые свойства символа в разных режимах. При разработке программы очень часто, особенно в начале изучения, будут возникать ситуации, когда программа будет показывать не тот результат, который Вы от неё ожидаете. Поэтому в таких случаях нужно будет проверять значения тех или иных переменных, которые участвуют в расчётах. Мы рассмотрим в этом примере три варианта, в которых будут использоваться функции Print(), Comment() и Alert(). В последствии Вы сами сможете определить для себя тот способ, который для Вас будет удобнее.
Я начал изучать MQL5 именно со скриптов. Это довольно удобно и быстро. Скрипт загружается, исполняет созданную Вами функцию и сам удаляется с графика. Таким образом можно быстро провести ряд экспериментов и выяснить, в каком направлении работать дальше.
Если у Вас до сих пор не установлен торговый терминал MetaTrader 5, то установите его прямо сейчас. После установки, запустите терминал и перейдите в редактор нажав клавишу F4. С помощью этой клавиши Вы можете быстро переключаться от торгового терминала MetaTrader 5 к редактору MetaEditor и обратно. Также на панели терминала, под главным меню, можно установить значок, кликом по которому можно открывать редактор. Хорошо изучите с помощью Справочного руководства (F1) торгового терминала и редактора интерфейс программ, так как на этих вопросах мы не будем останавливаться или это будет очень кратко.
Перейдите в редактор MetaEditor и нажмите сочетание клавиш Ctrl+N или нажмите на панели редактора под главным меню кнопку Создать. Откроется окно Мастер MQL5, в котором можно выбрать, какую программу будем создавать. В этом случае выберите Скрипт и нажмите Далее:
На следующем шаге нужно будет ввести название скрипта (имя файла). Скрипты по умолчанию создаются в директории Metatrader 5\MQL5\Scripts\имя_файла.mq5. В этой директории можно создавать также и другие папки для группировки файлов по назначению.
Можно также сразу добавить входные параметры, если это необходимо. Когда всё настроено нужно нажать кнопку Готово. Будет создан и открыт новый документ для разработки скрипта с шаблоном, как это показано ниже:
Всё, что пишется после двойной косой черты относится к комментариям и никак не влияет на исполнение программы. Желательно всегда подробно комментировать код, так как это существенно облегчает понимание своего же кода, особенно, если был долгий перерыв.
В первых трёх строках кода выше, всё, что идёт после #property относится к свойствам программы. Более подробно о каждой функции и свойстве можно прочитать в Справке по языку MQL5. Для того, чтобы быстро перейти к описанию той или иной функции нужно просто двойным щелчком выделить её и нажать F1. Откроется Справка с описанием запрошенной функции.
Далее идёт главная функция для скриптов - OnStart(). Именно в ней должны располагаться все другие функции и расчёты.
Сделаем так, чтобы перед выполнением программы можно было выбрать, каким способом будет выводиться запрошенная информация. Значит нужно сделать внешний параметр, в котором с помощью выпадающего списка можно будет выбрать нужный режим. Нам понадобится указать ещё одно свойство (#property), которое отвечает за то, чтобы программа открывала окно с внешними параметрами скрипта перед тем, как начать выполнение. Это свойство script_show_inputs. Добавим его ниже всех остальных, которые уже есть в коде:
Для того, чтобы сделать выпадающий список во внешних параметрах создадим перечисление всех режимов. Расположим этот код после свойств программы:
Далее в коде следует единственный в этом скрипте внешний параметр ModePrint:
Входные параметры, как правило располагаются в начале программы и перед типом переменной устанавливается модификатор input, который и определяет внешний параметр. Теперь при запуске скрипта будет открываться окно программы, а в выпадающем списке параметра Mode Print можно выбрать режим вывода в печать:
Далее создадим переменные, которым присвоим какие-нибудь значения (в данном случае выведем некоторые данные символа) и распечатаем их указанным пользователем во внешнем параметре способом. Для этого сделаем отдельную пользовательскую функцию PrintPropSymbol(), которая будет вызываться в главной функции OnStart().
Для того, чтобы создать функцию нужно просто ввести код показанный ниже:
Перед именем функции указывается тип возвращаемого значения, если же функция ничего не возвращает, как в этом случае, то нужно указать тип void.
Далее, в теле функции PrintPropSymbol() (между фигурными скобками) нужно написать остальной код. Вначале создадим переменные:
У каждой переменной свой тип в зависимости от того, какой тип данных будет ей присваиваться. Теперь присвоим этим переменным значения. Для того, чтобы получить свойства символа, в MQL5 есть специальные функции для каждого типа данных.
Для полноценного усвоения материала изучите каждую функцию и передаваемые аргументы в Справочном руководстве. Все свойства символа в Справке сведены в одну таблицу и Вам не раз придётся туда заглядывать.
Теперь переменным присвоены значения и осталось только для каждого способа вывода информации написать свой код. Вот как это выглядит:
Если во внешних параметрах выбран вариант PRINT, то данные будут выводиться в журнал (окно Инструменты вкладка Эксперты):
Если выбран вариант COMMENT, то данные будут выводиться на график в левый верхний угол:
Также при выборе варианта COMMENT после вывода информации на график, с помощью функции MessageBox() будет открыто диалоговое окно, в котором будет предложено очистить график от комментариев.
Если же был выбран вариант ALERT, то после запуска скрипта будет открываться окно, в которое будет выводиться запрошенная информация или просто пользовательские сообщения:
Вместе с этим выводится информация в журнал, как в случае с вариантом PRINT и издаётся звуковое оповещение.
Кроме перечисленных способов можно также записывать данные в файл. Это может быть обычный текстовый файл или даже в виде html-отчёта красиво отформатированного с помощью CSS. Но эти способы уже существенно сложнее для новичков. Выше перечисленных методов вполне достаточно для начала, чтобы использовать при отладке кода во время разработки программ и тестов.
На этом заканчиваем эту статью. Чтобы вовремя получать уведомления о новых публикациях подпишитесь на обновления удобным Вам способом. Если возникли вопросы спрашивайте в комментариях ниже.
Я начну с простых примеров, чтобы те, кто только начинает изучать программирование могли плавно погрузиться в изучение этого языка. Я вспоминаю, как я начинал изучать разработку и программирование торговых систем, и признаться, мне это было довольно сложно, так как это мой первый язык. До этого я вообще считал, что это не моё и навряд ли я смогу с этим когда-нибудь разобраться.
Но всё оказалось не так сложно и уже через несколько месяцев я создал довольно сложную программу. Вы можете ознакомиться с этим продуктом на сайте разработчиков терминала в статье Безграничные возможности с MetaTrader 5 и MQL5.
Я постараюсь вести начинающего экспертописателя по принципу "от простого к сложному". Я не буду переписывать Справочное руководство и клавишей F1 в редакторе MetaEditor Вам придётся пользоваться часто. Но зато в этой серии статей Вы найдёте множество примеров, готовых функций и схем, которые можете использовать в своих разработках, как в исходном, так и в изменённом своими собственными силами виде.
Итак. В этой статье создадим простой скрипт, который выводит в печать некоторые свойства символа в разных режимах. При разработке программы очень часто, особенно в начале изучения, будут возникать ситуации, когда программа будет показывать не тот результат, который Вы от неё ожидаете. Поэтому в таких случаях нужно будет проверять значения тех или иных переменных, которые участвуют в расчётах. Мы рассмотрим в этом примере три варианта, в которых будут использоваться функции Print(), Comment() и Alert(). В последствии Вы сами сможете определить для себя тот способ, который для Вас будет удобнее.
Я начал изучать MQL5 именно со скриптов. Это довольно удобно и быстро. Скрипт загружается, исполняет созданную Вами функцию и сам удаляется с графика. Таким образом можно быстро провести ряд экспериментов и выяснить, в каком направлении работать дальше.
Если у Вас до сих пор не установлен торговый терминал MetaTrader 5, то установите его прямо сейчас. После установки, запустите терминал и перейдите в редактор нажав клавишу F4. С помощью этой клавиши Вы можете быстро переключаться от торгового терминала MetaTrader 5 к редактору MetaEditor и обратно. Также на панели терминала, под главным меню, можно установить значок, кликом по которому можно открывать редактор. Хорошо изучите с помощью Справочного руководства (F1) торгового терминала и редактора интерфейс программ, так как на этих вопросах мы не будем останавливаться или это будет очень кратко.
Перейдите в редактор MetaEditor и нажмите сочетание клавиш Ctrl+N или нажмите на панели редактора под главным меню кнопку Создать. Откроется окно Мастер MQL5, в котором можно выбрать, какую программу будем создавать. В этом случае выберите Скрипт и нажмите Далее:
//+------------------------------------------------------------------+
//| Test01.mq5 |
//| Copyright 2010, MetaQuotes Software Corp. |
//| http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link "http://www.mql5.com"
#property version "1.00"
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//---
}
//+------------------------------------------------------------------+
Всё, что пишется после двойной косой черты относится к комментариям и никак не влияет на исполнение программы. Желательно всегда подробно комментировать код, так как это существенно облегчает понимание своего же кода, особенно, если был долгий перерыв.
В первых трёх строках кода выше, всё, что идёт после #property относится к свойствам программы. Более подробно о каждой функции и свойстве можно прочитать в Справке по языку MQL5. Для того, чтобы быстро перейти к описанию той или иной функции нужно просто двойным щелчком выделить её и нажать F1. Откроется Справка с описанием запрошенной функции.
Далее идёт главная функция для скриптов - OnStart(). Именно в ней должны располагаться все другие функции и расчёты.
Сделаем так, чтобы перед выполнением программы можно было выбрать, каким способом будет выводиться запрошенная информация. Значит нужно сделать внешний параметр, в котором с помощью выпадающего списка можно будет выбрать нужный режим. Нам понадобится указать ещё одно свойство (#property), которое отвечает за то, чтобы программа открывала окно с внешними параметрами скрипта перед тем, как начать выполнение. Это свойство script_show_inputs. Добавим его ниже всех остальных, которые уже есть в коде:
//--- #property copyright "Copyright 2010, MetaQuotes Software Corp." #property link "http://www.mql5.com" #property version "1.00" #property script_show_inputs //---
Для того, чтобы сделать выпадающий список во внешних параметрах создадим перечисление всех режимов. Расположим этот код после свойств программы:
//---
// ПЕРЕЧИСЛЕНИЕ
enum ENUM_MODE_PRINT
{
PRINT = 0,
COMMENT = 1,
ALERT = 2
};
//---
Далее в коде следует единственный в этом скрипте внешний параметр ModePrint:
//--- // ВХОДНЫЕ ПАРАМЕТРЫ input ENUM_MODE_PRINT ModePrint=PRINT; // Mode Print //---
Входные параметры, как правило располагаются в начале программы и перед типом переменной устанавливается модификатор input, который и определяет внешний параметр. Теперь при запуске скрипта будет открываться окно программы, а в выпадающем списке параметра Mode Print можно выбрать режим вывода в печать:
Для того, чтобы создать функцию нужно просто ввести код показанный ниже:
//---
//+------------------------------------------------------------------+
//| ВЫВОДИТ В ПЕЧАТЬ СВОЙСТВА СИМВОЛА |
//+------------------------------------------------------------------+
void PrintPropSymbol()
{
}
//---
Перед именем функции указывается тип возвращаемого значения, если же функция ничего не возвращает, как в этом случае, то нужно указать тип void.
Далее, в теле функции PrintPropSymbol() (между фигурными скобками) нужно написать остальной код. Вначале создадим переменные:
//--- string symb_symbol = ""; // Символ int symb_digits = 0; // Количество знаков после запятой int symb_spread = 0; // Разница между ценой ask и bid (спред) int symb_stoplevel = 0; // Ограничительные уровни stop level double symb_ask = 0.0; // Цена ask double symb_bid = 0.0; // Цена bid //---
У каждой переменной свой тип в зависимости от того, какой тип данных будет ей присваиваться. Теперь присвоим этим переменным значения. Для того, чтобы получить свойства символа, в MQL5 есть специальные функции для каждого типа данных.
//--- symb_symbol=Symbol(); symb_digits=(int)SymbolInfoInteger(_Symbol,SYMBOL_DIGITS); symb_spread=(int)SymbolInfoInteger(_Symbol,SYMBOL_SPREAD); symb_stoplevel=(int)SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL); symb_ask=SymbolInfoDouble(_Symbol,SYMBOL_ASK); symb_bid=SymbolInfoDouble(_Symbol,SYMBOL_BID); //---
Для полноценного усвоения материала изучите каждую функцию и передаваемые аргументы в Справочном руководстве. Все свойства символа в Справке сведены в одну таблицу и Вам не раз придётся туда заглядывать.
Теперь переменным присвоены значения и осталось только для каждого способа вывода информации написать свой код. Вот как это выглядит:
//---
// Если указано выводить в журнал
if(ModePrint==PRINT)
{
Print("symbol : ",symb_symbol,"\n",
"digits : ",symb_digits,"\n",
"spread : ",symb_spread,"\n",
"stoplevel : ",symb_stoplevel,"\n",
"ask : ",symb_ask,"\n",
"bid : ",symb_bid
);
}
//---
// Если указано выводить на график
if(ModePrint==COMMENT)
{
int mb_res=-1; // Переменная с результатом выбора в диалоговом окне
//---
Comment("symbol : ",symb_symbol,"\n",
"digits : ",symb_digits,"\n",
"spread : ",symb_spread,"\n",
"stoplevel : ",symb_stoplevel,"\n",
"ask : ",symb_ask,"\n",
"bid : ",symb_bid
);
//---
// Откроем диалоговое окно
mb_res=MessageBox("Удалить комментарии на графике?","Message Box",MB_YESNO|MB_ICONQUESTION);
//---
// Если нажата кнопка "Да" то, очистить комментарии на графике
if(mb_res==IDYES) { Comment(""); }
//---
return;
}
//---
// Если указано выводить в алерт
if(ModePrint==ALERT)
{
Alert("symbol : "+symb_symbol+"\n",
"digits : "+IntegerToString(symb_digits)+"\n",
"spread : "+IntegerToString(symb_spread)+"\n",
"stoplevel : "+IntegerToString(symb_stoplevel)+"\n",
"ask : "+DoubleToString(symb_ask,_Digits)+"\n",
"bid : "+DoubleToString(symb_bid,_Digits)
);
}
//---
Если во внешних параметрах выбран вариант PRINT, то данные будут выводиться в журнал (окно Инструменты вкладка Эксперты):
Если же был выбран вариант ALERT, то после запуска скрипта будет открываться окно, в которое будет выводиться запрошенная информация или просто пользовательские сообщения:
Ниже представлен весь код скрипта:
//+------------------------------------------------------------------+
//| ModesPrint.mq5 |
//| Copyright 2012, https://login.mql5.com/ru/users/tol64 |
//| http://tol64.blogspot.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, http://tol64.blogspot.com"
#property link "http://tol64.blogspot.com"
#property description "email: hello.tol64@gmail.com"
#property version "1.0"
#property script_show_inputs
//---
// ПЕРЕЧИСЛЕНИЕ
enum ENUM_MODE_PRINT
{
PRINT = 0,
COMMENT = 1,
ALERT = 2
};
//---
// ВХОДНЫЕ ПАРАМЕТРЫ
input ENUM_MODE_PRINT ModePrint=PRINT; // Mode Print
//---
//+------------------------------------------------------------------+
//| ГЛАВНАЯ ФУНКЦИЯ |
//+------------------------------------------------------------------+
void OnStart()
{
PrintPropSymbol();
}
//---
//+------------------------------------------------------------------+
//| ВЫВОДИТ В ПЕЧАТЬ СВОЙСТВА СИМВОЛА |
//+------------------------------------------------------------------+
void PrintPropSymbol()
{
string symb_symbol = ""; // Символ
int symb_digits = 0; // Количество знаков после запятой
int symb_spread = 0; // Разница между ценой ask и bid
int symb_stoplevel = 0; // Ограничительные уровни stop level
double symb_ask = 0.0; // Цена ask
double symb_bid = 0.0; // Цена bid
//---
symb_symbol=Symbol();
symb_digits=(int)SymbolInfoInteger(_Symbol,SYMBOL_DIGITS);
symb_spread=(int)SymbolInfoInteger(_Symbol,SYMBOL_SPREAD);
symb_stoplevel=(int)SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL);
symb_ask=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
symb_bid=SymbolInfoDouble(_Symbol,SYMBOL_BID);
//---
// Если указано выводить в журнал
if(ModePrint==PRINT)
{
Print("symbol : ",symb_symbol,"\n",
"digits : ",symb_digits,"\n",
"spread : ",symb_spread,"\n",
"stoplevel : ",symb_stoplevel,"\n",
"ask : ",symb_ask,"\n",
"bid : ",symb_bid
);
}
//---
// Если указано выводить на график
if(ModePrint==COMMENT)
{
int mb_res=-1; // Переменная с результатом выбора в диалоговом окне
//---
Comment("symbol : ",symb_symbol,"\n",
"digits : ",symb_digits,"\n",
"spread : ",symb_spread,"\n",
"stoplevel : ",symb_stoplevel,"\n",
"ask : ",symb_ask,"\n",
"bid : ",symb_bid
);
//---
// Откроем диалоговое окно
mb_res=MessageBox("Удалить комментарии на графике?","Message Box",MB_YESNO|MB_ICONQUESTION);
//---
if(mb_res==IDYES) { Comment(""); }
//---
return;
}
//---
// Если указано выводить в алерт
if(ModePrint==ALERT)
{
Alert("symbol : "+symb_symbol+"\n",
"digits : "+IntegerToString(symb_digits)+"\n",
"spread : "+IntegerToString(symb_spread)+"\n",
"stoplevel : "+IntegerToString(symb_stoplevel)+"\n",
"ask : "+DoubleToString(symb_ask,_Digits)+"\n",
"bid : "+DoubleToString(symb_bid,_Digits)
);
}
}
//+------------------------------------------------------------------+
Кроме перечисленных способов можно также записывать данные в файл. Это может быть обычный текстовый файл или даже в виде html-отчёта красиво отформатированного с помощью CSS. Но эти способы уже существенно сложнее для новичков. Выше перечисленных методов вполне достаточно для начала, чтобы использовать при отладке кода во время разработки программ и тестов.
На этом заканчиваем эту статью. Чтобы вовремя получать уведомления о новых публикациях подпишитесь на обновления удобным Вам способом. Если возникли вопросы спрашивайте в комментариях ниже.






Комментариев нет :
Отправить комментарий