Obtener la configuración del indicador por su manejador

A veces un programa MQL necesita conocer los parámetros de una instancia de indicador en ejecución. Estos pueden ser indicadores de terceros en el gráfico, o un manejador pasado desde el programa principal a la biblioteca o el archivo de encabezado. Para ello, MQL5 proporciona la función IndicatorParameters.

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

Mediante el manejador especificado, la función devuelve el número de parámetros de entrada del indicador, así como sus tipos y valores.

En caso de éxito, la función rellena el array params que se le ha pasado, y el tipo de indicador se guarda en el parámetro type.

En caso de error, la función devuelve -1.

Como ejemplo del trabajo con esta función, vamos a mejorar el indicador UseDemoAllLoop.mq5 presentado en la sección sobre Borrar instancias de indicadores. Llamemos a la nueva versión UseDemoAllParams.mq5.

Como recordará, creamos secuencialmente algunos indicadores integrados en el bucle de la lista y dejamos vacía la lista de parámetros, lo que provoca que los indicadores utilicen algunos valores predeterminados desconocidos. A este respecto, mostramos un prototipo generalizado en un comentario sobre el gráfico: con un nombre, pero sin valores específicos.

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

Ahora tenemos la oportunidad de averiguar sus parámetros basándonos en el manejador del indicador y mostrárselos al usuario.

// UseDemoAllParams.mq5
void OnTimer()
{
   ...   
   // read the parameters applied by the indicator by default
   ENUM_INDICATOR itype;
   MqlParam defParams[];
   const int p = IndicatorParameters(HandleitypedefParams);
   ArrayPrint(defParams);
   Comment("DemoAll: ", (IndicatorSelector == iCustom_ ? IndicatorCustom : s),
      "(" + MqlParamStringer::stringify(defParams) + ")");
   ...
}

La conversión del array MqlParam en una cadena se implementa en la clase especial MqlParamStringer (véase el archivo 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;
   }
};

Después de compilar y ejecutar el nuevo indicador, puede asegurarse de que la lista específica de parámetros del indicador que se está renderizando aparece ahora en la esquina superior izquierda del gráfico.

Para un único indicador personalizado de la lista (LifeCycle), el primer parámetro contendrá la ruta y el nombre de archivo del indicador. El segundo parámetro se describe en el código fuente como un número entero, pero el tercer parámetro es interesante porque describe implícitamente la propiedad «Aplicar a», que es inherente a todos los indicadores con una forma abreviada del manejador OnCalculate. En este caso, por defecto, el indicador se aplica a PRICE_CLOSE (valor 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

 

Según el registro, los ajustes de los indicadores integrados también corresponden a los predeterminados.