Estilos de indicadores en ejemplos

El terminal de cliente MetaTrader 5 cuenta con 38 indicadores técnicos incorporados que se puede utilizar en los programas MQL5 a través de las funciones correspondientes. Pero el principal mérito del lenguaje MQL5 consiste en la posibilidad de crear sus propios indicadores personalizados que luego pueden ser utilizados en los Asesores Expertos para obtener valores, o simplemente pueden ser aplicados a los gráficos de precios para realizar el análisis técnico.

Usted puede conseguir toda la variedad de indicadores a base de unos estilos de dibujo básicos, llamados construcciones gráficas. Bajo la construcción se entiende el modo de visualización de datos que el indicador calcula, guarda y ofrece si se solicitan. Hay siete tipos de construcciones básicas:

  1. línea,
  2. sección (segmento),
  3. histograma,
  4. flecha (símbolo),
  5. área coloreada (canal con relleno),
  6. barras,
  7. velas japonesas.

Cada construcción requiere para su visualización de uno a cinco arrays del tipo double en los que se guardan los valores del indicador. Para un cómodo trabajo del indicador, estos arrays se asocian a los búfers indicadores. La cantidad de búfers en el indicador hace falta declarar de antemano, utilizando las directivas del compilador, por ejemplo:

#property indicator_buffers 3 // número de búfers
#property indicator_plots   2 // número de construcciones gráficas

El número de búfers en el indicador siempre es igual o superior al número de construcciones gráficas en el indicador.

Puesto que cada construcción gráfica base puede tener diferentes variaciones de colores o un carácter específico de visualización, el número real de construcciones en el lenguaje MQL5 es 18:

Construcción

Descripción

Búfers de valores

Búfers de colores

DRAW_NONE

No se muestra visualmente en el gráfico, pero se puede ver los valores del búfer correspondiente en la "Ventana de datos"

1

-

DRAW_LINE

Se traza una línea a base de los valores del búfer correspondiente (los valores vacíos son indeseables en el búfer)

1

-

DRAW_SECTION

Se traza como una línea segmentada entre los valores del búfer correspondiente (normalmente hay muchos valores vacíos)

1

-

DRAW_HISTOGRAM

Se traza como un histograma desde la línea cero hasta los valores del búfer correspondiente (puede tener valores vacíos)

1

-

DRAW_HISTOGRAM2

Se traza como un histograma basándose en dos búfers indicadores (puede tener valores vacíos)

2

-

DRAW_ARROW

Se traza como símbolos (puede tener valores vacíos)

1

-

DRAW_ZIGZAG

Parecido al estilo DRAW_SECTION, pero a diferencia de éste puede dibujar segmentos verticales en una barra

2

-

DRAW_FILLING

Relleno de colores entre dos líneas. En la "Ventana de datos" se muestran 2 valores de los búfers correspondientes

2

-

DRAW_BARS

Se visualiza en el gráfico en forma de las barras. En la "Ventana de datos" se muestran 4 valores de los búfers correspondientes

4

-

DRAW_CANDLES

Se visualiza en forma de las velas japonesas. En la "Ventana de datos" se muestran 4 valores de los búfers correspondientes

4

-

DRAW_COLOR_LINE

Es una línea para la que se puede alternar colores en diferentes barras y cambiar su calor en el momento deseado

1

1

DRAW_COLOR_SECTION

Parecido al estilo DRAW_SECTION, pero el color para cada sección se puede definir de manera individual; también se puede definir el color de forma dinámica

1

1

DRAW_COLOR_HISTOGRAM

Parecido al estilo DRAW_HISTOGRAM, pero cada raya puede tener su propio color; también se puede definir el color de forma dinámica

1

1

DRAW_COLOR_HISTOGRAM2

Parecido a DRAW_HISTOGRAM2,  ero cada raya puede tener su propio color; también se puede definir el color de forma dinámica

2

1

DRAW_COLOR_ARROW

Parecido al estilo DRAW_ARROW, pero cada símbolo puede tener su propio color. Se puede cambiar el color dinámicamente

1

1

DRAW_COLOR_ZIGZAG

El estilo DRAW_ZIGZAG con las posibilidades del coloreado individual de secciones y el cambio dinámico del color

2

1

DRAW_COLOR_BARS

Estilo DRAW_BARS con las posibilidades del coloreado individual de barras y el cambio dinámico del color

4

1

DRAW_COLOR_CANDLES

Estilo DRAW_CANDLES con las posibilidades del coloreado individual de velas y el cambio dinámico del color

4

1

 

La diferencia entre un búfer indicador y un array

En cada indicador hay que declarar a un nivel global uno o más arrays del tipo double que luego tendrá que ser utilizado como búfer indicador mediante la función SetIndexBuffer(). Para dibujar las construcciones gráficas del indicador, se utilizan sólo los valores desde el búfer indicador. No se puede utilizar ningún otro array para este propósito. Además de eso, los valores de los búfers se muestran en la "Ventana de datos".

Un búfer indicador tiene que ser dinámico y no requiere la especificación del tamaño — el tamaño del array que ha sido utilizado como búfer indicador se determina por el subsistema ejecutable del terminal de forma automática.

Tras la vinculación del array con el búfer indicador, la dirección de indexación se establece por defecto como en los arrays comunes, pero si hace falta, Usted puede aplicar la función ArraySetAsSeries() para cambiar el modo de acceso a los elementos del array. Por defecto, el búfer indicador se utiliza para almacenar los datos que están destinados para el proceso de dibujo (INDICATOR_DATA).

Si para el cálculo de los valores del indicador es necesario realizar algunas computaciones intermedias y almacenar un valor adicional para cada barra, entonces durante la vinculación este array puede ser declarado como el búfer de cálculo ( INDICATOR_CALCULATIONS). Un array ordinario también puede ser utilizado para los valores intermedios, pero en este caso el programador debe encargarse personalmente de controlar el tamaño de este array.

Algunas construcciones permiten establecer un color de visualización para cada barra. Para almacenar la información sobre el color, se utilizan los búfers de colores (INDICATOR_COLOR_INDEX). El color está representado con el tipo de números enteros color, pero todos los búfers indicadores deben tener el tipo double. No se puede obtener los valores de colores y de los búfers auxiliares (INDICATOR_CALCULATIONS) mediante la función CopyBuffer().

El número de los búfers indicadores debe ser indicado por la directiva del compilador #property indicator_buffers número_de_búfers:

#property indicator_buffers 3  //  el indicador tiene 3 búfers

El número máximo permitido de los búfers en un indicador - 512.

 

Correspondencia de búfers indicadores y construcciones gráficas

Cada construcción gráfica se basa en uno o más búfers indicadores. De esta manera, para visualizar las velas japonesas simples, hacen falta cuatro valores: los precios Open, High, Low y Close. En consecuencia, para visualizar un indicador en forma de velas japonesas, es necesario declarar 4 búfers indicadores y 4 arrays del tipo double para ellos. Por ejemplo:

//--- el indicador tiene cuatro búfers indicadores
#property indicator_buffers 4
//--- el indicador tiene una construcción gráfica
#property indicator_plots   1
//--- la construcción gráfica con el número 1 se mostrará en forma de velas japonesas
#property indicator_type1   DRAW_CANDLES
//--- las velas japonesas serán dibujadas en color clrDodgerBlue
#property indicator_color1  clrDodgerBlue
//--- 4 arrays para los búfers indicadores
double OBuffer[];
double HBuffer[];
double LBuffer[];
double CBuffer[];

 

Las construcciones gráficas utilizan automáticamente los búfers indicadores de acuerdo con el número de construcción. Los números de construcción se empiezan desde 1, los números de búfers se empiezan desde 0. Si la primera construcción requiere 4 búfers indicadores, para el trazado serán utilizados los 4 primeros búfers indicadores. Estos cuatro búfers indicadores deben estar vinculados con los arrays correspondientes con la indexación correcta mediante la función SetIndexBuffer().

//--- Vinculación de arrays con búfers indicadores
   SetIndexBuffer(0,OBuffer,INDICATOR_DATA);  // el primer búfer corresponde al índice cero
   SetIndexBuffer(1,HBuffer,INDICATOR_DATA);  // el segundo búfer corresponde al índice 1
   SetIndexBuffer(2,LBuffer,INDICATOR_DATA);  // el tercer búfer corresponde al índice 2
   SetIndexBuffer(3,CBuffer,INDICATOR_DATA);  // el cuarto búfer corresponde al índice 3

Durante el dibujo de velas japonesas el indicador va a utilizar precisamente los cuatro primeros búfers, porque la construcción "velas japonesas" ha sido declarada bajo el número uno.

Vamos a cambiar un poco nuestro ejemplo, vamos a añadir la construcción en forma de una línea simple - DRAW_LINE. Ahora, que la línea tenga el número 1, y las velas japonesas el número 2. El número de búfers y el número de construcciones se ha aumentado.

//--- el indicador tiene 5 búfers indicadores
#property indicator_buffers 5
//--- el indicador tiene 2 construcciones gráficas
#property indicator_plots   2
//--- la construcción gráfica con el número 1 se mostrará en forma de la línea
#property indicator_type1   DRAW_LINE
//--- la línea tendrá el color clrDodgerRed
#property indicator_color1  clrDodgerRed
//---la construcción gráfica con el número 2 se mostrará en forma de velas japonesas
#property indicator_type2   DRAW_CANDLES
//--- las velas japonesas serán dibujadas en color clrDodgerBlue
#property indicator_color2  clrDodgerBlue
//--- 5 arrays para los búfers indicadores
double LineBuffer[];
double OBuffer[];
double HBuffer[];
double LBuffer[];
double CBuffer[];

El orden de construcciones se ha cambiado, ahora primero va la línea, luego van las velas japonesas. Por esta razón, el orden de búfers va a ser el apropiado. Es decir, primero declararemos bajo el índice cero el búfer para la línea, y luego cuatro búfers para la visualización de velas japonesas.

   SetIndexBuffer(0,LineBuffer,INDICATOR_DATA);  // el primer búfer corresponde al índice 0
//--- vinculación de arrays con búfers indicadores para las velas japonesas
   SetIndexBuffer(1,OBuffer,INDICATOR_DATA);     // el segundo búfer corresponde al índice 1
   SetIndexBuffer(2,HBuffer,INDICATOR_DATA);     // el tercer búfer corresponde al índice 2
   SetIndexBuffer(3,LBuffer,INDICATOR_DATA);     // el cuarto búfer corresponde al índice 3
   SetIndexBuffer(4,CBuffer,INDICATOR_DATA);     // el quinto búfer corresponde al índice 4 

El número de búfers y construcciones gráficas se puede fijar sólo a través las directivas del compilador, es imposible el cambio dinámico de estas propiedades a través de las funciones.

 

Versiones de color de los estilos

Como se puede divisar de la tabla, los estilos se dividen en dos grupos. Al primer grupo pertenecen los estilos en cuyos nombres no figura la palabra COLOR, vamos a llamarlos estilos básicos:

  • DRAW_LINE
  • DRAW_SECTION
  • DRAW_HISTOGRAM
  • DRAW_HISTOGRAM2
  • DRAW_ARROW
  • DRAW_ZIGZAG
  • DRAW_FILLING
  • DRAW_BARS
  • DRAW_CANDLES

El segundo grupo de estilos contiene la palabra COLOR, vamos a llamarlos versiones de color:

  • DRAW_COLOR_LINE
  • DRAW_COLOR_SECTION
  • DRAW_COLOR_HISTOGRAM
  • DRAW_COLOR_HISTOGRAM2
  • DRAW_COLOR_ARROW
  • DRAW_COLOR_ZIGZAG
  • DRAW_COLOR_BARS
  • DRAW_COLOR_CANDLES

Todas las versiones de color de los estilos se diferencian de los temas básicos, lo que permite especificar un color para cada parte de la construcción. La parte mínima de la construcción es una barra, por eso se puede decir que las versiones de color permiten especificar un color para cada barra.

Para que se pueda especificar el color de la construcción en cada barra, en las versiones de color de los estilos ha sido agregado un búfer adicional especial para almacenar el índice del color. Estos índices indican el número del color en un array especial que contiene el conjunto de colores especificado de antemano. El tamaño del array de los colores — 64. Esto quiere decir que cada versión de color del estilo permite colorear una construcción gráfica con 64 diferentes colores.

El conjunto y el número de colores en este array especial se puede establecer con la directiva del compilador #property indicator_color, donde Usted puede especificar todos los colores necesarios separados con coma. Por ejemplo, hacemos la siguiente entrada en el indicador:

//--- estableceremos 8 colores para colorear las velas (se guardan en un array especial)
#property indicator_color1  clrRed,clrBlue,clrGreen,clrYellow,clrMagenta,clrCyan,clrLime,clrOrange

Aquí está indicado que para la construcción gráfica número 1 hemos establecido 8 colores que serán colocados en el array especial. Luego en el programa no vamos a indicar el color para la construcción gráfica, sino vamos a utilizar su índice. Si queremos establecer para una barra el color rojo,para ello es necesario indicar en el búfer de colores el índice del color rojo desde el array. En la directiva el rojo va el primero, le corresponde el índice con el número 0.

  //--- fijaremos el color de la vela clrRed
  col_buffer[buffer_index]=0;

El conjunto de colores no es algo determinado de una vez y para siempre, se puede cambiarlo dinámicamente a través de la función PlotIndexSetInteger(). Ejemplo:

      //--- estableceremos el color para cada índice como la propiedad PLOT_LINE_COLOR
      PlotIndexSetInteger(0,                    //  número del estilo gráfico
                          PLOT_LINE_COLOR,      //  identificador de la propiedad
                          plot_color_ind,       //  índice del color donde escribiremos el color
                          color_array[i]);      //  nuevo color

 

Propiedades del indicador y construcciones gráficas

Para las construcciones gráficas se puede establecer las propiedades tanto mediante las directivas del compilador, como a través de las funciones correspondientes. En el apartado Relación entre las propiedades de indicador y funciones correspondientes este asunto se describe con más detalles. El cambio dinámico de las propiedades del indicador a través de las funciones permite crear los indicadores personalizados más flexibles.

 

Inicio del proceso de dibujo de un indicador en el gráfico

En muchas ocasiones, según las condiciones del algoritmo, resulta imposible iniciar el cálculo de los valores del indicador inmediatamente desde la barra actual, es necesario proporcionar el número mínimo de las barras previas disponibles en el historial. Por ejemplo, muchos tipos del suavizado suponen el uso del array de precios para N barras anteriores, y a base de estos valores se calcula el valor del indicador para la barra actual.

En estas ocasiones, o no hay posibilidad de calcular los valores del indicador en las primeras N barras, o estos valores no están destinados para ser visualizados en el gráfico y conllevan un papel auxiliar para el cálculo de siguientes valores. Para renunciar la visualización del indicador en las primeras N barras del historial, se debe establecer el valor N para la propiedad PLOT_DRAW_BEGIN para la construcción gráfica correspondiente:

//--- vinculación de arrays con búfers indicadores para las velas japonesas
PlotIndexSetInteger(número_de_construcción_gráfica,PLOT_DRAW_BEGIN,N);

Aquí:

  • número_de_construcción_gráfica — un valor de cero a indicator_plots-1 (la numeración de construcciones gráficas se empieza desde cero).
  • N — número de las primeras barras en el historial en las cuales el indicador no debe mostrarse en el gráfico.