Содержание статьи: (кликните, чтобы перейти к соответствующей части статьи):


 

Приветствую Вас, дорогие друзья. Эту статью мы посвятим подробному разбору глобальных и локальных переменных в 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» она будет знать, что такая переменная есть, она целочисленная и равняется единице.

Объявление глобальных переменных в MQL4

 

То же самое произойдет, если мы эту переменную будем использовать в функции OnTick() или в OnTimer(), то есть, когда программа придет в эти функции и увидит «x», то она будет знать, что такая переменная есть, она имеет целочисленный тип и равняется единице.

Вот так и происходит глобальное объявление переменных в MQL4 — когда мы объявляем переменную в «шапке» над всем кодом.

 

Локальные переменные в MQL4

Но, если мы данную переменную «x» объявим уже не в «шапке» нашего кода, а локально внутри какой-нибудь функции, например, внутри функции OnTick(), то данное объявление переменной будет называться локальным. Так как эта переменная «x» у нас объявлена локально только в рамках определенной функции.

// БЛОК ЦИКЛА, ВЫПОЛНЯЮЩИЙСЯ ПО ТИКАМ 
void OnTick()
  { 
  int x = 1;
  }

 

И если мы переменную «x» объявили в функции OnTick(), а использовать ее будем в функции OnTimer(), то когда компилятор придет в функцию OnTimer() и увидит «x», он выдаст ошибку.

Локальные переменные в MQL4. Ошибка

 

Компилятор, увидев обращение к «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);
  }

 

Итак, давайте испробуем советник. Компилируем наш код. Переходим в терминал.

Компилируем код MQL4

 

Запускаем наш советник и смотрим результат:

Локальные переменные в MQL4

 

Что у нас произошло? При переносе советника на график, терминал увидел глобальное объявление переменной «x». Пошел далее, запустил в работу функцию OnInit(), переменной «x» присвоил единицу, пошел далее, пришел в OnTick(), запустил команду Comment(), а она вывела на график значение нашей переменной «x».

 


 

Таймер (счетчик) секунд

Спрограммируем небольшую программу. Удаляем все наши эксперименты. В «шапке» вновь объявляем целочисленную глобальную переменную «x» и приравниваем ее к 0.

Теперь данную переменную мы можем использовать в любом из блоков нашей программы.

Переходим в блок OnTimer() и пишем строчку x=x+1. Ниже этой строчки пишем команду Comment (x).

Сам таймер настроим на работу через каждую секунду:

То есть, функция OnTimer() будет запускаться через каждую секунду.

Настройка OnTimer в MQL4

 

Итак, давайте посмотрим на получившийся 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
 


 


Вам это может быть интересно. Другие статьи нашего обучающего портала:


  • Антон — SanGReal Invest (Сангрил Инвест)

    Если у Вас появились вопросы по статье, пишите их здесь. Я Вам обязательно отвечу.
    Также, буду рад Вашей обратной связи

  • Илья

    Спасибо, Антон! Полезные статьи!
    Но есть одно, не путать глобальные и внешние переменные.
    С уважением!
    Илья
    1489385@mail.ru

    • SanGReal Invest: Антон

      да-да, Илья, Вы правы, глобальные и внешние переменные в MQL4 — это совершенно разные понятия

  • https://ok.ru/profile/560266244267 Александр Качура

    Здравствуйте, спасибо за уроки, начал писать свой первый простенький советник по Вашим урокам, но выдает ошибки и не могу разобраться что не так не могли бы указать на мои недостатки? если да, то может на почту я скину?

    • SanGReal Invest: Антон

      Александр, здравствуйте. Да, можете выслать на емейл support@sgrtradeinvest.ru. Я посмотрю

      • https://ok.ru/profile/560266244267 Александр Качура

        большое спасибо, сейчас высылаю

        • SanGReal Invest: Антон

          советник посмотрел, ответил Вам по емейл, но тут тоже пропишу основную часть ошибки… для других людей, чтобы обращали на эту ошибку внимание. Так как она весьма распространенная среди начинающих MQL4 программистов.

          У Вас пропущена закрывающая фигурная скобка } у функции OnTick()

          То есть, Вам в 93 строке нужно поставить закрывающую фигурную скобку }

          Тогда ошибка исчезнет. Но появятся другие предупреждения по функции OrderSend. Это предупреждения, но не ошибки. Появятся потому что просто так функцию OrderSend нежелательно использовать.

          Желательно при ее вызове эту функцию назначать какой-то переменной, которая запомнит сработала или не сработала OrderSend.
          Например, так: int ticket = OrderSend()

          В дальнейших статьях-уроках мы все эту будем подробно разбирать.

          А так, старайтесь всегда проверять у каждой функции наличие открывающих и закрывающих скобок. Этой теме я тоже вскоре уделю внимание и напишу обучающую статью с примерами