Referência MQL5Indicadores Customizados 

Indicadores Customizados

Este é o grupo de funções utilizadas na criação dos indicadores personalizados. Estas funções não podem ser usadas para escrever Expert Advisors e Scripts.

Função

Ação

SetIndexBuffer

Vincula-se o buffer de indicador especificado com dinâmica unidimensional array do tipo double

IndicatorSetDouble

Define o valor da propriedade de um indicador do tipo double

IndicatorSetInteger

Define o valor da propriedade de um indicador do tipo int

IndicatorSetString

Define o valor da propriedade de um indicador do tipo string

PlotIndexSetDouble

Define o valor da propriedade de linha de um indicador do tipo double

PlotIndexSetInteger

Define o valor da propriedade de linha de um indicador do tipo int

PlotIndexSetString

Define o valor da propriedade de linha de um indicador do tipo string

PlotIndexGetInteger

Retorna o valor da propriedade de linha de um indicador do tipo inteiro

Propriedades de indicador podem ser definidas utilizando as diretivas de compilador ou o uso de funções. Para entender melhor isso, é recomendável que você estude estilos de indicador como exemplos.

Todos os cálculos necessários de um indicador personalizado devem ser colocados na função predeterminada OnCalculate(). Se você usar uma forma abreviada da função chamada OnCalculate(), como

int OnCalculate (const int rates_total, const int prev_calculated, const int begin, const double& price[])

então a variável rates_total contém o valor do número total de elementos da ordem de price[], passados como um parâmetro de entrada para calcular os valores do indicador.

Parâmetro prev_calculated é o resultado da execução de OnCalculate() na chamada anterior, que permite organizar um algoritmo salvo para calcular os valores do indicador. Por exemplo, se o valor corrente de rates_total = 1000, prev_calculated = 999, então talvez seja bastante para fazer os cálculos apenas para um valor de cada buffer indicador.

Se a informação sobre o tamanho da entrada da ordem de preço fosse disponibilizado, então isso levaria à necessidade de fazer cálculos para 1000 valores de cada buffer de indicador. Na primeira chamada do OnCalculate(), o valor prev_calculated = 0. Se a ordem de price[] foi alterado de alguma forma, então neste caso prev_calculated também é igual a 0 (zero).

O parâmetro begin mostra o número de valores iniciais da ordem de preço, que não contêm dados para o cálculo. Por exemplo, se o valor de Accelerator Oscillator (para os quais os primeiros 37 valores não são calculados) foram utilizados como um parâmetro de entrada, então begin = 37. Por exemplo, vamos considerar um simples indicador:

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
//---- plot Label1
#property indicator_label1  "Etiqueta 1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- buffers do indicador
double         Label1Buffer[];
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado                 |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- mapeamento de buffers do indicador
   SetIndexBuffer(0,Label1Buffer,INDICATOR_DATA);
//---
  }
//+------------------------------------------------------------------+
//| Função de iteração do indicador customizado                      |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
 
  {
//---
   Print("begin = ",begin,"  prev_calculated = ",prev_calculated,"  rates_total = ",rates_total);
//--- valor retorno de prev_calculated para a próxima chamada
   return(rates_total);
  }

Arrastá-lo a partir da janela do "Navegador" para a janela do indicador Accelerator Oscillator e nós indicamos que os cálculos devem ser feitos com base nos valores do indicador anterior:

Calculando um indicador sobre valores do indicador anexado anteriormente

Como um resultado, a primeira chamada do valor OnCalculate() de prev_calculated será igual a zero, e em outras chamadas será igual ao valor rates_total (até que o número de barras no gráfico de preço aumenta).

O parâmetro begin mostra o número de barras inicial, em que os valores são omitidos

O valor do parâmetro begin será exatamente igual ao número das barras iniciais, para os quais os valores do indicador Accelerator não são calculados de acordo com a lógica do indicador. Se nós olharmos para o código fonte do indicador personalizado Accelerator.mq5, nós veremos as linha seguintes na função OnInit():

//--- define a primeira barra a partir do qual o índice será desenhado
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,37);

Usando a função PlotIndexSetInteger(0, PLOT_DRAW_BEGIN, empty_first_values), nós definimos o número não-existente dos primeiros valores no array zero de um indicador personalizado, o qual não precisamos aceitar para o cálculo (empty_first_values). Assim, temos mecanismos para:

  1. definir o número de valores iniciais de um indicador, o qual não deverá ser usado para os cálculos de outro indicador personalizado;
  2. obter informações sobre o número dos primeiros valores a serem ignorados quando você chamar um outro indicador personalizado , sem entrar na lógica de seus cálculos.