Необязательные параметры

MQL5 предоставляет возможность при описании функции указать для параметров значения по умолчанию. Для этого используется синтаксис инициализации, то есть литерал соответствующего типа справа от параметра, после знака '='. Например:

void function(int value = 0);

При вызове функции аргументы для таких параметров можно не указывать. Тогда их значения будут установлены равными величинам по умолчанию. Подобные параметры называются необязательными (опциональными).

Необязательные параметры должны располагаться в конце списка параметров. Иными словами, если i-й параметр описан с инициализацией, то все последующие также должны её иметь. В противном случае выдается ошибка компиляции "пропущено значение по умолчанию для параметра" ("missing default value for parameter"). Ниже показано описание функции с такой проблемой.

double Largest(const double v1const double v2 = -DBL_MAX,
               const double v3);

Решений два: либо параметр v3 также должен иметь значение по умолчанию, либо параметр v2 должен стать обязательным.

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

Рассмотрим функцию поиска максимального числа из трех. Первый параметр — обязательный, два последних — опциональные и равны по умолчанию минимально возможному числу типа double. Таким образом, каждый из них в отсутствии явно переданного значения будет заведомо меньше (или, в крайнем случае, равен) всех остальных параметров.

double Largest(const double v1const double v2 = -DBL_MAX,
               const double v3 = -DBL_MAX)
{
   return v1 > v2 ? (v1 > v3 ? v1 : v3) : (v2 > v3 ? v2 : v3);
}

Вот как её можно вызвать:

Print(Largest(1));       // ok: 1
Print(Largest(0, -2));   // ok: 0
Print(Largest(123)); // ok: 3

С помощью необязательных параметров в MQL5 реализуется концепция функций с переменным количеством параметров в пользовательских функциях.

MQL5 не поддерживает синтаксис определения функций с переменным числом параметров с помощью многоточия (ellipsis), как в C++. Вместе с тем, в MQL5 API существуют встроенные функции, которые описаны с использованием многоточия и принимают переменное количество произвольных параметров. В частности, к ним относится известная нам функция Print. Её прототип выглядит так: void Print(argument, ...). Поэтому мы можем вызвать её, указав через запятую вплоть до 64 аргументов (за исключением массивов) и она отобразит их в журнале.