Все используемые в языке 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 | Применен другой шаблон графика |
| 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)
Методы шифрования данных
Для указания метода преобразования данных (шифрование и расчет хешей) в функциях CryptEncode() и CryptDecode() используется перечисление 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 архивирование
—