DRAW_COLOR_LINE

El estilo DRAW_COLOR_LINE es la versión en color del estilo DRAW_LINE. Éste también traza una línea según los valores del búfer indicador. Pero este estilo, igual que todos los estilos de color en cuyo nombre figura COLOR, cuenta con un especial búfer indicador adicional que guarda el índice (número) del color desde un especial array de colores. De esta manera, se puede definir el color de cada sección de la línea indicando el índice del color que debe adquirir la línea en una barra en concreto.

Usted puede establecer el grosor, color y el estilo de la línea tanto con las directivas del compilador, como de forma dinámica, utilizando la función PlotIndexSetInteger(). La opción del cambio dinámico de las propiedades de la construcción gráfica permite crear indicadores "vivos", es decir, los que cambian su apariencia en función de la situación actual.

El número de búfers requeridos para construir DRAW_COLOR_LINE – 2:

  • un búfer para almacenar los valores del indicador a base de los cuales se traza la línea;
  • un búfer para almacenar el índice de color con el que se traza la línea en cada barra.

Se puede definir los colores con la directiva del compilador #property indicator_color1, separados por coma. El número de colores no puede superar 64.

//--- estableceremos 5 colores para colorear cada barra (se almacenan en un array especial)
#property indicator_color1  clrRed,clrBlue,clrGreen,clrOrange,clrDeepPink // (se puede especificar hasta 64 colores)

Aquí tenemos un ejemplo del indicador que traza una línea usando los precios de cierre de las barras Close. El grosor y el estilo de la línea se cambian de forma aleatoria cada N=5 tics.

Ejemplo del estilo DRAW_COLOR_LINE

Los colores para los segmentos de la línea también se cambian aleatoriamente en la función personalizada ChangeColors().

//+------------------------------------------------------------------+
//|  cambia el color de segmentos de la línea                        |
//+------------------------------------------------------------------+
void  ChangeColors(color  &cols[],int plot_colors)
  {
//--- número de colores
   int size=ArraySize(cols);
//--- 
   string comm=ChartGetString(0,CHART_COMMENT)+"\r\n\r\n";
 
//--- definimos de forma aleatoria un color nuevo para cada índice de colores
   for(int plot_color_ind=0;plot_color_ind<plot_colors;plot_color_ind++)
     {
      //--- obtendremos un número aleatorio
      int number=MathRand();
      //--- obtendremos un índice en el array col[] como el remanente de la división de números enteros
      int i=number%size;
      //--- 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
                          cols[i]);             //  nuevo color
      //--- apuntaremos los colores
      comm=comm+StringFormat("LineColorIndex[%d]=%s \r\n",plot_color_ind,ColorToString(cols[i],true));
      ChartSetString(0,CHART_COMMENT,comm);
     }
//---
  }

En el ejemplo se muestra una particularidad propia de las versiones "de colores" de los indicadores — para cambiar el color de un segmento de la línea no hace falta cambiar los valores en el búfer ColorLineColors[] (que almacena los índices de colores). Basta con definir nuevos colores en un array especial. Esto permite cambiar rápidamente el color para toda la construcción gráfica, modificando únicamente un pequeño array de colores a través de la función PlotIndexSetInteger().

Fíjense que inicialmente para la construcción gráfica plot1 con el estilo DRAW_COLOR_LINE las propiedades se establecen mediante la directiva del compilador #property, y luego en la función OnCalculate() estas tres propiedades se establecen de forma aleatoria.

Los parámetros N y Length (longitud de los segmentos coloreados de la barra) están sacados a los parámetros externos del indicador para que exista la posibilidad de establecerlo manualmente (pestaña "Parámetros" en la ventana de propiedades del indicador).

//+------------------------------------------------------------------+
//|                                              DRAW_COLOR_LINE.mq5 |
//|                         Copyright 2000-2024, MetaQuotes Ltd. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2000-2024, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
 
#property description "Indicador para demostrar DRAW_COLOR_LINE"
#property description "Dibuja con segmentos de colores de 20 barras la línea a base de los precios Close"
#property description "El color, grosor y el estilo de segmentos de la línea se cambian de forma aleatoria"
#property description "cada N tics"
 
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   1
//--- plot ColorLine
#property indicator_label1  "ColorLine"
#property indicator_type1   DRAW_COLOR_LINE
//--- estableceremos 5 colores para colorear cada barra (se almacenan en un array especial)
#property indicator_color1  clrRed,clrBlue,clrGreen,clrOrange,clrDeepPink // (se puede especificar hasta 64 colores)
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- parámetros input
input int      N=5;           // número de tics a cambiar 
input int      Length=20;     // longitud de cada sección de color en barras
int            line_colors=5; // número de colores definidos es igual a 5 - vea más arriba #property indicator_color1
//--- búfer para dibujar
double         ColorLineBuffer[];
//--- búfer para almacenar el color del trazado de la línea en cada barra
double         ColorLineColors[];
 
//--- el array para almacenar colores contiene 7 elementos
color colors[]={clrRed,clrBlue,clrGreen,clrChocolate,clrMagenta,clrDodgerBlue,clrGoldenrod};
//--- array para almacenar estilos de trazado de la línea
ENUM_LINE_STYLE styles[]={STYLE_SOLID,STYLE_DASH,STYLE_DOT,STYLE_DASHDOT,STYLE_DASHDOTDOT};
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- vinculación del array con el búfer indicador
   SetIndexBuffer(0,ColorLineBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ColorLineColors,INDICATOR_COLOR_INDEX);
//--- inicialización del generador de números pseudoaleatorios
   MathSrand(GetTickCount());
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   static int ticks=0;
//--- contamos los tics para el cambio del estilo, color y grosor de la línea
   ticks++;
//--- si tenemos acumulado un número crítico de tics,
   if(ticks>=N)
     {
      //--- cambiamos las propiedades de la línea
      ChangeLineAppearance();
      //--- cambiamos los colores con los que se dibujan los segmentos de colores de la línea
      ChangeColors(colors,5);
      //--- actualizamos el contador de tics pasándolo a cero
      ticks=0;
     }
 
//--- bloque para calcular los valores del indicador
   for(int i=0;i<rates_total;i++)
     {
      //--- apuntamos el valor del indicador en el búfer
      ColorLineBuffer[i]=close[i];
      //--- ahora de forma aleatoria definimos un índice de color para esta barra
      int color_index=i%(5*Length);
      color_index=color_index/Length;
      //--- para esta barra la línea va a dibujarse con el color que se guarda bajo el número color_index
      ColorLineColors[i]=color_index;
     }
 
//--- volveremos el valor prev_calculated para la siguiente llamada de la función
   return(rates_total);
  }
//+------------------------------------------------------------------+
//|  cambia el color de segmentos de la línea                                    |
//+------------------------------------------------------------------+
void  ChangeColors(color  &cols[],int plot_colors)
  {
//--- número de colores
   int size=ArraySize(cols);
//--- 
   string comm=ChartGetString(0,CHART_COMMENT)+"\r\n\r\n";
 
//--- definimos de forma aleatoria un color nuevo para cada índice de colores
   for(int plot_color_ind=0;plot_color_ind<plot_colors;plot_color_ind++)
     {
      //--- obtendremos un número aleatorio
      int number=MathRand();
      //--- obtendremos un índice en el array col[] como el remanente de la división de números enteros
      int i=number%size;
      //--- 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
                          cols[i]);             //  nuevo color
      //--- apuntaremos los colores
      comm=comm+StringFormat("LineColorIndex[%d]=%s \r\n",plot_color_ind,ColorToString(cols[i],true));
      ChartSetString(0,CHART_COMMENT,comm);
     }
//---
  }
//+------------------------------------------------------------------+
//| cambia la apariencia de la línea trazada en el indicador            |
//+------------------------------------------------------------------+
void ChangeLineAppearance()
  {
//--- cadena para formar la información sobre las propiedades de la línea
   string comm="";
//--- bloque de cambio del grosor de la línea
   int number=MathRand();
//--- obtenemos el grosor como el remanente de la división de números enteros
   int width=number%5; // el grosor puede ser de 0 a 4
//--- estableceremos el color como la propiedad PLOT_LINE_WIDTH
   PlotIndexSetInteger(0,PLOT_LINE_WIDTH,width);
//--- apuntaremos el grosor de la línea
   comm=comm+" Width="+IntegerToString(width);
 
//--- bloque de cambio del estilo de la línea
   number=MathRand();
//--- el divisor del número es igual al tamaño del array styles
   int size=ArraySize(styles);
//--- obtenemos el índice para seleccionar nuevo estilo como el remanente de la división de números enteros
   int style_index=number%size;
//--- estableceremos el color como la propiedad PLOT_LINE_COLOR
   PlotIndexSetInteger(0,PLOT_LINE_STYLE,styles[style_index]);
//--- apuntaremos el estilo de la línea
   comm=EnumToString(styles[style_index])+", "+comm;
//--- mostraremos la información en el gráfico a través del comentario
   Comment(comm);
  }