Это первая статья по программированию на языке 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. Но эти способы уже существенно сложнее для новичков. Выше перечисленных методов вполне достаточно для начала, чтобы использовать при отладке кода во время разработки программ и тестов.
На этом заканчиваем эту статью. Чтобы вовремя получать уведомления о новых публикациях подпишитесь на обновления удобным Вам способом. Если возникли вопросы спрашивайте в комментариях ниже.
Комментариев нет :
Отправить комментарий