Estilos de Indicador em Exemplos

O MetaTrader 5 Terminal Cliente inclui 38 indicadores técnicos que podem ser usados em MQL5 programas usando funções apropriadas. Mas a principal vantagem da língua MQL5 é a capacidade de criar indicadores personalizados, os quais podem então serem utilizados em Expert Advisors ou simplesmente serem aplicados sobre gráficos de preços para fins de análise técnica.

O conjunto total dos indicadores podem serem derivados a partir de várias bases de estilos de desenhos, conhecidas como plotagem. Plotagem denota uma forma de visualização de dados, que o indicador calcula, armazena e providencia o pedido. Existem sete tipos básicos plotagem:

  1. Uma linha
  2. Uma seção (segmento)
  3. Histograma
  4. Seta (símbolo)
  5. Uma área pintada (canal preenchido)
  6. Bars
  7. Castiçal (candlesticks) japonês

Cada plotagem requer um para cinco arrays do tipo double, em que os valores dos indicadores são armazenados. Para efeitos de comodidade, estes arrays são associados com os buffers do indicador. O número de buffers em um indicador deve ser declarado com antecedência usando diretivas de compilador, por exemplo:

#property indicator_buffers 3 // Número de buffers
#property indicator_plots   2 // Número de plotes

O número de buffers no indicador é sempre maior ou igual ao número de plotagem no indicador.

Como cada tipo de plotagem básica pode ter variação de cor ou detalhes de construção, o número real de tipos de plotagem em MQL5 é de 18:

Plotagem

Descrição

Buffers de valor

Buffers de cor

DRAW_NONE

Não é apresentado visualmente no gráfico, mas os valores do buffer correspondente podem ser vistos na Janela de Dados

1

-

DRAW_LINE

Uma linha é plotada sobre os valores do buffer correspondente (valores vazios no buffer são indesejáveis)

1

-

DRAW_SECTION

É desenhado como segmentos de linha entre os valores do buffer correspondente (geralmente tem muitos valores vazios)

1

-

DRAW_HISTOGRAM

É desenhado como um histograma a partir da linha zero para os valores do buffer correspondente (pode ter valores vazios)

1

-

DRAW_HISTOGRAM2

É desenhado como um histograma sobre dois buffers de indicador (pode ter valores vazios)

2

-

DRAW_ARROW

É desenhado como símbolos(pode ter valores vazios)

1

-

DRAW_ZIGZAG

Similar ao estilo DRAW_SECTION, mas diferentemente, pode plotar segmentos verticais em uma barra

2

-

DRAW_FILLING

Preenchimento de cor entre duas linhas. 2 valores dos buffers correspondentes são mostrados na Janela de Dados

2

-

DRAW_BARS

É desenhado como barras. 2 valores dos buffers correspondentes são mostrados na Janela de Dados

4

-

DRAW_CANDLES

Desenhado como Castiçais Japoneses (candlesticks). 2 valores dos buffers correspondentes são mostrados na Janela de Dados

4

-

DRAW_COLOR_LINE

Uma linha para o qual você pode alternar as cores em diferentes barras ou mudar suas cores, a qualquer momento

1

1

DRAW_COLOR_SECTION

Similar ao estilo DRAW_SECTION, mas a cor de cada seção pode ser ajustada individualmente; cor também pode ser ajustada dinamicamente

1

1

DRAW_COLOR_HISTOGRAM

Similar ao estilo DRAW_HISTOGRAM, mas cada faixa pode ter uma cor diferente, você pode definir a cor dinamicamente

1

1

DRAW_COLOR_HISTOGRAM2

Similar ao estilo DRAW_HISTOGRAM2, mas cada faixa pode ter uma cor diferente, você pode definir a cor dinamicamente

2

1

DRAW_COLOR_ARROW

Similar ao estilo DRAW_ARROW, mas cada símbolo pode ter sua cor. Cor pode ser mudada dinamicamente

1

1

DRAW_COLOR_ZIGZAG

O estilo DRAW_ZIGZAG com opções de cores individuais das seções e mudança dinâmica das cores

2

1

DRAW_COLOR_BARS

O estilo DRAW_BARS com opções de cores individuais das barras e mudança dinâmica das cores

4

1

DRAW_COLOR_CANDLES

O estilo DRAW_CANDLES com opções de cores individuais dos castiçais (candlesticks) e mudança dinâmica das cores

4

1

 

A diferença entre um buffer de indicador e um array

Cada indicador, no seu nível global, você deve declarar uma ou mais arrays do tipo double, o qual então deve ser usado como um buffer de indicador usando a função SetIndexBuffer(). Para desenhar plotagem de indicador, apenas os valores dos buffers do indicador são utilizados, quaisquer outros arrays não podem ser usados para esta finalidade. Além disso, os valores de buffer são exibidos na Janela de Dados.

Um buffer de indicador deve ser dinâmico e não requer especificação de tamanho — o tamanho do array usado como buffer de indicador, é definido pelo subsistema do terminal com execução automática.

Após o array estar ligado ao buffer de indicador, a direção de indexação é definida por padrão num arrays comum, mas pode usar a função ArraySetAsSeries() para alterar o modo de acesso aos elementos array. Por padrão, o buffer de indicador é usado para armazenar dados usados para plotagem INDICATOR_DATA).

Se os cálculos dos valores de indicador requerem segurança de cálculos intermediários e armazenamento de valores adicionais para cada barra, então esse array pode ser declarado como um buffer de cálculo durante a ligação (INDICATOR_CALCULATIONS). Para valores intermediários, você também pode usar um array regular, mas neste caso, o programador tem que gerenciar o tamanho do array.

Algumas plotagens permitem definir uma cor para cada barra. Para armazenar a informação sobre cor, buffers de cores são usados (INDICATOR_COLOR_INDEX). A cor é um tipo integer color, mas todos os buffers de indicadores serão do tipo double. Valores de cor e buffers auxiliares (INDICATOR_CALCULATIONS) não podem ser obtidos usando CopyBuffer().

O número de buffers de indicadores devem ser especificados usando a diretiva de compilador #property indicator_buffers number_of_buffers:

#property indicator_buffers 3  //  o indicador tem 3 buffers

O número máximo permitido de buffers em um indicador é 512.

 

Relevância de Buffers de Indicadores e Plotagem

Cada plotagem é baseada em um ou mais buffers do indicador. Assim, para a exibição de castiçais (candlesticks) simples, quatro valores são obrigatórios - Open (abertura), High (alta), Low (baixa) e Close (fechamento) de preços. Conseqüentemente, para exibir um indicador na forma de castiçais (candlesticks), é necessário declarar 4 buffers de indicadores e 4 arrays do tipo double para eles. Por exemplo:

//--- O indicador tem quatro buffers de indicadores
#property indicator_buffers 4
//--- O indicador tem uma plotagem
#property indicator_plots   1
//--- Graficamente plotando número 1 aparecerá como castiçais (candlesticks)
#property indicator_type1   DRAW_CANDLES
//--- Castiçais (candlesticks) serão desenhados em clrDodgerBlue
#property indicator_color1  clrDodgerBlue
//--- 4 arrays para buffers de indicadores
double OBuffer[];
double HBuffer[];
double LBuffer[];
double CBuffer[];

 

Graficamente, plotagens automáticas usam buffers de indicadores de acordo com o número de plotagem. A numeração da plotagem começa com um, a numeração dos buffers começa com zero. Se a primeira plotagem requer 4 buffers do indicador, então os primeiros quatro buffers do indicador serão utilizados para desenhá-lo. Estes quatro buffers devem estar lincados com os arrays apropriados com a indexação correta usando a função SetIndexBuffer().

//--- Arrays vinculados com buffers de indicador
   SetIndexBuffer(0,OBuffer,INDICATOR_DATA);  // O primeiro buffer corresponde ao índice zero
   SetIndexBuffer(1,HBuffer,INDICATOR_DATA);  // O segundo buffer corresponde ao índice 1
   SetIndexBuffer(2,LBuffer,INDICATOR_DATA);  // O terceiro buffer corresponde ao índice 2
   SetIndexBuffer(3,CBuffer,INDICATOR_DATA);  // O quarto buffer corresponde ao índice 3

A plotagem dos castiçais (candlesticks), o indicador usará apenas o primeiro dos quatro buffers, porque a plotagem do "candlestick" foi anunciado sobre o primeiro número.

Alterar o exemplo, e adicionar plotagem de uma linha simples - DRAW_LINE. Agora, suponha que a linha é numerada como 1, e os castiçais (candlesticks) são o número 2. O número de buffers e o número plotagem aumentou.

//--- O indicador tem 5 buffers de indicador
#property indicator_buffers 5
//--- O indicador tem 2 plotagens
#property indicator_plots   2
//--- Plotagem 1 é uma linha
#property indicator_type1   DRAW_LINE
//--- A cor d linha é clrDodgerRed
#property indicator_color1  clrDodgerRed
//--- Plotagem 2 é desenhado como castiçal (candlestick) japonês
#property indicator_type2   DRAW_CANDLES
//--- A cor do castiçal (candlestick) é clrDodgerBlue
#property indicator_color2  clrDodgerBlue
//--- 5 arrays para buffers de indicador 
double LineBuffer[];
double OBuffer[];
double HBuffer[];
double LBuffer[];
double CBuffer[];

A ordem das plotagem mudou, e agora a linha vem em primeiro lugar, seguido dos castiçais (candlesticks) Japoneses. Portanto, a ordem dos buffers é apropriado - primeiro anunciamos um buffer para a linha com o índice zero, e então quatro buffers para os castiçais (candlesticks).

   SetIndexBuffer(0,LineBuffer,INDICATOR_DATA);  // O primeiro buffer corresponde ao índice 0
//--- Ligando arrays com buffers de indicador para os castiçais (candlesticks)
   SetIndexBuffer(1,OBuffer,INDICATOR_DATA);     // O segundo buffer corresponde ao índice 1
   SetIndexBuffer(2,HBuffer,INDICATOR_DATA);     // O terceiro buffer corresponde ao índice 2
   SetIndexBuffer(3,LBuffer,INDICATOR_DATA);     // O quarto buffer corresponde ao índice 3
   SetIndexBuffer(4,CBuffer,INDICATOR_DATA);     // O quinto buffer corresponde ao índice 4 

 

O número de buffers e plotagens serão definidos usando somente diretivas de compilador, é impossível alterar essas propriedades dinamicamente usando funções.

 

Versões Coloridas de Estilos

Como são vistos na tabela, os estilos são divididos em dois grupos. O primeiro grupo inclui estilos cujo nome não existe a palavra COLOR, nós chamamos de estilos básicos:

  • DRAW_LINE
  • DRAW_SECTION
  • DRAW_HISTOGRAM
  • DRAW_HISTOGRAM2
  • DRAW_ARROW
  • DRAW_ZIGZAG
  • DRAW_FILLING
  • DRAW_BARS
  • DRAW_CANDLES

No segundo grupo, os nomes de estilo contêm a palavra COLOR, vamos chamá-los de versões de cores:

  • DRAW_COLOR_LINE
  • DRAW_COLOR_SECTION
  • DRAW_COLOR_HISTOGRAM
  • DRAW_COLOR_HISTOGRAM2
  • DRAW_COLOR_ARROW
  • DRAW_COLOR_ZIGZAG
  • DRAW_COLOR_BARS
  • DRAW_COLOR_CANDLES

Todas as versões de cores de estilos diferentes a partir das básicas permitem especificar uma cor para cada parte da plotagem. A parte mínima de plotagem é uma barra, então podemos dizer que as versões de cores permitem definir a cor de cada bar.

As exceções são os estilos DRAW_NONE e DRAW_FILLING, eles não tem versões de cores.

Para definir a plotagem da cor em cada barra, um buffer adicional para armazenar o índice de cor foi adicionada à versão de cor. Estes índices indicam o número de uma cor numa array especial, a qual contém um conjunto predefinido de cores. O tamanho do array das cores é 64. Isto significa que cada versão de cor de um estilo de pintura permite uma plotagem de 64 cores diferentes.

O conjunto e o número de cores na array especial de cores será definido através de uma diretiva de compilação #property indicator_color, onde pode especificar todas as cores necessárias separadas por vírgulas. Por exemplo, como uma entrada de um indicador:

//--- Definir 8 cores para colorir os candlesticks (eles são armazenados na array especial)
#property indicator_color1  clrRed,clrBlue,clrGreen,clrYellow,clrMagenta,clrCyan,clrLime,clrOrange

Ele afirma que para plotar 1, 8 cores são definidas, que serão colocados em um array especial. Além disso o programa não especifica a cor da plotagem, mas apenas o seu índice. Se quisermos definir a cor vermelha para o número de barras K, o valor da cor do índice a partir de array deve ser definido no buffer de cor do indicador. A cor vermelha é especificada pela primeira vez na diretiva, que corresponde ao número de índice 0.

  //--- definir a cor clrRed para candlestick
  col_buffer[buffer_index]=0;

O conjunto de cores não é colocado de uma vez por todas, pode ser alterado de forma dinâmica usando PlotIndexSetInteger(). Exemplo:

      //--- 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
                          color_array[i]);      //  Uma nova cor

 

Propriedades do indicador e plotagem

Para plotagem de indicadores, propriedades podem ser definidas por meio de diretivas de compilador e usando as funções apropriadas. Ler maiores informações sobre isto em Conexão entre Propriedades do Indicador e Funções. Mudança dinâmica de propriedades do indicador usando funções especiais permitem a criação de indicadores personalizados mais flexíveis.

 

Início do Desenho do Indicador no Gráfico

Em muitos casos, de acordo com as condições do algoritmo, é impossível iniciar o cálculo dos valores do indicador imediatamente com a barra atual, uma vez que é necessário proporcionar um número mínimo de barras anteriores disponíveis no histórico. Por exemplo, muitos tipos de alisamento implicam na utilização de um array de preços sobre N barras anteriores, e com base nestes valores, o valor do indicador na barra atual é calculado.

Nestes casos, não existe qualquer maneira para calcular os valores do indicador para as primeiras N barras, ou estes valores não se destinam a ser apresentados no gráfico e são apenas subsidiadas para calcular novos valores. Para evitar a plotagem do indicador nas primeiras N barras do histórico, defina o valor N para a propriedade PLOT_DRAW_BEGIN para a plotagem correspondente:

//--- Ligando arrays com buffers de indicador para os castiçais (candlesticks)
PlotIndexSetInteger(number_of_plot,PLOT_DRAW_BEGIN,N);

Onde:

  • number_of_plot — um valor a partir de zero para indicator_plots-1 (numeração dos lotes inicia com zero).
  • N - o número da primeira barra no histórico, no qual o indicador não deve ser exibido sobre o gráfico.