MQL5 – Перечисления

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


Предыдущие уроки


MQL5 Программирование: Перечисления

Создадим новый скрипт, а заодно я покажу небольшой лайфхак.

Если при создании скрипта добавить любую внешнюю переменную, вам не нужно будет прописывать самостоятельно директиву #property script_show_inputs.

А теперь создадим перечисление внутри функции OnStart():

enum SomeEnum {}

Объявляется перечисление, как вы помните, при помощи ключевого слова enum, дальше идет название перечисления, и в фигурных скобках указываются те значения, которые нам понадобятся. Причем указываем мы только имена, а не сами числовые значения. Возьмем для образца некие абстрактные таймфреймы:

enum SomeEnum {TF_1M, TF_5M, TF_1H, TF_4H};

Сразу покажу, как обращаться к членам перечисления, и заодно посмотрим, что скрывается за именами в этом перечислении. Как всегда, делать мы это будем с помощью функции Print().

Обращение к конкретному члену перечисления осуществляется по имени перечисления и в круглых скобках – имя самого значения:

Print(SomeEnum(TF_1M));
Print(SomeEnum(TF_5M));
Print(SomeEnum(TF_1H));
Print(SomeEnum(TF_4H));

Как видите, функция Print вернула нам не имена, а конкретные числовые значения. Каждое новое значение на единицу больше предыдущего, отсчет начинается с нуля. Дело в том, что мы не указали значения явно, и тогда первому имени по аналогии с массивами присваивается ноль, следующему 1 и так далее.

Но мы можем присвоить значения самостоятельно. Делается это так же, как с переменными – с помощью оператора присвоения:

enum SomeEnum {TF_1M = 1, TF_5M, TF_1H, TF_4H};

Как видите, снова увеличение каждого следующего значения на единицу, но уже пересчитанное с учетом того, что первое значение равно одному.

Не обязательно явно присваивать именно первое значение в перечислении. В этом случае все значения, которые идут после явно присвоенного, пересчитаются в соответствии с правилом увеличения на один:

enum SomeEnum {TF_1M = 1, TF_5M = -3, TF_1H, TF_4H};

Первые два значения, присвоенные явно, сохранились, а последующие без явного присвоения последовательно увеличились на единицу относительно последнего явно присвоенного значения.

Также можно не присваивать явно первое значение:

enum SomeEnum {TF_1M, TF_5M = -3, TF_1H, TF_4H};

Итак, первое значение в перечислении всегда ноль, если явно не указано другое. Все последующие не присвоенные явно значения на единицу больше предыдущего, но если появляется явно присвоенное значение, то последующие неявные будут подчиняться правилу увеличения на единицу относительно явно присвоенного значения.

Если можно не задавать явно ни одного значения, значит, можно явно задать все значения:

enum SomeEnum {TF_1M = 1, TF_5M = 5, TF_1H = 60, TF_4H = 240};

Значения из перечислений можно использовать в других операциях:

int a =  SomeEnum (TF_1H) + SomeEnum (TF_1M);
Print (a);

Члену перечисления же результат какой-либо операции или значение переменной присвоить нельзя. Как мы задали значение при объявлении перечисления, так оно и останется до конца выполнения программы. Такая запись:

SomeEnum (TF_4H) = a;

выведет ошибку.

enum SomeEnum {TF_1M = 1, TF_5M = 5, TF_1H = 60, TF_4H = 240};
input SomeEnum TimeFrame = 1;

Перечисления в основном используют не в математических операциях, а в логике. Например, если значение переменной соответствует, допустим, второму значению в перечислении, то наш советник, к примеру, будет только продавать, а если первому – только покупать, а если ни одному, то не делает ничего. И тут тип данных enum отлично сочетается с логическим оператором switch, с которым мы знакомились в 4 уроке MQL5 Урок 4 – Операторы.

Просто синхронизируем количество значений в перечислении и кейсов в switch, и в зависимости от выбранного значения из перечисления в соответствующем кейсе выставляются значения переменных флагов, а уже в зависимости от значений этих флагов прописывается нужная логика.

enum trade_enum {buy = 0, sell = 1, all = 2};
input trade_enum trade_direction = 1;

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   switch (trade_direction) {
      case 0: {
         // Только покупки
         break;
      };
      case 1: {
         // Только продажи
         break;
      }
      case 2: {
         // Покупки и продажи
         break;
      }
   }
   
}

Но вообще пользовательские перечисления не так уж часто используются в mql5 программах. Зато в языке есть масса заранее созданных разработчиками перечислений, и вот без них ни одна программа не обойдется. Смысла перечислять их в рамках данного урока нет. Ознакомиться с ними можно в официальной документации к языку mql5.

На этом все, всем пока!

Тема на форуме

С уважением, Дмитрий аkа Silentspec
Tlap.com

Уроки по MQL5 , , ,