Именованные константы

Все используемые в языке MQL5 константы можно разбить на следующие группы:

  • Предопределенные макроподстановки – значения подставляются на этапе компиляции;
  • Математические константы – значения некоторых математических выражений;
  • Константы числовых типов – ограничения, накладываемые на простые типы;
  • Причины деинициализации – описание причин деинициализации;
  • Проверка указателя объекта – перечисление типов указателей, возвращаемых функцией CheckPointer() ;
  • Прочие константы – все, что не вошло в остальные группы констант.

 

Предопределенные макроподстановки

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

Константа

Описание

__DATE__

Дата компиляции файла без времени (часы, минуты и секунды равны 0)

__DATETIME__

Дата и время компиляции файла

__LINE__

Номер строки в исходном коде, на которой расположен данный макрос

__FILE__

Имя текущего компилируемого файла

__PATH__

Абсолютный путь к текущему компилируемому файлу

__FUNCTION__

Имя функции, в теле которой расположен макрос

__FUNCSIG__

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

__MQLBUILD__, __MQL5BUILD__

Номер билда компилятора

Пример:

#property copyright "Copyright © 2009, MetaQuotes Software Corp."
#property link      "https://www.metaquotes.net"

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
void OnInit()
{
   //--- пример вывода информации при инициализации советника
   Print(" __FUNCTION__ = ",__FUNCTION__,"  __LINE__ = ",__LINE__);

   //--- установка интервала между событиями таймера
   EventSetTimer(5);
}

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   //--- пример вывода информации при деинициализации советника
   Print(" __FUNCTION__ = ",__FUNCTION__,"  __LINE__ = ",__LINE__);
}

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
 
   //--- вывод информации при поступлении тика
   Print(" __MQLBUILD__ = ",__MQLBUILD__,"  __FILE__ = ",__FILE__);
   Print(" __FUNCTION__ = ",__FUNCTION__,"  __LINE__ = ",__LINE__);
   test1(__FUNCTION__);
   test2();
}

//+------------------------------------------------------------------+
//| test1                                                            |
//+------------------------------------------------------------------+
void test1(string par)
{
   //--- вывод информации внутри функции
   Print(" __FUNCTION__ = ",__FUNCTION__,"  __LINE__ = ",__LINE__," par=",par);
}

//+------------------------------------------------------------------+
//| test2                                                            |
//+------------------------------------------------------------------+
void test2()
{
   //--- вывод информации внутри функции
   Print(" __FUNCTION__ = ",__FUNCTION__,"  __LINE__ = ",__LINE__);
}

//+------------------------------------------------------------------+
//| OnTimer event handler                                            |
//+------------------------------------------------------------------+
void OnTimer()
{
   //---
   Print(" __FUNCTION__ = ",__FUNCTION__,"  __LINE__ = ",__LINE__);
   test1(__FUNCTION__);
}

 

Математические константы

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

Константа

Описание

Значение

M_E

e

2.71828182845904523536

M_LOG2E

log2(e)

1.44269504088896340736

M_LOG10E

log10(e)

0.434294481903251827651

M_LN2

ln(2)

0.693147180559945309417

M_LN10

ln(10)

2.30258509299404568402

M_PI

pi

3.14159265358979323846

M_PI_2

pi/2

1.57079632679489661923

M_PI_4

pi/4

0.785398163397448309616

M_1_PI

1/pi

0.318309886183790671538

M_2_PI

2/pi

0.636619772367581343076

M_2_SQRTPI

2/sqrt(pi)

1.12837916709551257390

M_SQRT2

sqrt(2)

1.41421356237309504880

M_SQRT1_2

1/sqrt(2)

0.707106781186547524401

Пример:

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   //--- выведем значения констант
   Print("M_E = ",DoubleToString(M_E,16));
   Print("M_LOG2E = ",DoubleToString(M_LOG2E,16));
   Print("M_LOG10E = ",DoubleToString(M_LOG10E,16));
   Print("M_LN2 = ",DoubleToString(M_LN2,16));
   Print("M_LN10 = ",DoubleToString(M_LN10,16));
   Print("M_PI = ",DoubleToString(M_PI,16));
   Print("M_PI_2 = ",DoubleToString(M_PI_2,16));
   Print("M_PI_4 = ",DoubleToString(M_PI_4,16));
   Print("M_1_PI = ",DoubleToString(M_1_PI,16));
   Print("M_2_PI = ",DoubleToString(M_2_PI,16));
   Print("M_2_SQRTPI = ",DoubleToString(M_2_SQRTPI,16));
   Print("M_SQRT2 = ",DoubleToString(M_SQRT2,16));
   Print("M_SQRT1_2 = ",DoubleToString(M_SQRT1_2,16));
}

 

Константы числовых типов данных

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

Константа

Описание

Значение

CHAR_MIN

Минимальное значение, которое может быть представлено типом char

-128

CHAR_MAX

Максимальное значение, которое может быть представлено типом char

127

UCHAR_MAX

Максимальное значение, которое может быть представлено типом uchar

255

SHORT_MIN

Минимальное значение, которое может быть представлено типом short

-32768

SHORT_MAX

Максимальное значение, которое может быть представлено типом short

32767

USHORT_MAX

Максимальное значение, которое может быть представлено типом ushort

65535

INT_MIN

Минимальное значение, которое может быть представлено типом int

-2147483648

INT_MAX

Максимальное значение, которое может быть представлено типом int

2147483647

UINT_MAX

Максимальное значение, которое может быть представлено типом uint

4294967295

LONG_MIN

Минимальное значение, которое может быть представлено типом long

-9223372036854775808

LONG_MAX

Максимальное значение, которое может быть представлено типом long

9223372036854775807

ULONG_MAX

Максимальное значение, которое может быть представлено типом ulong

18446744073709551615

DBL_MIN

Минимальное положительное значение, которое может быть  представлено типом double

2.2250738585072014e-308

DBL_MAX

Максимальное значение, которое может быть представлено типом double

1.7976931348623158e+308

DBL_EPSILON

Наименьшее число для которого выполняется условие 1.0+DBL_EPSILON != 1.0

2.2204460492503131e-016

DBL_DIG

Количество значимых десятичных знаков

15

DBL_MANT_DIG

Количество битов в мантиссе

53

DBL_MAX_10_EXP

Максимальное десятичное значение степени экспоненты

308

DBL_MAX_EXP

Максимальное двоичное значение степени экспоненты

1024

DBL_MIN_10_EXP

Минимальное десятичное значение степени экспоненты

(-307)

DBL_MIN_EXP

Минимальное двоичное значение степени экспоненты

(-1021)

FLT_MIN

Минимальное положительное значение, которое может быть  представлено типом float

1.175494351e-38

FLT_MAX

Максимальное значение, которое может быть представлено типом float

3.402823466e+38

FLT_EPSILON

Наименьшее число для которого выполняется условие 1.0+FLT_EPSILON != 1.0

1.192092896e–07

FLT_DIG

Количество значимых десятичных знаков

6

FLT_MANT_DIG

Количество битов в мантиссе

24

FLT_MAX_10_EXP

Максимальное десятичное значение степени экспоненты

38

FLT_MAX_EXP

Максимальное двоичное значение степени экспоненты

128

FLT_MIN_10_EXP

Минимальное десятичное значение степени экспоненты

-37

FLT_MIN_EXP

Минимальное двоичное значение степени экспоненты

(-125)

Пример:

void OnStart()
{
   //--- выведем значения констант
   printf("CHAR_MIN = %d",CHAR_MIN);
   printf("CHAR_MAX = %d",CHAR_MAX);
   printf("UCHAR_MAX = %d",UCHAR_MAX);
   printf("SHORT_MIN = %d",SHORT_MIN);
   printf("SHORT_MAX = %d",SHORT_MAX);
   printf("USHORT_MAX = %d",USHORT_MAX);
   printf("INT_MIN = %d",INT_MIN);
   printf("INT_MAX = %d",INT_MAX);
   printf("UINT_MAX = %u",UINT_MAX);
   printf("LONG_MIN = %I64d",LONG_MIN);
   printf("LONG_MAX = %I64d",LONG_MAX);
   printf("ULONG_MAX = %I64u",ULONG_MAX);
   printf("EMPTY_VALUE = %.16e",EMPTY_VALUE);
   printf("DBL_MIN = %.16e",DBL_MIN);
   printf("DBL_MAX = %.16e",DBL_MAX);
   printf("DBL_EPSILON = %.16e",DBL_EPSILON);
   printf("DBL_DIG = %d",DBL_DIG);
   printf("DBL_MANT_DIG = %d",DBL_MANT_DIG);
   printf("DBL_MAX_10_EXP =  %d",DBL_MAX_10_EXP);
   printf("DBL_MAX_EXP = %d",DBL_MAX_EXP);
   printf("DBL_MIN_10_EXP = %d",DBL_MIN_10_EXP);
   printf("DBL_MIN_EXP = %d",DBL_MIN_EXP);
   printf("FLT_MIN = %.8e",FLT_MIN);
   printf("FLT_MAX = %.8e",FLT_MAX);
   printf("FLT_EPSILON = %.8e",FLT_EPSILON);
}

 

Причины деинициализации

Коды причины деинициализации эксперта, возвращаемые функцией UninitializeReason(). Могут иметь любые из следующих значений:

Константа

Значение

Описание

REASON_PROGRAM

0

Эксперт прекратил свою работу, вызвав функцию ExpertRemove()

REASON_REMOVE

1

Программа удалена с графика

REASON_RECOMPILE

2

Программа перекомпилирована

REASON_CHARTCHANGE

3

Символ или период графика был изменен

REASON_CHARTCLOSE

4

График закрыт

REASON_PARAMETERS

5

Входные параметры были изменены пользователем

REASON_ACCOUNT

6

Активирован другой счет либо произошло переподключение к торговому серверу вследствие изменения настроек счета

REASON_TEMPLATE

7

Применен другой шаблон графика

REASON_INITFAILED

8

Признак того, что обработчик OnInit() вернул ненулевое значение

REASON_CLOSE

9

Терминал был закрыт

Код причины деинициализации передается также в качестве параметра предопределенной функции OnDeinit(const int reason).

Пример:

//+------------------------------------------------------------------+
//| get text description                                             |
//+------------------------------------------------------------------+
string getUninitReasonText(int reasonCode)
{
   string text="";

   switch(reasonCode)
   {
      case REASON_ACCOUNT:
         text="Account was changed";break;
      case REASON_CHARTCHANGE:
         text="Symbol or timeframe was changed";break;
      case REASON_CHARTCLOSE:
         text="Chart was closed";break;
      case REASON_PARAMETERS:
         text="Input-parameter was changed";break;
      case REASON_RECOMPILE:
         text="Program "+__FILE__+" was recompiled";break;
      case REASON_REMOVE:
         text="Program "+__FILE__+" was removed from chart";break;
      case REASON_TEMPLATE:
         text="New template was applied to chart";break;
      default:text="Another reason";
   }

   return text;
}

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   //--- Первый способ получить код причины деинициализации
   Print(__FUNCTION__,"_Код причины деинициализации = ",reason);

   //--- Второй способ получить код причины деинициализации
   Print(__FUNCTION__,"_UninitReason = ",getUninitReasonText(_UninitReason));
}

Проверка указателя объекта

Для проверки типа указателя объекта предназначена функция CheckPointer(), которая возвращает значение из перечисления ENUM_POINTER_TYPE. В случае использования некорректного указателя исполнение программы будет немедленно прервано.

Объекты, созданные оператором new, имеют тип POINTER_DYNAMIC. Только для таких указателей можно и нужно использовать оператор уничтожения delete().

Все остальные указатели имеют тип POINTER_AUTOMATIC, что означает, что данный объект был создан автоматически средой исполнения mql5-программы. Такие объекты уничтожаются после использования также автоматически.

ENUM_POINTER_TYPE

Константа

Описание

POINTER_INVALID

Некорректный указатель

POINTER_DYNAMIC

Указатель объекта, созданного оператором new

POINTER_AUTOMATIC

Указатель любого объекта, созданного автоматически (без использования new())

 

Прочие константы

Константа CLR_NONE служит для указания отсутствия цвета, то есть графический объект или графическая серия индикатора не будут отображены. Эта константа не вошла в список констант с наименованиями Web-цветов, но может применяться везде, где требуется указание цвета.

Константа INVALID_HANDLE может использоваться при проверке файловых хэндлов (см. функции FileOpen() и FileFindFirst()).

Константа

Описание

Значение

CHARTS_MAX

Максимально возможное количество одновременно открытых графиков в терминале

100

clrNONE

Отсутствие цвета

-1

EMPTY_VALUE

Пустое значение в индикаторном буфере

DBL_MAX

INVALID_HANDLE

Некорректный хэндл

-1

IS_DEBUG_MODE

Признак работы mq5-программы в режиме отладки

в режиме отладки не равно нулю, в противном случае 0

IS_PROFILE_MODE

Признак работы mq5-программы в режиме профилирования

в режиме профилирования не равно нулю, в противном случае 0

NULL

Ноль любого типа

0

WHOLE_ARRAY

Означает количество элементов, оставшееся до конца массива, то есть, будет обработан весь массив

-1

WRONG_VALUE

Константа может неявно приводиться к типу любого перечисления.

-1

Константа EMPTY_VALUE обычно соответствует тем значениям индикаторов, которые не отрисовываются на графике. Например, для встроенного индикатора Standard Deviation с периодом 20 не выводится на график линия для первых в истории 19 баров. Если создать хэндл этого индикатора с помощью функции iStdDev() и  скопировать в массив значения индикатора для этих баров через CopyBuffer(), то эти значения как раз и будут равны EMPTY_VALUE.

Можно самостоятельно указать в пользовательском индикаторе собственное пустое значение индикатора, при котором не должна производиться отрисовка на графике. Для этого используйте функцию PlotIndexSetDouble() с модификатором PLOT_EMPTY_VALUE.

Константа NULL может быть присвоена переменной любого простого типа или указателю на объект структуры или класса. Присвоение NULL строковой переменной означает полную деинициализацию этой переменной.

Константа WRONG_VALUE предназначена для тех случаев, когда требуется вернуть значение перечисления, и это должно быть неверное значение. Например, нужно сообщить, что возвращаемое значение является значением этого перечисления. Приведем в качестве иллюстрации некую функцию CheckLineStyle(), которая возвращает стиль линии для объекта, указанного по имени. Если при запросе стиля функцией ObjectGetInteger() результатом будет true, то вернется значение перечисления ENUM_LINE_STYLE, иначе возвращается WRONG_VALUE.

Пример:

void OnStart()
{
   if(CheckLineStyle("MyChartObject")==WRONG_VALUE)
      printf("Error line style getting.");
}

//+------------------------------------------------------------------+
//| возвращает стиль линии для объекта, указанного по имени          |
//+------------------------------------------------------------------+
ENUM_LINE_STYLE CheckLineStyle(string name)
{
   long style;

   if(ObjectGetInteger(0,name,OBJPROP_STYLE,0,style))
      return((ENUM_LINE_STYLE)style);
   else
      return(WRONG_VALUE);
}

 

Константа WHOLE_ARRAY предназначена для функций, которые требуют указания количества элементов в обрабатываемых массивах:

  • ArrayCopy();
  • ArrayMinimum();
  • ArrayMaximum();
  • FileReadArray();
  • FileWriteArray().

Если требуется указать, что необходимо обработать все значения массива с указанной позиции и до конца, то достаточно указать значение WHOLE_ARRAY.

Константа IS_PROFILE_MODE позволяет изменить работу программы для корректного сбора информации в режиме профилирования. Профилирование позволяет замерить время выполнения отдельных фрагментов программы (обычно это функции), а также подсчитать количество таких вызовов. Для корректного получения информации о времени выполнения в режиме профилировки можно отключить вызовы функции Sleep() как в примере:

//--- Sleep может сильно повлиять(исказить) на результат профилировки
if(!IS_PROFILE_MODE) Sleep(100); // запрещаем вызов Sleep() в режиме профилировки

Значение константы IS_PROFILE_MODE задается компилятором в момент компиляции, и в обычном режиме выставляется равным нулю. При запуске программы в режиме профилирования производится специальная компиляция, и в этом случае вместо IS_PROFILE_MODE подставляется значение отличное от нуля.

Константа IS_DEBUG_MODE пригодится в тех случаях, когда необходимо немного изменить работу mql5-программы в режиме отладки. Например, в режиме отладки может потребоваться выводить дополнительную отладочную информацию в лог терминала или создавать вспомогательные графические объекты на графике.

Приведенный ниже пример создает объект Label и задает ее описание и цвет в зависимости от того, в каком режиме выполняется скрипт. Для того чтобы запустить скрипт в режиме отладки из MetaEditor, нажмите клавишу F5. Если запустить скрипта из окна навигатора в терминале, то цвет и текст объекта Label будут другими.

Пример:

//+------------------------------------------------------------------+
//|                                             Check_DEBUG_MODE.mq5 |
//|                      Copyright © 2009, MetaQuotes Software Corp. |
//|                                        https://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, MetaQuotes Software Corp."
#property link      "https://www.metaquotes.net"

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   string label_name="invisible_label";
   if(ObjectFind(0,label_name)<0)
   {
      Print("Object ",label_name," not found. Error code = ",GetLastError());

      //--- создадим объект Label
      ObjectCreate(0,label_name,OBJ_LABEL,0,0,0);

      //--- установим координату X
      ObjectSetInteger(0,label_name,OBJPROP_XDISTANCE,200);

      //--- установим координату Y
      ObjectSetInteger(0,label_name,OBJPROP_YDISTANCE,300);
      ResetLastError();

      if(IS_DEBUG_MODE) // режим отладки
      {
         //--- выведем сообщение о режиме выполнения скрипта
         ObjectSetString(0,label_name,OBJPROP_TEXT,"DEBUG MODE");

         //--- зададим красный цвет текста
         if(!ObjectSetInteger(0,label_name,OBJPROP_COLOR,clrRed))
            Print("Не удалось установить цвет. Ошибка ",GetLastError());
      }
      else              // рабочий режим
      {
         ObjectSetString(0,label_name,OBJPROP_TEXT,"RELEASE MODE");

         //--- зададим невидимый цвет текста
         if(!ObjectSetInteger(0,label_name,OBJPROP_COLOR,CLR_NONE))
            Print("Не удалось установить цвет. Ошибка ",GetLastError());
      }
      ChartRedraw();
      DebugBreak();    // здесь произойдет прерывание, если мы в режиме отладки
   }
}

 

Методы шифрования данных

Для указания метода преобразования данных (шифрование и расчет хешей) в функциях CryptEncode() и CryptDecode() используется перечисление ENUM_CRYPT_METHOD.

ENUM_CRYPT_METHOD

Константа

Описание

CRYPT_BASE64

Шифрование BASE64 (перекодировка)

CRYPT_AES128

Шифрование AES с ключом 128 бит (16 байт)

CRYPT_AES256

Шифрование AES с ключом 256 бит (32 байта)

CRYPT_DES

Шифрование DES с ключом 56 бит (7 байт)

CRYPT_HASH_SHA1

Расчёт HASH SHA1

CRYPT_HASH_SHA256

Расчёт HASH SHA256

CRYPT_HASH_MD5

Расчёт HASH MD5

CRYPT_ARCH_ZIP

ZIP архивирование