Coloreado de gráficos por elementos

Además de los tipos de dibujo estándar enumerados anteriormente en ENUM_DRAW_TYPE, la plataforma proporciona a sus variantes la posibilidad de colorear individualmente los valores de cada barra. Para ello se utiliza un búfer de indicador adicional en el que se almacenan los números de color. Los números hacen referencia a elementos de un array especial que contiene un conjunto de colores definidos por el programador. El número máximo de colores es 64.

En la siguiente tabla se enumeran los elementos ENUM_DRAW_TYPE con soporte de color y el número de búferes necesarios para dibujarlos, incluyendo 1 búfer con índices de color.

Tipo de visualización

Descripción

Número de 
búferes

DRAW_COLOR_LINE

Línea multicolor

1+1

DRAW_COLOR_SECTION

Segmentos multicolores

1+1

DRAW_COLOR_ARROW

Flechas multicolores

1+1

DRAW_COLOR_HISTOGRAM

Histograma multicolor a partir de la línea cero

1+1

DRAW_COLOR_HISTOGRAM2

Histograma multicolor entre valores emparejados de dos búferes de indicadores

2+1

DRAW_COLOR_ZIGZAG

Zigzag multicolor

2+1

DRAW_COLOR_BARS

Barras multicolores

4+1

DRAW_COLOR_CANDLES

Velas multicolores

4+1

Al vincular los búferes a los gráficos, tenga en cuenta que debe especificarse un búfer de color adicional en el primer parámetro SetIndexBuffer bajo el número que va inmediatamente después de los búferes de datos. Por ejemplo, para colorear una línea utilizando un búfer de datos y un búfer de color, los datos reciben el número 0 y sus colores, el número 1:

double ColorLineData[];
double ColorLineColors[];
   
void OnInit()
{
   SetIndexBuffer(0ColorLineDataINDICATOR_DATA);
   SetIndexBuffer(1ColorLineColorsINDICATOR_COLOR_INDEX);
   PlotIndexSetInteger(0PLOT_DRAW_TYPEDRAW_COLOR_LINE);
   ...
}

El conjunto inicial de colores de la paleta para el diagrama N puede especificarse mediante la directiva #property indicator_colorN, que especifica los colores necesarios separados por comas como constantes con nombre o literales de color. Por ejemplo, la siguiente entrada en el indicador seleccionará 6 colores estándar para colorear el gráfico 0º (la numeración empieza por 1 en las directivas):

#property indicator_color1   clrRed,clrBlue,clrGreen,clrYellow,clrMagenta,clrCyan

Más adelante en el programa, debe especificar no el color en sí, que mostrará la construcción gráfica, sino sólo su índice. La numeración en la paleta se realiza como en un array normal, empezando por 0. Por lo tanto, si necesita establecer un color verde para la i-ésima barra, entonces es suficiente con establecer el índice del color verde de la paleta en el búfer de color, es decir, 2 en este caso.

 ColorLineColors[i]=2;// reference to element with color clrGreen

El conjunto de colores para colorear no se establece de una vez por todas, sino que puede cambiarse dinámicamente mediante la función PlotIndexSetInteger(index, PLOT_LINE_COLOR, color).

Por ejemplo, para sustituir el color clrGreen de la paleta anterior por clrGray, utilice la siguiente llamada:

   PlotIndexSetInteger(0PLOT_LINE_COLORclrGray);

Vamos a aplicar la coloración en nuestro indicador WPR. El nuevo archivo es IndColorWPR.mq5. Los cambios afectan a los siguientes ámbitos.

El número de búferes se ha incrementado en 1. Tres colores en lugar de uno.

#property indicator_buffers    2
#property indicator_plots      1
#property indicator_type1      DRAW_COLOR_LINE
#property indicator_color1     clrDodgerBlue,clrGreen,clrRed

Se ha añadido un nuevo array bajo el búfer de color y su registro en OnInit.

double WPRColors[];
 
void OnInit()
{
   ...
   SetIndexBuffer(1WPRColorsINDICATOR_COLOR_INDEX);
   ...

Si no establece el tipo de búfer INDICATOR_COLOR_INDEX (es decir, con una llamada SetIndexBuffer(1, WPRColors) se trataría por defecto como INDICATOR_DATA), se hará visible en la página Data Window.

En la función OnCalculate dentro del ciclo de trabajo, vamos a añadir coloración basada en el análisis del valor de la i-ésima barra. Por defecto, utilizamos el color con índice 0, es decir, el antiguo clrDodgerBlue. Si las lecturas del indicador se mueven hacia la zona superior, se resaltan en color 2 (clrRed), y si entran en la zona inferior, se colorean en 1 (clrGreen).

int OnCalculate(ON_CALCULATE_STD_FULL_PARAM_LIST)
{
   ...
   for(int i = fmax(prev_calculated - 1WPRPeriod - 1);
      i < rates_total && !IsStopped(); i++)
   {
      ...
      WPRColors[i] = 0;
      if(WPRBuffer[i] > -20WPRColors[i] = 2;
      else if(WPRBuffer[i] < -80WPRColors[i] = 1;
   }
   return rates_total;
}

Este es su aspecto en la pantalla:

Indicador WPR con zonas de sobrecompra y sobreventa coloreadas

Indicador WPR con zonas de sobrecompra y sobreventa coloreadas

Tenga en cuenta que el fragmento de línea se pinta en un color alternativo si su punto final (barra) se encuentra en la zona superior o inferior. En este caso, la lectura anterior puede estar dentro de la zona central, lo que puede dar la impresión de que el color es incorrecto. Sin embargo, se trata de un comportamiento correcto, coherente con la implementación actual y con el modo en que la plataforma utiliza el color.

El color del segmento del gráfico de líneas DRAW_COLOR_LINE entre dos barras adyacentes viene determinado por el color de la barra de la derecha (más reciente).

Si desea resaltar con color sólo los fragmentos en los que ambas barras adyacentes se encuentran en la misma zona, modifique el código como sigue:

      WPRColors[i] = 0;
      if(WPRBuffer[i] > -20 && WPRBuffer[i - 1] > -20WPRColors[i] = 2;
      else if(WPRBuffer[i] < -80 && WPRBuffer[i - 1] < -80WPRColors[i] = 1;

Además, recuerde que hemos añadido al código fuente la configuración del título y la precisión de la representación de los valores (2 caracteres). Comparar la nueva imagen con la antigua le permitirá darse cuenta de estas diferencias visuales. En concreto, el título tiene ahora el aspecto de «%R(14)», y la escala vertical de valores es mucho más compacta.

El último aspecto que cambiaremos en el indicador IndColorWPR.mq5 es que omitimos el dibujo en las barras iniciales.