Все используемые в языке 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)<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.
Константа |
Описание |
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 архивирование |
—