Input переменные

Класс памяти input определяет внешнюю переменную. Модификатор input указывается перед типом данных. Изменять значение переменной с модификатором input внутри mql5-программы нельзя, такие переменные доступны только для чтения. Изменять значения input-переменных может только пользователь из окна свойств программы. Внешние переменные всегда переинициализируются непосредственно перед вызовом OnInit().  

Максимальная длина имени input-переменных составляет 63 символа. При этом для входного параметра типа string максимальная длина значения (длина строки) может иметь размер от 191 до 253 символов (смотри Примечание). Минимальная длина – 0 символов (значение не задано).

Пример:

//--- input parameters
input int            MA_Period=13;
input int            MA_Shift=0;
input ENUM_MA_METHOD MA_Method=MODE_SMMA;

Input переменные определяют входные параметры программы, они доступны из окна свойств программы.

Установка значения для input-параметра

 

Существует возможность задать иной способ отображения имен входных параметров на закладке "Inputs". Для этого используется строчный комментарий, который должен располагаться после описания входного параметра в той же строке. Таким образом, входным параметрам можно сопоставить более понятные для пользователя имена.

Пример:

//--- input parameters
input int            InpMAPeriod=13;         // Smoothing period
input int            InpMAShift=0;           // Line horizontal shift
input ENUM_MA_METHOD InpMAMethod=MODE_SMMA;  // Smoothing method

Человечный способ отображения входных параметров

Примечание: Массивы и переменные сложных типов не могут выступать в качестве input-переменных.

Примечание: Длина строчного комментария для Input переменных не может превышать 63 символа.

Примечание: Для input-переменных типа string ограничение на длину значения (длину строки) задается следующими условиями:

  • значение параметра представлется строкой "имя_параметра=значение_параметра"(символ '=' учитывается),
  • максимальная длина представления 255 символов (total_length_max=255 или 254 символа без учета '='),
  • максимальная длина имени строкового параметра parameter_name_length = 63 символа.

Таким образом, максимальный размер строки для string-параметра можно вычислить по формуле:

parameter_value_length=total_length_max-parameter_name_length=254-parameter_name_length

Это дает максимальный размер строки от 191 (parameter_name_length=63) до 253 символов (parameter_name_length=1).

 

Передача параметров при вызове пользовательских индикаторов из mql5-программ #

Пользовательские индикаторы вызываются при помощи функции iCustom(). При этом после имени пользовательского индикатора должны идти параметры в точном соответствии с объявлением input-переменных данного пользовательского индикатора. Если параметров указывается меньше, чем объявлено input-переменных в вызываемом пользовательском индикаторе, то недостающие параметры заполняются значениями, указанными при объявлении переменных.

Если в пользовательском индикаторе используется функция OnCalculate первого вида (то есть, индикатор считается на одном массиве данных), то в качестве последнего параметра при вызове такого пользовательского индикатора должно выступать одно из значений ENUM_APPLIED_PRICE либо хэндл другого индикатора. При этом все параметры, соответствующие input-переменным, должны быть явно указаны.

Перечисления в качестве input-параметра

В качестве input-переменных (входных параметров для mql5-программ) можно использовать не только предусмотренные языком MQL5 встроенные перечисления, но и перечисления, заданные пользователем. Например, мы можем создать перечисление dayOfWeek, описывающее дни недели, и использовать input-переменную для указания конкретного дня недели не в виде цифры, а в более привычном для пользователя виде.

Пример:

#property script_show_inputs
//--- day of week
enum dayOfWeek 
  {
   S=0,     // Sunday
   M=1,     // Monday
   T=2,     // Tuesday
   W=3,     // Wednesday
   Th=4,    // Thursday
   Fr=5,    // Friday,
   St=6,    // Saturday
  };
//--- input parameters
input dayOfWeek swapday=W;

Для того чтобы при запуске скрипта пользователь мог выбрать нужное значение из окна свойств, мы используем команду препроцессора #property script_show_inputs. Запускаем скрипт на исполнение и можем выбрать из списка одно из значений перечислений dayOfWeek. Запускаем скрипт EnumInInput и переходим на закладку "Параметры". По умолчанию, значение параметра swapday (день начисления тройного свопа) является среда (W=3), но мы можем задать любое другое значение и использовать это значение для изменения работы программы.

Пример пользовательского перечисления в качестве input-параметра

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

Каждое значение из перечисления dayOfWeek имеет свое значение от 0 до 6, но в списке параметров будут показаны комментарии, указанные для каждого значения. Это дает дополнительную гибкость для написания программ с понятными описаниями входных параметров.

 

Переменные с модификатором sinput #

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

В некоторых случаях бывает необходимо исключить некоторые внешние параметры программы из формирования области всех возможных проходов в тестере. Специально для таких случаев существует модификатор памяти sinput. sinput - это сокращенное написание объявления статической внешней переменной: sinput = static input. То есть такое объявление в коде советника

sinput       int layers=6;   // Количество слоев

будет эквивалентно  полному объявлению

static input int layers=6;   // Количество слоев

Переменная, объявленная с модификатором sinput, является входным параметром MQL5-программы, значение этого параметра можно изменять при её запуске. Но при этом данная переменная не участвует в процессе оптимизации входных параметров, то есть не производится перебор её значений при поиске наилучшего набора параметров по заданному критерию.

Отображение sinput-параметра в тестере стратегий

На рисунке показано, что эксперт имеет 5 внешних параметров, из них параметр "Количество слоев" объявлен как sinput и равен 6. Этот параметр не может изменяться в процедуре оптимизации торговой стратегии, для него возможно установить нужное значение, которое и будет использоваться. Поля Старт, Шаг и Стоп для такой переменной не доступны для установки значений.

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

Но при этом есть одно исключение из данного правила – sinput-переменные можно варьировать в задачах оптимизации с помощью функции ParameterSetRange(). Данная функция создана специально для программного управления пространством доступных значений для любых input-переменных, в том числе и объявленных как static input (sinput). Другая функция ParameterGetRange() позволяет при запуске оптимизации (в обработчике OnTesterInit()) получить значения input-переменных и в случае необходимости переопределить шаг изменения и диапазон, в пределах которого будет перебираться значение оптимизируемого параметра.

Таким образом, сочетание модификатора sinput и двух функций по работе с input-параметрами позволяет создавать гибкие правила для задания интервалов оптимизации одних input-переменных в зависимости от значения других input-переменных.

 

Группировка входных параметров #

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

input group           "Имя группы"
input int             variable1 = ...
input double          variable2 = ...
input double          variable3= ...

Все входные параметры после такого объявления визуально объединяются в указанную группу, что позволяет упростить для пользователя MQL5-программы настройку параметров при запуске на графике или в тестере стратегий.  Указание каждой группы действует до появления нового объявления группы:

input group           "Имя группы #1"
input int             group1_var1 = ...
input double          group1_var2 = ...
input double          group1_var3 = ...
 
input group           "Имя группы #2
input int             group2_var1 = ...
input double          group2_var2 = ...
input double          group2_var3 = ...

Пример советника, у которого блок входных параметров разбит по их назначению:

input group           "Signal"
input int             ExtBBPeriod   = 20;       // Bollinger Bands period
input double          ExtBBDeviation2.0;      // deviation
input ENUM_TIMEFRAMES ExtSignalTF=PERIOD_M15;   // BB timeframe
 
input group           "Trend"
input int             ExtMAPeriod   = 13;       // Moving Average period
input ENUM_TIMEFRAMES ExtTrendTF=PERIOD_M15;    // MA timeframe
 
input group           "ExitRules"
input bool            ExtUseSL      = true;     // use StopLoss
input int             Ext_SL_Points = 50;       // StopLoss in points
input bool            ExtUseTP      = false;    // use TakeProfit
input int             Ext_TP_Points = 100;      // TakeProfit in points
input bool            ExtUseTS      = true;     // use Trailing Stop
input int             Ext_TS_Points = 30;       // Trailing Stop in points
 
input group           "MoneyManagement"
sinput double         ExtInitialLot = 0.1;      // initial lot value
input bool            ExtUseAutoLot = true;     // automatic lot calculation
 
input group           "Auxiliary"
sinput int            ExtMagicNumber = 123456;  // EA Magic Number
sinput bool           ExtDebugMessagetrue;    // print debug messages

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

Группировка входных параметров советника в тестере стратегий

 

Смотри также

iCustom, Перечисления, Свойства программ