Введение в MQL5. Вывод информации в печать в разных режимах.

Введение в MQL5. Вывод информации в печать в разных режимах.
Это первая статья по программированию на языке MQL5 на этом сайте. Следует сразу отметить, что на сайте mql5.com Вы найдёте очень большое количество материала по программированию на MQL5, а материал, который будет публиковаться на этом сайте следует рассматривать, как дополнение.

Я начну с простых примеров, чтобы те, кто только начинает изучать программирование могли плавно погрузиться в изучение этого языка. Я вспоминаю, как я начинал изучать разработку и программирование торговых систем, и признаться, мне это было довольно сложно, так как это мой первый язык. До этого я вообще считал, что это не моё и навряд ли я смогу с этим когда-нибудь разобраться.

Но всё оказалось не так сложно и уже через несколько месяцев я создал довольно сложную программу. Вы можете ознакомиться с этим продуктом на сайте разработчиков терминала в статье Безграничные возможности с MetaTrader 5 и MQL5.

Я постараюсь вести начинающего экспертописателя по принципу "от простого к сложному". Я не буду переписывать Справочное руководство и клавишей F1 в редакторе MetaEditor Вам придётся пользоваться часто. Но зато в этой серии статей Вы найдёте множество примеров, готовых функций и схем, которые можете использовать в своих разработках, как в исходном, так и в изменённом своими собственными силами виде.

Итак. В этой статье создадим простой скрипт, который выводит в печать некоторые свойства символа в разных режимах. При разработке программы очень часто, особенно в начале изучения, будут возникать ситуации, когда программа будет показывать не тот результат, который Вы от неё ожидаете. Поэтому в таких случаях нужно будет проверять значения тех или иных переменных, которые участвуют в расчётах. Мы рассмотрим в этом примере три варианта, в которых будут использоваться функции Print(), Comment() и Alert(). В последствии Вы сами сможете определить для себя тот способ, который для Вас будет удобнее.

Я начал изучать MQL5 именно со скриптов. Это довольно удобно и быстро. Скрипт загружается, исполняет созданную Вами функцию и сам удаляется с графика. Таким образом можно быстро провести ряд экспериментов и выяснить, в каком направлении работать дальше.

Если у Вас до сих пор не установлен торговый терминал MetaTrader 5, то установите его прямо сейчас. После установки, запустите терминал и перейдите в редактор нажав клавишу F4. С помощью этой клавиши Вы можете быстро переключаться от торгового терминала MetaTrader 5 к редактору MetaEditor и обратно. Также на панели терминала, под главным меню, можно установить значок, кликом по которому можно открывать редактор. Хорошо изучите с помощью Справочного руководства (F1) торгового терминала и редактора интерфейс программ, так как на этих вопросах мы не будем останавливаться или это будет очень кратко.

Перейдите в редактор MetaEditor и нажмите сочетание клавиш Ctrl+N или нажмите на панели редактора под главным меню кнопку Создать. Откроется окно Мастер MQL5, в котором можно выбрать, какую программу будем создавать. В этом случае выберите Скрипт и нажмите Далее:

Окно Мастер MQL5 - Скрипт

На следующем шаге нужно будет ввести название скрипта (имя файла). Скрипты по умолчанию создаются в директории Metatrader 5\MQL5\Scripts\имя_файла.mq5. В этой директории можно создавать также и другие папки для группировки файлов по назначению.

Окно Мастер 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 можно выбрать режим вывода в печать:

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

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

Для того, чтобы создать функцию нужно просто ввести код показанный ниже:

//---
//+------------------------------------------------------------------+
//| ВЫВОДИТ В ПЕЧАТЬ СВОЙСТВА СИМВОЛА                                |
//+------------------------------------------------------------------+
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, то данные будут выводиться в журнал (окно Инструменты вкладка Эксперты):

Окно Инструменты - Вкладка Эксперты

Если выбран вариант COMMENT, то данные будут выводиться на график в левый верхний угол:

Комментарии на графике в левом верхнем углу

Также при выборе варианта COMMENT после вывода информации на график, с помощью функции MessageBox() будет открыто диалоговое окно, в котором будет предложено очистить график от комментариев.

Если же был выбран вариант ALERT, то после запуска скрипта будет открываться окно, в которое будет выводиться запрошенная информация или просто пользовательские сообщения:

Окно алерта

Вместе с этим выводится информация в журнал, как в случае с вариантом PRINT и издаётся звуковое оповещение.

Ниже представлен весь код скрипта:

//+------------------------------------------------------------------+
//|                                                   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. Но эти способы уже существенно сложнее для новичков. Выше перечисленных методов вполне достаточно для начала, чтобы использовать при отладке кода во время разработки программ и тестов.

На этом заканчиваем эту статью. Чтобы вовремя получать уведомления о новых публикациях подпишитесь на обновления удобным Вам способом. Если возникли вопросы спрашивайте в комментариях ниже.


Комментариев нет :

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