- Principales características de los indicadores
- Evento indicador principal: OnCalculate
- Dos tipos de indicadores: para la ventana principal y para la subventana
- Ajuste del número de buffers y gráficos
- Asignación de un array como buffer: SetIndexBuffer
- Configuración de plot: PlotIndexSetInteger
- Reglas de asignación de buffers y gráficos
- Aplicación de directivas para personalizar plots
- Configuración de nombres de plots
- Visualización de las carencias de datos (elementos vacíos)
- Indicadores de subventanas independientes: tamaños y niveles
- Propiedades generales de los indicadores: precisión del título y del valor
- Coloreado de gráficos por elementos
- Omitir dibujo en barras iniciales
- Esperar datos y gestionar la visibilidad (DRAW_NONE)
- Indicadores multidivisa y multitemporal
- Seguimiento de formación de barras
- Comprobación de indicadores
- Limitaciones y ventajas de los indicadores
- Crear un borrador de indicador en el Asistente MQL
Configuración de trazado: PlotIndexSetInteger
La API de MQL5 proporciona las siguientes funciones para configurar los trazados: PlotIndexSetInteger, PlotIndexSetDouble y PlotIndexSetString. Las propiedades de tipo entero también pueden leerse a través de PlotIndexGetInteger. Nos interesan sobre todo las propiedades de tipo entero.
La función PlotIndexSetInteger tiene dos formas. Veremos sus diferencias un poco más adelante.
bool PlotIndexSetInteger(int index, ENUM_PLOT_PROPERTY_INTEGER property, int value)
bool PlotIndexSetInteger(int index, ENUM_PLOT_PROPERTY_INTEGER property, int modifier,
int value)
La función establece el valor de la propiedad de un trazado gráfico en la dirección index especificada. El valor de index debe estar comprendido entre 0 y P - 1, donde P es el número de trazados especificado por la directiva #property indicator_plots. La propiedad en sí se identifica mediante el parámetro property: los valores permitidos deben tomarse de la enumeración ENUM_PLOT_PROPERTY_INTEGER (véase más abajo). El valor de la propiedad se pasa en el parámetro value.
La segunda forma de la función se utiliza para las propiedades que se aplican a varios componentes (aunque pertenezcan a la misma propiedad). En particular, para algunos tipos de diagramas, es posible asignar un conjunto de colores en lugar de un color. En este caso, puede utilizar el parámetro modifier para cambiar cualquier color de este conjunto.
En caso de éxito, la función devuelve true; en caso contrario, devuelve false.
En la siguiente tabla se muestran las propiedades ENUM_PLOT_PROPERTY_INTEGER disponibles.
Identificador |
Descripción |
Tipo de propiedad |
---|---|---|
PLOT_ARROW |
Código de flecha de la fuente Wingdings para gráficos DRAW_ARROW |
uchar |
PLOT_ARROW_SHIFT |
Desplazamiento vertical de la flecha para gráficos DRAW_ARROW |
int |
PLOT_DRAW_BEGIN |
Índice de la primera barra (de izquierda a derecha) donde comienzan los datos |
int |
PLOT_DRAW_TYPE |
Tipo de trazado (gráfico) |
ENUM_DRAW_TYPE |
PLOT_SHOW_DATA |
Bandera para mostrar los valores del trazado en Data window (true - visible, false - no visible) |
bool |
PLOT_SHIFT |
Desplazamiento de los gráficos del indicador a lo largo del eje temporal en barras (desplazamientos positivos a la derecha, negativos a la izquierda). |
int |
PLOT_LINE_STYLE |
Estilo de dibujo lineal |
ENUM_LINE_STYLE |
PLOT_LINE_WIDTH |
Grosor de la línea en píxeles (1 - 5) |
int |
PLOT_COLOR_INDEXES |
Número de colores (1 - 64) |
int |
PLOT_LINE_COLOR |
Color de representación |
color (modificador - número de color) |
Poco a poco iremos aprendiendo todas las propiedades, pero por ahora nos centraremos en las tres principales: PLOT_DRAW_TYPE, PLOT_LINE_STYLE y PLOT_LINE_COLOR.
Los indicadores en MetaTrader 5 admiten varios tipos de trazado predefinidos. Determinan la representación visual y la estructura necesaria de los búferes con los datos iniciales para la visualización.
Hay 10 de estos trazados básicos en total, y en el nivel MQL5, que se describen mediante identificadores en la enumeración ENUM_DRAW_TYPE. Es a la propiedad PLOT_DRAW_TYPE a la que debe asignarse uno de los valores ENUM_DRAW_TYPE.
Tipo de visualización, |
Descripción |
Número de |
---|---|---|
DRAW_NONE |
No se muestra nada en el gráfico, pero los valores del búfer correspondiente están disponibles en la ventana de datos |
1 |
DRAW_LINE |
Línea curva por valores de búfer (los elementos «vacíos» forman un hueco en la línea) |
1 |
DRAW_SECTION |
Segmentos rectos que forman una polilínea entre elementos de búfer «no vacíos» (si no hay huecos, similar a DRAW_LINE) |
1 |
DRAW_ARROW |
Caracteres (etiquetas) |
1 |
DRAW_HISTOGRAM |
Histograma de la línea cero a los valores del búfer |
1 |
DRAW_HISTOGRAM2 |
Histograma entre los valores de elementos emparejados de dos búferes de indicadores |
2 |
DRAW_ZIGZAG |
Segmentos rectos que forman una polilínea entre elementos sucesivos «no vacíos» de dos búferes (similar a DRAW_SECTION, pero a diferencia de éste permite segmentos verticales en una barra) |
2 |
DRAW_FILLING |
Relleno de color del canal entre dos líneas mediante valores emparejados en dos búferes |
2 |
DRAW_BARS |
Visualización en barras: se muestran cuatro precios por barra en cuatro búferes adyacentes, en el orden OHLC |
4 |
DRAW_CANDLES |
Visualización de velas: se muestran cuatro precios por barra en cuatro búferes adyacentes, en el orden OHLC |
4 |
Esta tabla no enumera todos los elementos ENUM_DRAW_TYPE. Hay análogos de los mismos trazados con soporte para colorear elementos individuales (barras). Las presentaremos en una sección aparte Coloreado de diagramas elemento por elemento. La documentación de MQL5 proporciona ejemplos para todos los tipos, y dentro del ámbito de este libro, hay algunas excepciones: la presencia de indicadores de demostración se indica junto a los nombres de los tipos.
En todos los casos, incluido DRAW_NONE, los datos del búfer están disponibles en otros programas a través de la función CopyBuffer.
Una característica adicional del tipo DRAW_NONE es que los valores de dicho búfer no participan en la escala automática del gráfico, que está activada por defecto para los indicadores mostrados en subventanas.
El estilo de las líneas viene determinado por la propiedad PLOT_LINE_STYLE, que también tiene una enumeración con valores ENUM_LINE_STYLE válidos.
Identificador |
Descripción |
---|---|
STYLE_SOLID |
Línea continua |
STYLE_DASH |
Línea discontinua |
STYLE_DOT |
Línea de puntos |
STYLE_DASHDOT |
Línea de puntos |
STYLE_DASHDOTDOT |
Guion-dos puntos |
Por último, el color de la línea se establece mediante la propiedad PLOT_LINE_COLOR. En el caso más sencillo, esta propiedad contiene un único color para todo el gráfico. Para algunos tipos de gráficos, en particular DRAW_CANDLES, puede especificar varios colores utilizando un parámetro modificador. Hablaremos de ello más adelante (véase el ejemplo IndSubChartSimple.mq5 en la sección Indicadores multidivisa y de marco temporal múltiple).
Las tres propiedades anteriores bastan para demostrar el indicador IndReplica2.mq5. Vamos a añadir dos parámetros de entrada DrawType y LineStyle de los tipos ENUM_DRAW_TYPE y ENUM_LINE_STYLE respectivamente, y luego llamaremos a la función PlotIndexSetInteger varias veces en OnInit para establecer las propiedades de renderización del indicador.
#property indicator_chart_window
|
Para la propiedad PLOT_LINE_COLOR, no creamos una variable de entrada, ya que ésta y algunas otras propiedades están directamente disponibles desde el cuadro de diálogo de propiedades de cualquier indicador, en la pestaña Colors. Por defecto, es decir, inmediatamente después del lanzamiento del indicador, el color de la línea será azul. Pero el color, así como el grosor y el estilo de la línea, pueden cambiarse en el cuadro de diálogo (en la pestaña especificada). Nuestro parámetro LineStyle duplica parcialmente la celda Style correspondiente de la tabla Colors. Sin embargo, ofrece ventajas adicionales. Los controles estándar del cuadro de diálogo no permiten seleccionar un estilo cuando el ancho de línea es superior a 1. Al utilizar la variable de entrada LineStyle, podemos obtener, por ejemplo, una línea discontinua con una anchura dada de 3 píxeles.
El rellenado del búfer con datos en OnCalculate permanece sin cambios en comparación con IndReplica1.mq5.
Tras compilar y lanzar el indicador en el gráfico, obtenemos la imagen esperada: una línea azul a los precios de cierre en el gráfico, y los correspondientes precios de cierre de las barras en Data window.
Cambiando el parámetro de entrada DrawType, podemos cambiar cómo se muestran los datos del búfer. En este caso, sólo debe seleccionar tipos que requieran un único búfer. Cualquier otro tipo de gráfico (DRAW_HISTOGRAM2, DRAW_ZIGZAG, DRAW_FILLING, DRAW_BARS, DRAW_CANDLES) simplemente no puede funcionar en un solo búfer y no mostrará nada. Tampoco tiene sentido elegir los tipos de construcciones con colores (que comienzan con la palabra «Color»), ya que requieren un búfer adicional con números de color en cada barra (como ya se ha mencionado, nos familiarizaremos con esta posibilidad en la sección Coloreado de diagramas elemento por elemento).
A continuación se muestran las opciones de visualización DRAW_LINE, DRAW_SECTION, DRAW_HISTOGRAM y DRAW_ARROW.
Tipos de gráficos de un búfer
Si no fuera por los diferentes estilos especialmente elegidos, STYLE_SOLID para DRAW_LINE y STYLE_DOT para DRAW_SECTION, estos tipos de dibujo serían iguales, porque todos los elementos de nuestro búfer tienen valores «no vacíos». Por defecto, el valor «vacío» significa la constante especial EMPTY_VALUE, que no utilizamos. Las secciones (segmentos) en DRAW_SECTION se dibujan saltándose los elementos «vacíos», y esto sólo se nota si hay alguno. Hablaremos de la instalación de elementos «vacíos» en la sección Visualización de lagunas de datos.
El histograma de la línea cero DRAW_HISTOGRAM se suele utilizar en indicadores con ventana propia, pero aquí se muestra a efectos de demostración. Crearemos un indicador en una subventana con este tipo de renderización en la sección Esperar datos y gestionar la visibilidad (véase el ejemplo IndDeltaVolume.mq5).
Para el tipo DRAW_ARROW, el sistema utiliza por defecto el carácter de círculo relleno (código 159), pero puede cambiarlo por otro llamando a PlotIndexSetInteger(index, PLOT_ARROW, code).
Los códigos y apariencia de símbolos de fuentes Wingdings se pueden encontrar en la Ayuda MQL5.
En otra modificación del indicador IndReplica3.mq5, añadimos parámetros de entrada para seleccionar el símbolo «flecha» (ArrowCode), así como para desplazar estas etiquetas en el gráfico verticalmente (Arrow padding) y horizontalmente (TimeShift).
input uchar ArrowCode = 159;
|
El desplazamiento vertical a lo largo de la escala de precios se especifica en píxeles (los valores positivos significan desplazamiento hacia abajo; los negativos, hacia arriba). El desplazamiento horizontal a lo largo de la escala temporal se establece en barras (los valores positivos son un desplazamiento hacia la derecha, hacia el futuro, y los negativos, hacia la izquierda, hacia el pasado). Las nuevas variables de entrada se pasan a las llamadas de PlotIndexSetInteger en OnInit.
int OnInit()
|
La siguiente captura de pantalla muestra un ejemplo de IndReplica3.mq5 en un gráfico con los ajustes 117 (diamante), -50 (50 puntos hacia arriba), 3 (3 barras a la derecha/adelante).
Diagrama de dispersión con desplazamientos verticales y horizontales de las etiquetas
Nuestro indicador por defecto se basa en el tipo de precio Close (aunque el usuario puede cambiarlo en el cuadro de diálogo de propiedades, en la lista desplegable Apply to). Si es necesario, puede asignar una configuración inicial diferente utilizando la directiva:
#property indicator_applied_price PRICE_TYPE |
Aquí, en lugar de PRICE_TYPE, debe especificar cualquier constante de la lista ENUM_APPLIED_PRICE. También incluye PRICE_CLOSE, que corresponde al valor por defecto. Por ejemplo, la siguiente directiva añadida al código fuente hará que el indicador se base por defecto en el precio típico.
#property indicator_applied_price PRICE_TYPICAL |
Una vez más, observamos que esta configuración sólo especifica el valor por defecto. La variable integrada _AppliedTo permite conocer el tipo de precio real sobre el que se construye el indicador. Si el indicador se construye de acuerdo con el descriptor de otro indicador, entonces sólo será posible averiguar este hecho, pero no el nombre de un indicador específico que proporcione los datos.
Para averiguar el estado actual de las propiedades de la enumeración ENUM_PLOT_PROPERTY_INTEGER en el código fuente, utilice la función PlotIndexGetInteger.
int PlotIndexGetInteger(int index, ENUM_PLOT_PROPERTY_INTEGER property)
int PlotIndexGetInteger(int index, ENUM_PLOT_PROPERTY_INTEGER property, int modifier)
La función se utiliza a menudo junto con PlotIndexSetInteger para copiar propiedades de dibujo de una línea a otra, o para leer propiedades de los códigos de archivos mqh universales incluidos en el código fuente de varios indicadores.
Por desgracia, no se ofrecen funciones similares en PlotIndexGetDouble y PlotIndexGetString.