Получение настроек индикатора по его дескриптору

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

int IndicatorParameters(int handle, ENUM_INDICATOR &type, MqlParam &params[])

Функция возвращает по указанному дескриптору количество входных параметров индикатора, а также их типы и сами значения.

При успешном выполнении функция заполняет переданный ей массив params, а тип индикатора сохраняется в параметре type.

В случае ошибки функция возвращает -1.

В качестве примера работы с данной функцией усовершенствуем индикатор UseDemoAllLoop.mq5, представленный в разделе про Удаление экземпляров индикаторов. Новую версию назовем UseDemoAllParams.mq5.

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

// UseDemoAllLoop.mq5
void OnTimer()
{
   ...
   Comment("DemoAll: ", (IndicatorSelector == iCustom_ ? IndicatorCustom : s),
      "(default-params)");
   ...
}

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

// UseDemoAllParams.mq5
void OnTimer()
{
   ...   
   // читаем параметры, примененные индикатором по умолчанию
   ENUM_INDICATOR itype;
   MqlParam defParams[];
   const int p = IndicatorParameters(HandleitypedefParams);
   ArrayPrint(defParams);
   Comment("DemoAll: ", (IndicatorSelector == iCustom_ ? IndicatorCustom : s),
      "(" + MqlParamStringer::stringify(defParams) + ")");
   ...
}

Преобразование массива MqlParam в строку поручено выделенному классу MqlParamStringer (см. файл MqlParamStringer.mqh).

class MqlParamStringer
{
public:
   static string stringify(const MqlParam &param)
   {
      switch(param.type)
      {
      case TYPE_BOOL:
      case TYPE_CHAR:
      case TYPE_UCHAR:
      case TYPE_SHORT:
      case TYPE_USHORT:
      case TYPE_DATETIME:
      case TYPE_COLOR:
      case TYPE_INT:
      case TYPE_UINT:
      case TYPE_LONG:
      case TYPE_ULONG:
         return IntegerToString(param.integer_value);
      case TYPE_FLOAT:
      case TYPE_DOUBLE:
         return (string)(float)param.double_value;
      case TYPE_STRING:
         return param.string_value;
      }
      return NULL;
   }
   
   static string stringify(const MqlParam &params[])
   {
      string result = "";
      const int p = ArraySize(params);
      for(int i = 0i < p; ++i)
      {
         result += stringify(params[i]) + (i < p - 1 ? "," : "");
      }
      return result;
   }
};

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

Для единственного пользовательского индикатора из списка (LifeCycle) первый параметр будет содержать путь и имя файла индикатора. Второй параметр описан в исходном коде как целое число. А вот третий параметр интересен тем, что он неявно описывает свойство Применить к, присущее всем индикаторам с краткой формой обработчика OnCalculate. В данном случае, по умолчанию, индикатор применяется к PRICE_CLOSE (значение 1).

Initializing LifeCycle() EURUSD, PERIOD_H1

Handle=10

    [type] [integer_value] [double_value] [string_value]

[0]     14               0        0.00000 "Indicators\MQL5Book\p5\LifeCycle.ex5"

[1]      7               0        0.00000 null

[2]      7               1        0.00000 null

Initializing iAlligator_jawP_jawS_teethP_teethS_lipsP_lipsS_method_price() EURUSD, PERIOD_H1

iAlligator_jawP_jawS_teethP_teethS_lipsP_lipsS_method_price requires 8 parameters, 0 given

Handle=10

    [type] [integer_value] [double_value] [string_value]

[0]      7              13        0.00000 null          

[1]      7               8        0.00000 null          

[2]      7               8        0.00000 null          

[3]      7               5        0.00000 null          

[4]      7               5        0.00000 null          

[5]      7               3        0.00000 null          

[6]      7               2        0.00000 null          

[7]      7               5        0.00000 null          

Initializing iAMA_period_fast_slow_shift_price() EURUSD, PERIOD_H1

iAMA_period_fast_slow_shift_price requires 5 parameters, 0 given

Handle=10

    [type] [integer_value] [double_value] [string_value]

[0]      7               9        0.00000 null          

[1]      7               2        0.00000 null          

[2]      7              30        0.00000 null          

[3]      7               0        0.00000 null          

[4]      7               1        0.00000 null          

 

Согласно журналу, настройки встроенных индикаторов также соответствуют умолчаниям.