Manejadores y contadores de propietarios de indicadores

El trabajo programático con indicadores requiere operar con manejadores. Se puede establecer aquí un paralelismo con los descriptores de archivo (véase la sección Abrir y cerrar archivos): allí utilizamos la función File Open para informar al sistema sobre el nombre del archivo y los modos de apertura, tras lo cual el descriptor sirvió de «pase» para todas las demás funciones de archivo.

El sistema de descriptores de indicadores tiene varias finalidades.

Permite indicar de antemano al terminal qué indicador debe lanzar y qué series temporales debe calcular. Dado que se requiere cierto tiempo para descargar los datos históricos iniciales y calcular el indicador (al menos durante la solicitud inicial), junto con la asignación de recursos (memoria, gráficos), los puntos en los que se crea el indicador y en los que está listo son diferentes. El descriptor es un vínculo entre ellos. Se trata de una especie de vínculo al objeto terminal interno que almacena el conjunto de propiedades que establecimos al crear el indicador y su estado actual.

Por supuesto, para trabajar con descriptores, el terminal necesita mantener una tabla determinada de todos los indicadores solicitados y sus propiedades. Sin embargo, el terminal no proporciona información sobre el número real en la tabla general: en lugar de ello, cada programa forma su propia lista privada de indicadores que se le han solicitado. Las entradas de esta lista se refieren a los elementos de la tabla general, y el descriptor es sólo un número en la lista.

Por lo tanto, puede haber indicadores completamente distintos detrás de los mismos descriptores en programas diferentes. Así, no tiene sentido transferir los valores de los descriptores entre programas.

Los descriptores forman parte del sistema de gestión de recursos de los terminales, ya que excluyen la duplicación de instancias de indicador con las mismas características, siempre que sea posible. En otras palabras: todos los indicadores integrados y personalizados creados mediante programación, manualmente o a partir de plantillas tpl se almacenan en caché.

Antes de crear una nueva instancia de indicador, el terminal comprueba si existe un indicador idéntico entre los de la caché. Los siguientes criterios se aplican a la hora de buscar una copia:

  • Carácter y periodo que coincidan
  • Parámetros que coincidan

Para los indicadores personalizados, además debe coincidir lo siguiente:

  • La ruta en disco (como cadena, sin normalización a forma absoluta)
  • El gráfico en el que se está ejecutando el indicador (cuando se crea un indicador a partir de un programa MQL, el indicador que se está creando hereda el gráfico del programa que lo crea).

Los indicadores integrados se almacenan en caché por símbolo y, por lo tanto, sus instancias pueden asignarse para su uso por separado en distintos gráficos (con el mismo símbolo/marco temporal).

Tenga en cuenta que no se pueden crear manualmente dos indicadores idénticos en el mismo gráfico. Distintas instancias del programa pueden solicitar el mismo indicador, en cuyo caso sólo se creará una copia del mismo y se proporcionará a ambos programas.

Para cada combinación única de condiciones, el terminal mantiene un contador: tras la primera solicitud de creación de un indicador específico, su contador es igual a 1, y en las siguientes, aumenta en 1 (no se crea una copia del indicador). Cuando se libera un indicador, su contador disminuye en 1. El indicador sólo se descarga cuando se pone a cero el contador, es decir, cuando todos sus propietarios se niegan explícitamente a utilizarlo.

Debe tenerse en cuenta que múltiples llamadas a la función de construcción de indicadores con los mismos parámetros (incluyendo símbolo/marco temporal) dentro del mismo programa MQL no conducen a múltiples incrementos en el contador de referencia: el contador se incrementará sólo una vez. En consecuencia, para cada valor del manejador, basta con una llamada a la función de liberación (IndicatorRelease). Todas las demás llamadas son superfluas y devuelven un error porque no tienen nada que liberar.

Además de crear indicadores utilizando iCustom e IndicatorCreate en MQL5, es posible obtener el control de un indicador de terceros (ya existente). Esto puede hacerse utilizando la función ChartIndicatorGet, que estudiaremos en el capítulo sobre gráficos. Es importante señalar aquí que la adquisición de un manejador de esta manera también aumentará su recuento de referencias e impedirá la descarga a menos que el manejador se libere a continuación.

Si el programa creó indicadores subordinados, sus manejadores serán liberados automáticamente (el contador disminuye en 1) cuando este programa se descargue, incluso si no se llama a la función IndicatorRelease.