DRAW_COLOR_ARROW

O estilo DRAW_COLOR_ARROW desenha setas coloridas (símbolos do conjunto Wingdings) baseado no valor do buffer do indicador. Em contraste com DRAW_ARROW, neste estilo, é possível definir uma cor partir de um conjunto predefinido de cores especificada pela propriedade indicator_color1 para cada símbolo.

A largura e a cor dos símbolos podem ser especificadas com o estilo DRAW_ARROW — usando diretivas de compilador ou dinamicamente usando a função PlotIndexSetInteger(). Mudanças dinâmicas das propriedades de plotagem permitem modificar a aparência de um indicador com base na situação atual.

O código de símbolo é definido usando a propriedade PLOT_ARROW.

//--- Definir o código símbolo a partir das fontes Wingdings para desenhar em PLOT_ARROW
   PlotIndexSetInteger(0,PLOT_ARROW,code);

O valor padrão do PLOT_ARROW=159 (um círculo).

Cada seta é na verdade um símbolo que tem a altura e o ponto de ancoragem e pode abranger algumas informações importantes num gráfico (por exemplo, o preço de fechamento da barra). Assim, podemos adicionalmente especificar o deslocamento vertical em pixels, o qual não depende da escala do gráfico. As setas serão deslocadas para baixo pelo número especificado de pixels, embora os valores do indicador permanecerão os mesmos:

//--- Definir o deslocamento vertical das setas em pixels
   PlotIndexSetInteger(0,PLOT_ARROW_SHIFT,shift);

Um valor negativo de PLOT_ARROW_SHIFT significa a mudança de setas para cima, valores positivos deslocam a seta para baixo.

O estilo DRAW_COLOR_ARROW pode ser usado em separado na sub-janela do gráfico e em sua janela principal. Valores vazios não são desenhados e não aparecem na "Janela de Dados", todos os valores nos buffers do indicador devem ser definidos explicitamente. Buffers não são inicializados com o valor zero.

//--- Definir um valor vazio
   PlotIndexSetDouble(plot_index_DRAW_COLOR_ARROW,PLOT_EMPTY_VALUE,0);

O número de buffers necessários para plotagem de DRAW_COLOR_ARROW é 2.

  • Um buffer para armazenar o valor do preço que é utilizado para desenhar o símbolo (além de um deslocamento em pixels, determinado na propriedade PLOT_ARROW_SHIFT);
  • Um buffer para guardar o índice de cor que é utilizado para desenhar uma seta(faz sentido configurar apenas valores não vazios).

Um exemplo de indicador que desenha as setas em cada uma das barras com o preço mais alto do que o preço final da barra anterior. A largura, deslocamento e símbolo de código de todas setas são alterados aleatoriamente a cada N ticks. A cor do símbolo depende do número da barra na qual está desenhada.

Um exemplo do estilo DRAW_COLOR_ARROW

Neste exemplo, para plot1 com o estilo DRAW_COLOR_ARROW, as propriedades, cor e tamanho são especificadas usando a diretiva de compilador #property, e então, na função OnCalculate() as propriedades são definidas aleatoriamente. O parâmetro N é definido nos parâmetros externos do indicador para a possibilidade de configuração manual (o guia Parâmetros na janela Propriedades do indicador).

Por favor, note que inicialmente oito cores são usadas na diretiva de compilador #property, e então, na função OnCalculate(), a cor é definida aleatoriamente a partir das 14 cores que são armazenadas no array colors[].

//+------------------------------------------------------------------+
//|                                             DRAW_COLOR_ARROW.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
 
#property description "Um indicador para demonstrar DRAW_COLOR_ARROW"
#property description "Desenha setas de diferentes cores definidas pelo caracteres Unicode, em um gráfico"
#property description "A cor, o tamanho, deslocamento e código de símbolo da seta são alterados"
#property description " aleatoriamente a cada N ticks"
#property description "O parâmetro de código define o valor da base: código = 159 (um círculo)"
 
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   1
//--- plotar ColorArrow
#property indicator_label1  "ColorArrow"
#property indicator_type1   DRAW_COLOR_ARROW
//--- Define 8 cores para colorir o histograma com base nos dias de semana (eles são armazenados no array especial)
#property indicator_color1  clrRed,clrBlue,clrSeaGreen,clrGold,clrDarkOrange,clrMagenta,clrYellowGreen,clrChocolate
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
 
//--- parâmetros de entrada
input int      N=5;         // Número de ticks para mudar
input ushort   code=159;    // Código símbolo para desenhar em DRAW_ARROW
int            color_sections;
//--- Um buffer do indicador para plotar
double         ColorArrowBuffer[];
//--- Um buffer para armazenar índices de cor
double         ColorArrowColors[];
//--- 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
  };
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado                 |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- mapeamento de buffers do indicador
   SetIndexBuffer(0,ColorArrowBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ColorArrowColors,INDICATOR_COLOR_INDEX);
//--- Definir o código símbolo para desenho em PLOT_ARROW
   PlotIndexSetInteger(0,PLOT_ARROW,code);
//--- Definir o deslocamento vertical das setas em pixels
   PlotIndexSetInteger(0,PLOT_ARROW_SHIFT,5);
//--- Definir como um valor vazio 0
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);   
//---- O número de cores para a colorir a senóide
   color_sections=8;   //  veja um comentário #property indicator_color1
//---
   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;
//--- Calcular ticks para mudar a cor, tamanho, deslocamento e código da seta
   ticks++;
//--- Se um número crítico de ticks tem sido acumulado
   if(ticks>=N)
     {
      //--- Alterar propriedades de seta
      ChangeLineAppearance();
      //--- Mude as cores usadas para desenhar o histograma
      ChangeColors(colors,color_sections);
      //--- Redefinir o contador de ticks para zero
      ticks=0;
     }
 
//--- Bloco para cálculo dos valores do indicador
   int start=1;
   if(prev_calculated>0) start=prev_calculated-1;
//--- Calculando loop
   for(int i=1;i<rates_total;i++)
     {
      //--- Se o preço atual fechado é mais alto do que o anterior, desenhar uma seta
      if(close[i]>close[i-1])
         ColorArrowBuffer[i]=close[i];
      //--- Caso contrário, especificar o valor nulo
      else
         ColorArrowBuffer[i]=0;
      //--- Cor da seta
      int index=i%color_sections;
      ColorArrowColors[i]=index;
     }
//--- valor retorno de prev_calculated para a próxima chamada
   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("ArrowColorIndex[%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 código das setas (PLOT_ARROW)
   number=MathRand();
//--- Obter o restante da divisão de número inteiro para calcular um novo código da seta(a partir de 0 até 19)
   int code_add=number%20;
//--- Definir o novo símbolo de código como o resultado de code+code_add
   PlotIndexSetInteger(0,PLOT_ARROW,code+code_add);
//--- Escreva o código de símbolo PLOT_ARROW
   comm="\r\n"+"PLOT_ARROW="+IntegerToString(code+code_add)+comm;   
 
//--- Um bloco de mudança do deslocamento vertical das setas em pixels
   number=MathRand();
//--- Obter o deslocamento como o restante da divisão inteira
   int shift=20-number%41;
//--- Define um deslocamento a partir de
   PlotIndexSetInteger(0,PLOT_ARROW_SHIFT,shift);
//--- Escrever o deslocamento PLOT_ARROW_SHIFT
   comm="\r\n"+"PLOT_ARROW_SHIFT="+IntegerToString(shift)+comm;
 
//--- Mostrar a informação no gráfico usando um comentário
   Comment(comm);
  }