DRAW_FILLING

O estilo DRAW_FILLING plota uma área colorida entre valores de dois buffers do indicador. De fato, este modelo desenha duas linhas e preenche o espaço entre elas, com uma das duas cores específicas. Ele é usado para a criação de indicadores que desenham canais. Nenhum dos buffers podem conter apenas valores vazios, uma vez que, neste caso, nada é plotado.

Você pode definir duas cores de preenchimento:

  • a primeira cor é usada para as áreas onde os valores do primeiro buffer são maiores do que os valores do segundo buffer do indicador;
  • a segunda cor é usada para as áreas onde os valores de do segundo buffer do são maiores do que os valores no primeiro buffer indicador.

A cor de preenchimento pode ser definida usando 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 mudanças de aparência dependem da situação corrente.

O indicador é calculado para todas as barras, para a qual os valores dos dois buffers do indicador não são iguais a 0 ou o valor vazio. Para especificar o valor que deve ser considerado como "vazio", defina esse valor na propriedade PLOT_EMPTY_VALUE:

   #define INDICATOR_EMPTY_VALUE -1.0
   ...
//--- INDICATOR_EMPTY_VALUE (valor vazio) não vai participar no cálculo de
   PlotIndexSetDouble (DRAW_FILLING_creation_index,PLOT_EMPTY_VALUE,INDICATOR_EMPTY_VALUE);

Desenhar sobre as barras que não participam no cálculo do indicador depende dos valores nos buffers do indicador:

  • Barras, para os quais os valores de ambos os buffers do indicador são iguais a 0, não participam no desenho do indicador. Isto significa que a área com valores iguais a zero não é preenchida.

DRAW_FILLING_without_drawing

  • Barras, para as quais os valores dos buffers do indicador são iguais ao "valor vazio", participam no desenho do indicador. A área com valores vazios será preenchida de modo que conecte as áreas com valores significativos.

DRAW_FILLING_with_drawing

Deve ser notado que se o "valor vazio" é igual a zero, as barras que não participam no cálculo do indicador também são preenchidas.

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

Um exemplo do indicador que desenha um canal entre duas MAs com diferentes períodos médios em uma janela separada. A mudança das cores no cruzamento das médias móveis mostra visualmente a mudança das tendências ascendentes e descendentes. As cores alteram aleatoriamente a cada N ticks. O parâmetro N é definido nos parâmetro externos do indicador para a possibilidade de configuração manual (na guia Parâmetros na janela Propriedades do indicador).

DRAW_FILLING

Note que inicialmente para plot1 com DRAW_FILLING as propriedades são definidas usando a diretiva de compilador #property, e então na função OnCalculate() novas cores são definidas aleatoriamente.

//+------------------------------------------------------------------+
//|                                                 DRAW_FILLING.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_FILLING"
#property description "Ele desenha um canal entre duas MAs em uma janela separada"
#property description "O preenchimento da cor é alterada aleatoriamente"
#property description "depois de cada N ticks"
 
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   1
//--- plotar Interseção
#property indicator_label1  "Interseção"
#property indicator_type1   DRAW_FILLING
#property indicator_color1  clrRed,clrBlue
#property indicator_width1  1
//--- parâmetros de entrada
input int      Fast=13;          // Período rápido da MA
input int      Slow=21;          // Período lento da MA
input int      shift=1;          // Deslocamento das MAs para frente (positivo)
input int      N=5;              // Número de ticks para alterar 
//--- buffers do Indicador
double         IntersectionBuffer1[];
double         IntersectionBuffer2[];
int fast_handle;
int slow_handle;
//--- Um array para armazenar as cores
color colors[]={clrRed,clrBlue,clrGreen,clrAquamarine,clrBlanchedAlmond,clrBrown,clrCoral,clrDarkSlateGray};
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado                 |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- mapeamento de buffers do indicador
   SetIndexBuffer(0,IntersectionBuffer1,INDICATOR_DATA);
   SetIndexBuffer(1,IntersectionBuffer2,INDICATOR_DATA);
//---
   PlotIndexSetInteger(0,PLOT_SHIFT,shift);
//---
   fast_handle=iMA(_Symbol,_Period,Fast,0,MODE_SMA,PRICE_CLOSE);
   slow_handle=iMA(_Symbol,_Period,Slow,0,MODE_SMA,PRICE_CLOSE);
//---
   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 suficiente de ticks foi acumulado
   if(ticks>=N)
     {
      //--- Alterar as propriedades da linha
      ChangeLineAppearance();
      //--- Redefinir o contador de ticks para zero
      ticks=0;
     }
 
//--- Faz o primeiro cálculo do indicador, ou os dados foram alterados e requerem um recálculo completo
   if(prev_calculated==0)
     {
      //--- Copia todos os valores dos indicadores para os buffers apropriados
      int copied1=CopyBuffer(fast_handle,0,0,rates_total,IntersectionBuffer1);
      int copied2=CopyBuffer(slow_handle,0,0,rates_total,IntersectionBuffer2);
     }
   else // Preenche apenas os dados que são atualizados
     {
      //--- Obtém a diferença entre as barras atuais e as que iniciaram anteriormente ao OnCalculate()
      int to_copy=rates_total-prev_calculated;
      //--- Se não existe qualquer diferença, ainda cópia um valor - na barra zero
      if(to_copy==0) to_copy=1;
      //--- copia valores to_copy para o fim dos buffers do indicador
      int copied1=CopyBuffer(fast_handle,0,0,to_copy,IntersectionBuffer1);
      int copied2=CopyBuffer(slow_handle,0,0,to_copy,IntersectionBuffer2);
     }
//--- valor retorno de prev_calculated para a próxima chamada
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Altera as cores do preenchimento do canal                        |
//+------------------------------------------------------------------+
void ChangeLineAppearance()
  {
//--- Uma string para a formação de informações sobre as propriedades de linha
   string comm="";
//--- Um bloco para alterar a cor da linha
   int number=MathRand(); // Obter um número aleatório
//--- O divisor é igual ao tamanho do array colors[]
   int size=ArraySize(colors);
 
//--- Obter o índice para selecionar uma nova cor como o restante da divisão inteira
   int color_index1=number%size;
//--- Define a primeira cor como a propriedade PLOT_LINE_COLOR
   PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,colors[color_index1]);
//--- Escreve a primeira cor
   comm=comm+"\r\nColor1 "+(string)colors[color_index1];
 
//--- Obter o índice para selecionar uma nova cor como o restante da divisão inteira
   number=MathRand(); // Obtém um número aleatório
   int color_index2=number%size;
//--- Define a segunda cor como a propriedade PLOT_LINE_COLOR
   PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,colors[color_index2]);
//--- Escreve a segunda cor
   comm=comm+"\r\nColor2 "+(string)colors[color_index2];
//--- Mostrar a informação no gráfico usando um comentário
   Comment(comm);
  }