Содержание статьи: (кликните, чтобы перейти к соответствующей части статьи):
- Глобальные переменные в MQL4
- Локальные переменные в MQL4
- Таймер (счетчик) секунд
- Удобно читаемый вывод информации в Comment()
Приветствую Вас, дорогие друзья. Эту статью мы посвятим подробному разбору глобальных и локальных переменных в MQL4. Посмотрим, как и где они объявляются, правила объявления и практические примеры их использования.
Глобальные переменные в MQL4
Давайте объявим целочисленную переменную «x» в «шапке» кода нашего советника, например, так (подробнее о том, что такое «шапка» кода советника Вы можете прочитать здесь):
//+------------------------------------------------------------------+ //| My_first_expert.mq4 | //| Copyright (с) Антон SanGReal Invest | //| https://sgr-tradeinvest.ru | //+------------------------------------------------------------------+ #property copyright "Copyright (с) Антон SanGReal Invest" #property link "https://sgr-tradeinvest.ru" #property version "1.00" #property strict int x = 1; // БЛОК ИНИЦИАЛИЗАЦИИ int OnInit() { EventSetTimer(60); return(INIT_SUCCEEDED); } // БЛОК ДЕИНИЦИАЛИЗАЦИИ void OnDeinit(const int reason) { EventKillTimer(); } // БЛОК ЦИКЛА, ВЫПОЛНЯЮЩИЙСЯ ПО ТИКАМ void OnTick() { } // БЛОК ЦИКЛА, ВЫПОЛНЯЮЩИЙСЯ ПО ТАЙМЕРУ void OnTimer() { }
Данное объявление в «шапке» и является глобальным, так как переменная будет известна всему коду.
То есть, если мы эту переменную будем использовать в функции OnInit(), то когда программа будет обращаться к данному блоку и увидит переменную «x» она будет знать, что такая переменная есть, она целочисленная и равняется единице.
То же самое произойдет, если мы эту переменную будем использовать в функции OnTick() или в OnTimer(), то есть, когда программа придет в эти функции и увидит «x», то она будет знать, что такая переменная есть, она имеет целочисленный тип и равняется единице.
Вот так и происходит глобальное объявление переменных в MQL4 — когда мы объявляем переменную в «шапке» над всем кодом.
Локальные переменные в MQL4
Но, если мы данную переменную «x» объявим уже не в «шапке» нашего кода, а локально внутри какой-нибудь функции, например, внутри функции OnTick(), то данное объявление переменной будет называться локальным. Так как эта переменная «x» у нас объявлена локально только в рамках определенной функции.
// БЛОК ЦИКЛА, ВЫПОЛНЯЮЩИЙСЯ ПО ТИКАМ void OnTick() { int x = 1; }
И если мы переменную «x» объявили в функции OnTick(), а использовать ее будем в функции OnTimer(), то когда компилятор придет в функцию OnTimer() и увидит «x», он выдаст ошибку.
Компилятор, увидев обращение к «x» в OnTimer() начнет искать объявление этой переменной. Соответственно, он сначала посмотрит ее объявление локально в OnTimer(). Не найдет объявления этой переменной и автоматически поднимется в «шапку» нашего кода, где объявление переменной «x» также не увидит, соответственно, и выдаст ошибку. Несмотря на то, что x объявлена в функции OnTick(). Так происходит, потому что данная переменная локальная и объявлена только в рамках конкретной отдельной функции.
Отсюда следует, что, если нам необходимо воспользоваться переменной «x» в другой функции, то нам необходимо либо объявить эту локальную переменную еще раз в нужной функции, либо объявить эту переменную один раз глобально в «шапке» советника.
Теперь посмотрим, как это все обстоит на практике. У нас есть глобальная переменная «x». Давайте её просто объявим (int x;).
В блоке OnInit() этой переменной присвоим значение один (x=1;).
Далее, в блоке OnTick() мы выведем значение этой переменной при помощи уже известной нам команды Comment().
//+------------------------------------------------------------------+ //| My_first_expert.mq4 | //| Copyright (с) Антон SanGReal Invest | //| https://sgr-tradeinvest.ru | //+------------------------------------------------------------------+ #property copyright "Copyright (с) Антон SanGReal Invest" #property link "https://sgr-tradeinvest.ru" #property version "1.00" #property strict int x; // БЛОК ИНИЦИАЛИЗАЦИИ int OnInit() { x=1; return(INIT_SUCCEEDED); } // БЛОК ЦИКЛА, ВЫПОЛНЯЮЩИЙСЯ ПО ТИКАМ void OnTick() { Comment(x); }
Итак, давайте испробуем советник. Компилируем наш код. Переходим в терминал.
Запускаем наш советник и смотрим результат:
Что у нас произошло? При переносе советника на график, терминал увидел глобальное объявление переменной «x». Пошел далее, запустил в работу функцию OnInit(), переменной «x» присвоил единицу, пошел далее, пришел в OnTick(), запустил команду Comment(), а она вывела на график значение нашей переменной «x».
Таймер (счетчик) секунд
Спрограммируем небольшую программу. Удаляем все наши эксперименты. В «шапке» вновь объявляем целочисленную глобальную переменную «x» и приравниваем ее к 0.
Теперь данную переменную мы можем использовать в любом из блоков нашей программы.
Переходим в блок OnTimer() и пишем строчку x=x+1. Ниже этой строчки пишем команду Comment (x).
Сам таймер настроим на работу через каждую секунду:
То есть, функция OnTimer() будет запускаться через каждую секунду.
Итак, давайте посмотрим на получившийся MQL код целиком:
//+------------------------------------------------------------------+ //| My_first_expert.mq4 | //| Copyright (с) Антон SanGReal Invest | //| https://sgr-tradeinvest.ru | //+------------------------------------------------------------------+ #property copyright "Copyright (с) Антон SanGReal Invest" #property link "https://sgr-tradeinvest.ru" #property version "1.00" #property strict int x=0; // БЛОК ИНИЦИАЛИЗАЦИИ int OnInit() { EventSetTimer(1); return(INIT_SUCCEEDED); } // БЛОК ДЕИНИЦИАЛИЗАЦИИ void OnDeinit(const int reason) { EventKillTimer(); } // БЛОК ЦИКЛА, ВЫПОЛНЯЮЩИЙСЯ ПО ТИКАМ void OnTick() { } // БЛОК ЦИКЛА, ВЫПОЛНЯЮЩИЙСЯ ПО ТАЙМЕРУ void OnTimer() { x=x+1; Comment(x); }
Смотреть на практике, что у нас получилось, мы в статье не будем. Вы, пожалуйста, сами уже данный код пропишите и посмотрите, как советник будет работать в терминале MetaTrader4.
Но, словами я сейчас все же опишу весь процесс для ясного понимания вопроса.
Итак, мы объявили целочисленную глобальную переменную «x», задали ей изначально значение ноль. Наша программа спускается вниз по коду, прошла первая секунда, запустился OnTimer(), где у нас имеется формула с переменной «x».
x=x+1;
Новое значение «x» равно старому значению «x» плюс 1. Итого новое значение переменной будет равняться единице. Далее, это значение мы выводим при помощи нашей команды Comment(). То есть, на экран терминала в итоге выведется 1. И все это на первой секунде.
Первая секунда прошла. Идет следующая секунда, где новое значение «x» равно старому значению «x» (в нашем случае единице) плюс один. У нас получается новое значение «x», равное 2, которое мы опять выводим на график с помощью команды Comment(). И все это на второй секунде.
Пришла третья секунда, где новое значение «x» равно старому значению «x» (то есть 2) плюс единица. Новое значение — 3. И все это на третьей секунде.
У нас получился своего рода простой таймер-счетчик, который считает секунды (1, 2, 3, 4 и т.д.).
Удобно читаемый вывод информации в Comment()
Последнее, что мы рассмотрим в данной статье — это удобно читаемый вывод информации в Comment(). На данный момент наша информация (счетчик секунд) выводится просто, как цифры (1, 2, 3, 4 и т.д.) и непонятно, за что отвечает данная цифра. Как сделать так, чтобы нам было понятно, что это за цифры.
Нам необходимо в команде Comment() прописать не только вывод значения «x», но также вывести и поясняющий текст.
Как это сделать:
// БЛОК ЦИКЛА, ВЫПОЛНЯЮЩИЙСЯ ПО ТАЙМЕРУ void OnTimer() { x=x+1; Comment("Количество секунд = ",x); }
Мы прописали текст в кавычках «Количество секунд =», далее поставили разделитель запятую, и далее саму переменную x.
В данном случае при выводе информации через Comment(), мы с Вами соединили два разных типа информации: первый тип — это текст «Количество секунд =», второй тип — это переменная x и между ними мы поставили разделение (запятую).
Если у Вас появились какие-то вопросы по материалу данной статьи, задавайте их в комментариях ниже. Я Вам обязательно отвечу. Да и вообще, просто оставляйте там Вашу обратную связь, я буду очень рад.
Также, делитесь данной статьей со своими знакомыми в социальных сетях, возможно, этот материал кому-то будет очень полезен.
На этом данная статья окончена. Переходите к следующей статье, где мы продолжим работать с данным нашим кодом советника и немного доработаем его, чтобы в советнике, при переносе на график терминала MetaTrader, появилась вкладка «Входящие параметры». Благодаря которой, мы сможем изменять значение нашей переменной x, находясь прямо в советнике в терминале MetaTrader.
Благодарю за внимание.
Другие статьи по теме Программирование на MQL4 Вы можете просмотреть в данном содержании практических уроков по MQL.
Понравился материал статьи?
Добавьте эту статью в закладки Вашего браузера, чтобы вернуться к ней еще раз. Для этого, прямо сейчас нажмите на клавиатуре комбинацию клавиш Ctrl+D
С уважением, Антон.
Обучающий Форекс портал SanGReal Invest