DRAW_COLOR_SECTION

O estilo DRAW_COLOR_SECTION é uma versão de cor de DRAW_SECTION, mas ao contrário deste último, permite seções de desenho de cores diferentes. O estilo DRAW_COLOR_SECTION, como todos os estilos de cor com a palavra COLOR em seu título tem um buffer de indicador adicional e especial que armazena o índice de cores (número) a partir de um conjunto especial array de cores. Assim, a cor de cada uma das seções pode ser definido através da especificação do índice de cores do índice da barra que corresponde a seção final.

A largura, cor e estilo das seções podem ser especificados como para o estilo DRAW_SECTION - usando as as diretivas do compilador ou dinamicamente usando a função PlotIndexSetInteger(). Mudanças dinâmicas das propriedades de plotagem permitem "avivar" os indicadores, de modo que suas aparências sejam alteradas dependendo da situação corrente.

Seções são desenhadas a partir de um valor não vazio para outro valor não vazio do buffer de indicador, valores vazios são ignorados. Para especificar qual o valor que deve ser considerado como "vazio", defina esse valor na propriedade PLOT_EMPTY_VALUE: Por exemplo, se o indicador deve ser desenhado como uma seqüência de seções sobre valores diferentes de zero, então você precisa definir o valor zero como um vazio:

//--- O valor 0 (vazio) não vai participar no desenho
   PlotIndexSetDouble(index_of_plot_DRAW_COLOR_SECTION,PLOT_EMPTY_VALUE,0);

Sempre preencha explicitamente nos valores dos buffers do indicador, defina um valor vazio num buffer para os elementos que não devem ser plotados.

O número de buffers requirido para plotagem de DRAW_COLOR_SECTION é 2.

  • um buffer para armazenar os valores do indicador utilizado para desenhar uma linha;
  • um buffer para armazenar o índice de cor, que é usada para desenhar a seção (faz sentido definir apenas valores não vazios).

Cores serão especificadas pela diretiva de compilador #property indicator_color1 separada por uma vírgula. O número de cores não pode exceder a 64.

Um exemplo do indicador que desenha seções coloridas a cada 5 barras longas, usando os valores da alta do preço. A cor, a largura e o estilo das seções alteram aleatoriamente a cada N ticks.

Um exemplo de DRAW_COLOR_SECTION

Note que para inicializar plot1 com DRAW_COLOR_SECTION, 8 cores são definidas usando a diretiva de compilador #property. Então na função OnCalculate(), cores são definidas aleatoriamente a partir do array de cores colors[].

O parâmetro N é defindo nos parâmetros externos do indicador para a possibilidade de configuração manual (na guia Parâmetros na janela Propriedades do indicador).

//+------------------------------------------------------------------+
//|                                           DRAW_COLOR_SECTION.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2000-2024, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
 
#property description "Um indicador para demonstrar DRAW_COLOR_SECTION"
#property description "Ele desenha secções coloridas com o comprimento igual ao número de barras especificadas"
#property description "A cor, a largura eo estilo de seções são alteradas aleatoriamente"
#property description "depois de cada N ticks"
 
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   1
//--- plotar ColorSection
#property indicator_label1  "ColorSection"
#property indicator_type1   DRAW_COLOR_SECTION
//--- Definir 8 cores para colorir seções (eles são armazenados numa array especial)
#property indicator_color1  clrRed,clrGold,clrMediumBlue,clrLime,clrMagenta,clrBrown,clrTan,clrMediumVioletRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- parâmetros de entrada
input int      N=5;                      // Número de ticks para alterar 
input int      bars_in_section=5;        // O comprimento das seções nas barras
//--- Uma variável auxiliar para calcular extremidades das seções
int            divider;
int            color_sections;
//--- Um buffer para plotagem
double         ColorSectionBuffer[];
//--- Um buffer para armazenar a cor da linha sobre cada barra
double         ColorSectionColors[];
//--- Um array para armazenar as cores que contém 14 elementos
color colors[]=
  {
   clrRed,clrBlue,clrGreen,clrChocolate,clrMagenta,clrDodgerBlue,clrGoldenrod,
   clrIndigo,clrLightBlue,clrAliceBlue,clrMoccasin,clrWhiteSmoke,clrCyan,clrMediumPurple
  };
//--- Um array para armazenar os estilos de linha
ENUM_LINE_STYLE styles[]={STYLE_SOLID,STYLE_DASH,STYLE_DOT,STYLE_DASHDOT,STYLE_DASHDOTDOT};
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado                 |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- mapeamento de buffers do indicador
   SetIndexBuffer(0,ColorSectionBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ColorSectionColors,INDICATOR_COLOR_INDEX);
//--- O valor 0 (vazio) não vai participar no desenho
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
//---- O número de cores para colorir as secções
   int color_sections=8;   //  veja um comentário para #property indicator_color1
//--- Verifica o parâmetro do indicador
   if(bars_in_section<=0)
     {
      PrintFormat("Comprimento seção inválido=%d",bars_in_section);
      return(INIT_PARAMETERS_INCORRECT);
     }
   else divider=color_sections*bars_in_section;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Função de iteração do indicador customizado                      |
//+------------------------------------------------------------------+
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;
//--- Calcule ticks para mudar o estilo, cor e largura da linha
   ticks++;
//--- Se um número crítico de ticks tem sido acumulado
   if(ticks>=N)
     {
      //--- Alterar as propriedades da linha
      ChangeLineAppearance();
      //--- Alterar cores utilizadas para plotar as seções
      ChangeColors(colors,color_sections);
      //--- Redefinir o contador de ticks para zero
      ticks=0;
     }
 
//--- O número de barra a partir da qual o cálculo dos valores do indicador inicia
   int start=0;
//--- Se o indicador foi calculado antes, então definir o início na barra anterior
   if(prev_calculated>0) start=prev_calculated-1;
//--- Aqui estão todos os cálculos dos valores do indicador
   for(int i=start;i<rates_total;i++)
     {
      //--- Se o número de barras é divisível pela section_length, isso significa que esta é a extremidade das seções
      if(i%bars_in_section==0)
        {
         //--- Definir o final da seção na alta de preço desta barra
         ColorSectionBuffer[i]=high[i];
         //--- O resto da divisão do número de barra pela scetion_length*number_of_colors
         int rest=i%divider;
         //Obter o número da cor =  a partir de 0 para number_of_colors-1
         int color_indext=rest/bars_in_section;
         ColorSectionColors[i]=color_indext;
        }
      //---Se o resto da divisão é igual para barras, 
      else
        {
         //--- Se nada aconteceu, ignore a barra - definir 0
         else ColorSectionBuffer[i]=0;
        }
     }
//--- Retorna o valor de prev_calculated para a próxima chamada da função
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Altera a cor dos segmentos de linha                              |
//+------------------------------------------------------------------+
void  ChangeColors(color  &cols[],int plot_colors)
  {
//--- O número de cores
   int size=ArraySize(cols);
//--- 
   string comm=ChartGetString(0,CHART_COMMENT)+"\r\n\r\n";
 
//--- Para cada índice de cor definir uma nova cor aleatoriamente
   for(int plot_color_ind=0;plot_color_ind<plot_colors;plot_color_ind++)
     {
      //--- Obter um valor aleatório
      int number=MathRand();
      //--- Obter um índice no array col[] como um resto da divisão inteira
      int i=number%size;
      //--- Definir a cor para cada índice com a propriedade PLOT_LINE_COLOR
      PlotIndexSetInteger(0,                    //  O número do estilo gráfico
                          PLOT_LINE_COLOR,      //  Identificador da propriedade
                          plot_color_ind,       //  O índice da cor, onde se escreve a cor
                          cols[i]);             //  Uma nova cor
      //--- Escrever as cores
      comm=comm+StringFormat("SectionColorIndex[%d]=%s \r\n",plot_color_ind,ColorToString(cols[i],true));
      ChartSetString(0,CHART_COMMENT,comm);
     }
//---
  }
//+------------------------------------------------------------------+
//| Altera a aparência de uma linha visualizada no indicador         |
//+------------------------------------------------------------------+
void ChangeLineAppearance()
  {
//--- Uma string para a formação de informações sobre as propriedades de linha
   string comm="";
//--- Um bloco para alterar a largura da linha
   int number=MathRand();
//--- Obter a largura do restante da divisão inteira
   int width=number%5; // A largura é definida de 0 a 4
//--- Definir a cor com a propriedade PLOT_LINE_WIDTH
   PlotIndexSetInteger(0,PLOT_LINE_WIDTH,width);
//--- Escrever a largura da linha
   comm=comm+" Width="+IntegerToString(width);
 
//--- Um bloco para mudar o estilo da linha
   number=MathRand();
//--- O divisor é igual ao tamanho do array de estilos
   int size=ArraySize(styles);
//--- Obter o índice para selecionar um novo estilo como o resto da divisão inteira
   int style_index=number%size;
//--- Definir a cor com a propriedade PLOT_LINE_COLOR
   PlotIndexSetInteger(0,PLOT_LINE_STYLE,styles[style_index]);
//--- Escrever o estilo de linha
   comm=EnumToString(styles[style_index])+", "+comm;
//--- Mostrar a informação no gráfico usando um comentário
   Comment(comm);
  }