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, 
ejemplos

Descripción

Número de 
búferes

DRAW_NONE
IndDeltaVolume.mq5

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
IndLabelHighLowClose.mq5,IndWPR.mq5, IndUnityPercent.mq5

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
IndReplica3.mq5,IndFractals.mq5

Caracteres (etiquetas)

1

DRAW_HISTOGRAM
IndDeltaVolume.mq5

Histograma de la línea cero a los valores del búfer

1

DRAW_HISTOGRAM2
IndLabelHighLowClose.mq5

Histograma entre los valores de elementos emparejados de dos búferes de indicadores

2

DRAW_ZIGZAG
IndFractalsZigZag.mq5

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
IndSubChartSimple.mq5

Visualización en barras: se muestran cuatro precios por barra en cuatro búferes adyacentes, en el orden OHLC

4

DRAW_CANDLES
IndSubChartSimple.mq5

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
#property indicator_buffers 1
#property indicator_plots 1
 
input ENUM_DRAW_TYPE DrawType = DRAW_LINE;
input ENUM_LINE_STYLE LineStyle = STYLE_SOLID;
 
double buffer[];
 
int OnInit()
{
   // register an array as an indicator buffer
   SetIndexBuffer(0buffer);
   
   // set the properties of the chart numbered 0
   PlotIndexSetInteger(0PLOT_DRAW_TYPEDrawType);
   PlotIndexSetInteger(0PLOT_LINE_STYLELineStyle);
   PlotIndexSetInteger(0PLOT_LINE_COLORclrBlue);
   
   return INIT_SUCCEEDED;
}

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 en un búfer

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;
input int ArrowPadding = 0;
input int TimeShift = 0;

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()
{
   ...
   PlotIndexSetInteger(0PLOT_DRAW_TYPEDRAW_ARROW);
   PlotIndexSetInteger(0PLOT_ARROWArrowCode);
   PlotIndexSetInteger(0PLOT_ARROW_SHIFTArrowPadding);
   PlotIndexSetInteger(0PLOT_SHIFTTimeShift);
   ...
}

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

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.