English Русский 中文 Español Deutsch 日本語 한국어 Français Italiano Türkçe
Indicadores de William Blau e sistemas de comércio no MQL5. Parte 1: Indicadores

Indicadores de William Blau e sistemas de comércio no MQL5. Parte 1: Indicadores

MetaTrader 5Sistemas de negociação | 7 fevereiro 2014, 09:08
4 319 0
Andrey F. Zelinsky
Andrey F. Zelinsky

Comércio técnico apenas pode ser explorado se boas ferramentas estiverem disponíveis.
As ferramentas de um bom negociante são experiência, julgamento, e uma hierarquia matemática fornecida por um bom programa de computador de comércio.
William Blau

Introdução

A primeira parte do artigo "indicadores e sistemas de comércio no MQL5 por William Blau. Parte 1: Indicadores" é uma descrição de indicadores e osciladores, descrita por William Blau no livro Momento, Direção e Divergência.

Os indicadores e osciladores, descritos neste artigo, são apresentados como códigos-fonte na linguagem MQL5 e anexados ao arquivo "Blau_Indicators_MQL5_en.zip".

A ideia chave de análise por William Blau

A análise técnica por William Blau consiste em quatro fases:

  1. Usando os dados de série de preço (barras q), o indicador é calculado e colocado no gráfico. O indicador não reflete a tendência geral do movimento de preço, e não permite determinar os pontos de reversão de tendência.
  2. O indicador é suavizado diversas vezes, usando o método EMA: a primeira vez (com período r), a segunda vez (com período s), e a terceira vez (com período u); um indicador suavizado é traçado. Um indicador suavizado é razoavelmente preciso e reproduz as flutuações de preço com um atraso mínimo. Ele permite determinar a tendência do movimento de preço e os pontos de reversão e elimina o ruído de preço.
  3. O indicador suavizado é normalizado, um indicador suavizado normalizado é traçado. A normalização permite que o valor do indicador seja interpretado como os estados de sobrecompra ou sobrevenda do mercado.
  4. Um indicador suavizado normalizado é suavizado uma vez pelo método EMA (período ul); um oscilador é construído - o histograma do indicador e a linha de sinal, os níveis de sobrecompra e sobrevenda do mercado são adicionados. O oscilador nos permite distinguir os estados de sobrecompra e sobrevenda do mercado, os pontos de reversão e o final de uma tendência.

Indicadores

O artigo descreve os seguintes grupos de indicadores:

  1. Indicadores, baseados no Momento:
  2. Indicadores, baseados na Estocástica:
  3. Indicadores, baseados no Momento estocástico:
  4. Indicadores, baseados em um desvio médio de tendências de mercado:
  5. Indicadores baseados na Convergência/divergência de média móvel:
  6. Indicadores, baseados no Momento de Candlestick:
  7. Indicadores, baseados em um momento composto alto-baixo:

Para cada grupo de indicadores, os seguintes são apresentados:

  • índice do indicador suavizado;
  • O índice do indicador suavizado normalizado;
  • O oscilador, baseado no índice do índice suavizado normalizado.

A seção Verdadeiro índice de força contém:

  • Uma análise detalhada da abordagem de William Blau sobre o aspecto da análise técnica do gráfico de preço;
  • Uma descrição detalhada do algoritmo e código de cada indicador dos grupos de indicadores baseados no momento.

Como método de suavização, William Blau usa as exponencialmente suavizadas médias móveiss (EMA). A Média Móvel Exponencial é calculada adicionando ao valor anterior da média móvel uma certa porcentagem do preço atual.

Quando usa-se o EMA, os últimos preços possuem um peso maior.

A função de cálculo do EMA:

EMA(k,n) = EMA(k-1,n) + 2/(n+1) * (price(k) - EMA(k-1,n))
         = price(k) * 2/(n+1) + EMA(k-1,n) * (1 - 2/(n+1))

onde:

  • EMA(k,n) - média móvel suavizada exponencialmente do período n para o momento de período k;
  • price(k) - o preço no momento do período k.

A descrição dos quatro tipos de médias móveis e os métodos de seu uso em análise técnica (veja também iMA) podem ser achados na "Ajuda do MetaTrader 5" ("Análise/Indicadores técnicos/indicadores de tendência/média móvel").

A biblioteca de funções

A biblioteca de funções para cálculo das médias móveis está localizada em "MovingAverages.mqh". Estamos preocupados com o ExponentialMAOnBuffer(), que preenche o array de saída buffer[] com valores EMA do array de entrada price[]. Entretanto, a implementação de ExponentialMAOnBuffer() apresentada em "MovingAverages.mqh" possui a desvantagem que não funciona com período n = 1.

Veja no código-fonte:

if(period<=1 || rates_total-begin<period) return(0);

Entretanto, William Blau, em seu livro, utiliza o período de suavização n = 1 como a ausência de suavização.

Portanto, o código da função ExponentialMAOnBuffer() passou por algumas alterações:

if(period<1 || rates_total-begin<period) return(0);

e assim obtemos a ExponentialMAOnBufferWB(). O código desta função está localizado no arquivo "WilliamBlau.mwh".

O arquivo "WilliamBlau.mqh" também possui as seguintes funções:

  • A função PriceName() retorna o tipo de preço como string:
string PriceName(
                 const int applied_price // price type
                )
  • A função CalculatePriceBuffer() calcula o array de preço deste tipo de preço:
int CalculatePriceBuffer(
                         const int applied_price,   // price type
                         const int rates_total,     // rates total
                         const int prev_calculated, // bars, processed at the last call
                         const double &Open[],      // Open[]
                         const double &High[],      // High[]
                         const double &Low[],       // Low[]
                         const double &Close[],     // Close[]
                         double &Price[]           // calculated prices array
                        )

O tipo de preço aplicado e o quadro de tempo do gráfico de preço

William Blau considera os preços de fechamento do quadro de tempo diário. Os indicadores desenvolvidos neste artigo, permitem a você escolher o tipo de preço (veja constantes de preço), o quadro de tempo do gráfico de preço depende do quadro de tempo do indicador (veja quadros de tempo de gráfico).


1. O índice de força verdadeira

Os indicadores considerados (veja anexo):

  1. Blau_Mtm.mq5 - Indicador da taxa (momento do período q; momento do período q suavizado);
  2. Blau_TSI.mq5 - índice de força verdadeira (Momento de período q suavizado);
  3. Blau_Ergodic.mq5 - Oscilador ergódico (baseado no índice de força verdadeira).

1,1. Momento

A descrição do indicador técnico embutido Momento, e seu uso em uma análise técnica pode ser encontrado na seção "Análise/Indicadores técnicos/osciladores/momento" da "Ajuda do MetaTrader 5" (veja também iMomentum). Em contraste com o momento padrão (iMomentum), o Momento de William Blau calcula o momento como uma alteração de preço absoluta.

Um exemplo da implementação MQL5 do indicador de força real (TSI) por William Blau é apresentado no artigo "MQL5: Crie seu próprio indicador".


1.1.1. Análise técnica usando o indicador de momento

O objeto da análise técnica é o gráfico de preço do instrumento financeiro. Cada elemento do gráfico é uma barra de preço. A barra de preço possui as seguintes características: opening time, opening price, maximum price, minimum price, closing price, trading volumes, e outro. A barra de preço é formada e reflete o comportamento de preços durante um período de tempo discreto específico (quadro de tempo do gráfico).

A tarefa da análise técnica do gráfico de preço é determinar a tendência atual do movimento de preço, revelar os picos e baixas de preço e predizer a direção da alteração de preço no período de tempo futuro. A complexidade disto é que o preço, enquanto se move dentro dos limites de sua tendência básica, realiza flutuações multidirecionais, criando o chamado ruído de preço.

O que William Blau propôs. A primeira diferença: o momento. William Blau calculou o momento como relativo à alteração de preço [fechamento] para cada período de tempo [dia]; e criou o indicador de momento. Do ponto de vista matemático, a função de momento é o primeiro elemento derivado do preço.

Fig. 1,1. Indicador de momento (momento do período q)

Fig. 1,1. Indicador de momento (momento do período q)

O momento exibe as flutuações de preço do período de um dia e mostra a velocidade (magnitude) e a direção das alterações sobre este período, mas ela não reflete a tendência geral do movimento de preço, e não determina os pontos de reversão de tendência.

A segunda diferença é a suavização. A média móvel do momento (a soma cumulativa das flutuações) reproduz quase exatamente as variações principais e globais das curvas de preços. Fig. 1.2 (a) nas subjanelas I, II apresenta o momento suavizado (médias móveis com períodos de 20 e 300, respectivamente).

Quanto maior o período da média móvel, mais precisamente o momento suavizado se aproxima (reproduz) das flutuações da curva de preço. Do ponto de vista matemático, a função de suavização do momento é a função integral do momento, ou a função restaurada do preço.

Fig. 1.2 (a). Indicador de momento (momento do período q suavizado)

Fig. 1.2 (a). Indicador de momento (momento do período q suavizado)


Fig. 1.2 (b). Indicador de momento (momento do período q suavizado)

Fig. 1.2 (b). Indicador de momento (momento do período q suavizado)


Na Fig. 1.2 (a), na janela principal, os indicadores EMA suavizados (com períodos de 5, 20, 100) são apresentados. Um leve aumento no período da média móvel leva a um atraso e a média móvel praticamente torna-se incapaz de reproduzir as flutuações da curva de preço.

A terceira diferença é a re-suavização. A primeira suavização do momento define a tendência principal do movimento de preço, bem como os pontos de reversão, mas não elimina o ruído. Para eliminar o ruído de preço, é necessária uma nova suavização, com um período de tempo pequeno da média móvel.

A Fig. 1.2 (b), na subjanela I apresenta o indicador de momento suavizado (média móvel com período 20), as subjanelas II e III apresentam o momento duplamente e triplamente suavizado (períodos de média móvel de 5, 3). Uma suavização repetida elimina o ruído de preço, mas adiciona um pequeno deslocamento da curva (um atraso).

A quarta diferença: a diferença em um sinal de mudanças de tendências. A suavização do momento com um pequeno período de média pode levar a uma divergência do momento suavizado com a tendência da curva de preço.

Na Fig. 1.2 (a), a discrepância é observada na subjanela I, e na Fig. 1.2 (b) - nas subjanelas I, II, III (a direção das alterações de preço diverge da direção da alteração no momento suavizado). Tais diferenças geralmente indicam uma alteração de tendência. Do ponto de vista matemático, a divergência é a função do período de suavização.

A confiança da interpretação destas diferenças como um sinal de tendências de alteração pode ser melhorada se considerarmos a divergência apenas para as áreas de sobrecompra ou sobrevenda (veja n. 1.2.1).


1.1.2. Definição de momento

O momento é uma alteração de preço relativa.

O sinal do momento mostra a direção da alteração de preço: um momento positivo - o preço aumentou durante o período, um negativo - o preço diminuiu durante o período. A magnitude do momento - é a velocidade relativa da alteração de preço (primeiro elemento derivado do preço).

Fig. 1,3. Definição de momento

Fig. 1,3. Definição de momento

Fórmula do momento:

mtm(price) = price - price[1]

onde:

  • price - preço [fechamento] do período atual;
  • price [1] - preço [fechamento] do período anterior.

William Blau examina o momento como a diferença do preço de [fechamento] do período atual e o preço de [fechamento] do período anterior. William Blau, em seu cálculo de momento de período único, usa os preços de dois períodos (os períodos atual e anterior).

Introduzimos na fórmula para cálculo do momento um indicador de período, q - é o número de períodos de tempo envolvidos no cálculo (de acordo com William Blau, q = 2).

Fórmula do momento do período q:

mtm(price,q) = price - price[q-1]

onde:

  • q - número de barras, usadas no cálculo do momento;
  • price - preço [fechamento] do período atual;
  • price [q-1] - preço de [fechamento] de (q-1) períodos atrás.

Na fórmula resultante, nosso momento de dois períodos corresponde ao momento relativo de um período de William Blau.

Fórmula do momento do período q suavizado:

Mtm(price,q,r,s,u) = EMA(EMA(EMA( mtm(price,q) ,r),s),u)

onde:

  • price - preço de [fechamento] - a base de preço do gráfico de preço;
  • q - número de barras, usadas no cálculo do momento;
  • mtm(price,q)=price-price[q-1] - momento do período q;
  • EMA (mtm (price, q), r) - a primeira suavização - o EMA(r), aplicado ao momento do período q;
  • EMA (EMA(..., r),s) - a segunda suavização - o EMA(s) aplicado ao resultado da primeira suavização;
  • EMA (EMA (EMA (..., r), s), u) - a terceira suavização - o EMA(u), aplicado ao resultado da segunda suavização.

1.1.3. Mtm(price,q,r,s,u) - indicador de taxa (momento). Especificação
  • Nome do arquivo: Blau_Mtm.mq5
  • O nome: Momento (momento do período q; momento do período q suavizado) por William Blau.
  • Parâmetros de entrada:
    • q - o período para o qual o momento é calculado (por padrão, q = 2);
    • r -período do primeiro EMA, aplicado ao momento (por padrão, r = 20);
    • s - período do segundo EMA, aplicado ao resultado da primeira suavização (por padrão, s = 5);
    • u - período do terceiro EMA, aplicado ao resultado da segunda suavização (por padrão, u = 3);
    • AppliedPrice - Tipo de preço (por padrão, AppliedPrice = PRICE_CLOSE).
  • Adicionalmente:
    • Mostrado em uma janela separada;
    • altera a renderização da plotagem gráfica - a cor, espessura, estilo de linha (aba "Cores")
  • Limitações:
    • q>0;
    • r>0, s>0, u>0. Se r, s, ou u forem iguais a 1, a suavização do EMA não é usada. Por exemplo, se você definir Mtm (price, 2, 20, 5, 1), obtemos um momento duplamente suavizado, mas se você definir Mtm (price, 2, 1, 1, 1) obtemos um momento não suavizado;
    • o tamanho mínimo do array de preços = (q-1 + r + s + u-3 +1).

1,2. O índice de forças reais

1.2.1. Análise técnica usando o índice de força real

Continua: Veja o início na Seção 1.1.1.

A quinta: normalização. Trazendo por meio da normalização de valores do momento suavizado a uma única escala (mapeando ao intervalo [-1, +1]), nos permite determinar os estados de sobrecompra ou sobrevenda do mercado. A multiplicação repetida dos valores do momento suavizado normalizado, um fator de 100 converte as série numéricas na faixa de porcentagem (mapeando ao intervalo [-100, 100]).

Fig. 1,4. Momento suavizado normalizado

Fig. 1,4. Momento suavizado normalizado


Uma discrepância, como um sinal de tendências de alteração, pode ser considerada confiável se o momento suavizado normalizado está no estado de sobrecompra ou sobrevenda.


1.2.2. A definição de índice de força real

O índice de força real (True Strength Index, TSI) - é um indicador do momento normalizado (momento do período q normalizado). Trazendo os valores do momento suavizado a uma única escala (mapeando para o intervalo [-1, +1]) é proporcionado com a normalização de cada valor do momento suavizado (a soma cumulativa das flutuações de preço do período q suavizado) pelo valor do momento suavizado, tomado em valores absolutos.

A multiplicação por um coeficiente de 100 altera o intervalo de exibição para [-100, +100] (porcento). A normalização permite a interpretação do valor do TSI como um nível de mercado em sobrecompra (positivo) ou sobrevenda (negativo).

A fórmula do índice de força real:

                     100 * EMA(EMA(EMA( mtm(price,q) ,r),s),u)         100 * Mtm(price,q,r,s,u)
TSI(price,q,r,s,u) = –––––––––––––––––––––––––------–––––––––– = ––––––––––––––––------–––––––––––––––
                       EMA(EMA(EMA( |mtm(price,q)| ,r),s),u)     EMA(EMA(EMA( |mtm(price,q)| ,r),s),u)
if EMA(EMA(EMA(|mtm(price,q)|,r),s),u)=0, then TSI(price,q,r,s,u)=0

onde:

  • price - preço de [fechamento] - a base de preço do gráfico de preço;
  • q - período do momento;
  • mtm(price,q)=price-price[q-1] - momento do período q;
  • | Mtm (price, q) | - o valor absoluto do momento do período q;
  • Mtm (price, q, r, s, u) - Momento do período q suavizado três vezes;
  • EMA (..., r) - a primeira suavização - o EMA do período r, aplicada a:
    1) momento do período q;
    2) valor absoluto do momento do período q;
  • EMA (EMA(..., r),s) - a segunda suavização - o EMA(s) aplicado ao resultado da primeira suavização;
  • EMA (EMA (EMA (..., r), s), u) - a terceira suavização - EMA(u), aplicada ao resultado da segunda suavização.

1.2.3. TSI(price,q,r,s,u) - o índice de força real Especificação
  • Nome do arquivo: Blau_TSI.mq5
  • O nome: O índice de força real (momento relativo de período q suavizado normalizado) por William Blau.
  • Parâmetros de entrada:
    • q - o período para o qual o momento é calculado (por padrão, q = 2);
    • r -período do primeiro EMA, aplicado ao momento (por padrão, r = 20);
    • s - período do segundo EMA, aplicado ao resultado da primeira suavização (por padrão, s = 5);
    • u - período do terceiro EMA, aplicado ao resultado da segunda suavização (por padrão, u = 3);
    • AppliedPrice - Tipo de preço (por padrão, AppliedPrice = PRICE_CLOSE).
  • Adicionalmente:
    • Mostrado em uma janela separada;
    • altera o estilo de renderização da plotagem gráfica - a cor, espessura, estilo de linha (aba "Cores")
    • (opcional) dois níveis (o padrão é -25 e +25) - adicionar e remover um nível; alterar o valor, a descrição do nível, alterar o estilo de renderização dos níveis (a aba "Níveis");
    • alterar os limites inferior (por padrão, -100) e superior (por padrão, 100) da escala da janela de indicador único (a aba "Escala").
  • Limitações:
    • q>0;
    • r>0, s>0, u>0. Se r, s, ou u forem iguais a 1, então no período do EMA correspondente, a suavização não será realizada;
    • o tamanho mínimo do array de preços = (q-1 + r + s + u-3 +1).

1,3. Oscilador ergódico

1.3.1. Análise técnica usando o oscilador ergódico

Continua: Veja o início nas seções 1.1.1, 1.2.1.

Sexto: as áreas de um mercado em sobrecompra e sobrevenda. Um intervalo unitário [-1, +1] ou um intervalo em porcentagem [-100, 100], dentro dos quais as mudanças ocorrem nos valores do momento suavizado normalizado, permite a você definir as áreas do mercado em sobrecompra ou sobrevenda.

A classe de índices de análise técnica, que caracterizam o estado do mercado em sobrecompra ou sobrevenda, é chamado de oscilador. Para cada oscilador, os níveis são determinados, na abordagem de quais sinais de um mercado em sobrecompra ou sobrevenda são recebidos. Osciladores são ineficazes em mercados de tendências, uma vez que o mercado pode estar em condições de sobrecompra/sobrevenda por um período arbitrariamente longo.

Sétimo: A linha de sinal. Para obter um sinal sobre o final de uma tendência e a tendência de reversão de um movimento de preço, uma linha de sinal é usada. O sinal para comprar é recebido quando a linha principal cruza a linha de sinal de baixo para cima. O sinal para vender é recebido quando a linha principal cruza a linha de sinal de cima para baixo. No caso onde há uma linha principal - ou seja, uma ergódica (índice de força real), então uma outra suavização da ergódica forma uma linha de sinal. O procedimento de ressuavização é igual ao último processo de suavização ergódica.

Oitavo: a tendência de movimento de preço. A tendência do movimento de preço é ascendente (tendência ascendente), quando a linha principal (ergódica) passa acima da linha de sinal. A tendência do movimento de preço é descendente (tendência descendente), quando a linha principal (ergódica) passa abaixo da linha de sinal.

Fig. 1,5. Oscilador ergódico

Fig. 1,5. Oscilador ergódico


1.3.2. Definição do oscilador ergódico

Ergodic(price,q,r,s,u) = TSI(price,q,r,s,u)
SignalLine(price,q,r,s,u,ul) = EMA( Ergodic(price,q,r,s,u) ,ul)

onde:

  • Ergodic() - ergodic - True Strength Index TSI(price,q,r,s,u);
  • SignalLine() - uma linha de sinal - o EMA(ul), aplicado à ergódica;
  • ul - um período EMA de uma linha de sinal - de acordo com William Blau, o valor ul deve ser igual ao período da última ergódica EMA significante (>1). Por exemplo, se você está usando suavização dupla, Ergodic (price, q, r, s, u) = Ergodic (price, 2,20,5,1), então, de acordo com William Blau, ul = s = 5.

1.3.3. Ergodic (price, q,r,s,u,ul) - oscilador ergódico. Especificação
  • Nome do arquivo: Blau_Ergodic.mq5
  • Nome: O oscilador ergódico (com base no índice de força real), de acordo com William Blau.
  • Parâmetros de entrada:
    • graphic plot #0 - ergódica (um índice de força real):
      • q - o período para o qual o momento é calculado (por padrão, q = 2);
      • r -período do primeiro EMA, aplicado ao momento (por padrão, r = 20);
      • s - período do segundo EMA, aplicado ao resultado da primeira suavização (por padrão, s = 5);
      • u - período do terceiro EMA, aplicado ao resultado da segunda suavização (por padrão, u = 3);
    • graphic plot #1 - a linha de sinal:
      • ul - a linha de sinal EMA do período, é aplicada à ergódica (por padrão, ul = 3);
    • AppliedPrice - Tipo de preço (por padrão, AppliedPrice = PRICE_CLOSE).
  • Adicionalmente:
    • Mostrado em uma janela separada;
    • altera o estilo de renderização de cada plotagem gráfica - a cor, espessura, estilo de linha (aba "Cores")
    • dois níveis (o padrão é -25 e +25) - adicionar e remover um nível; alterar o valor, a descrição do nível, alterar o estilo de renderização dos níveis (a aba "Níveis");
    • altere os limites inferior (por padrão, -100) e superior (por padrão, 100) da escala da janela de indicador único (a aba "Escala").
  • Limitações:
    • q>0;
    • r>0, s>0, u>0. Se r, s, ou u forem iguais a 1, a suavização do EMA não é usada.
    • ul > 0. Se ul = 1, então a linha de sinal e as linhas ergódicas são as mesmas;
    • o tamanho mínimo do array de preços = (q-1 + r + s + u + ul-4 +1).

1,4. O código (descrição detalhada)

1.4.1. "Blau_Mtm.mq5" - indicador Mtm(price,q,r,s,u) - momento

O código do indicador Mtm (price, q, r, s, u):

//+------------------------------------------------------------------+
//|                                                     Blau_Mtm.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp." // copyright
#property link      "https://www.mql5.com"                       // url
#property description "q-period Momentum (William Blau)"        // description
#include <WilliamBlau.mqh>              // include file (terminal_data_folder\MQL5\Include)
//--- indicator settings
#property indicator_separate_window     // indicator in a separate window
#property indicator_buffers 5           // number of buffers used
#property indicator_plots   1           // number of plots
//--- main graphic plot #0
#property indicator_label1  "Mtm"       // graphic plot label #0
#property indicator_type1   DRAW_LINE   // draw as a line
#property indicator_color1  Blue        // color
#property indicator_style1  STYLE_SOLID // line style - solid line
#property indicator_width1  1           // line width
//--- input parameters
input int    q=2;  // q - period of Momentum
input int    r=20; // r - 1st EMA, applied to momentum
input int    s=5;  // s - 2nd EMA, applied to the 1st EMA
input int    u=3;  // u - 3rd EMA, applied to the 2nd EMA
input ENUM_APPLIED_PRICE AppliedPrice=PRICE_CLOSE; // AppliedPrice - price type
//--- dynamic arrays
double MainBuffer[];     // u-period 3rd EMA (for graphic plot #0)
double PriceBuffer[];    // price array
double MtmBuffer[];      // q-period Momentum
double EMA_MtmBuffer[];  // r-period 1st EMA
double DEMA_MtmBuffer[]; // s-period 2nd EMA
//--- global variables
int    begin1, begin2, begin3, begin4; // data starting indexes
int    rates_total_min; // total rates min
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers
   // plot buffers
   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);             // u-period 3rd EMA
   // buffers for intermediate calculations
   SetIndexBuffer(1,PriceBuffer,INDICATOR_CALCULATIONS);    // price buffer
   SetIndexBuffer(2,MtmBuffer,INDICATOR_CALCULATIONS);      // q-period Momentum
   SetIndexBuffer(3,EMA_MtmBuffer,INDICATOR_CALCULATIONS);  // r-period 1st EMA
   SetIndexBuffer(4,DEMA_MtmBuffer,INDICATOR_CALCULATIONS); // s-period 2nd EMA
/*
//--- graphic plot #0 (Main)
   PlotIndexSetString(0,PLOT_LABEL,"Mtm");             // label
   PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_LINE);    // drawing type as a line
   PlotIndexSetInteger(0,PLOT_LINE_COLOR,Blue);        // line color
   PlotIndexSetInteger(0,PLOT_LINE_STYLE,STYLE_SOLID); // line style
   PlotIndexSetInteger(0,PLOT_LINE_WIDTH,1);           // line width
*/
//--- precision
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//---
   begin1=q-1;        //                             - MtmBuffer[]
   begin2=begin1+r-1; // or =(q-1)+(r-1)             - EMA_MtmBuffer[]
   begin3=begin2+s-1; // or =(q-1)+(r-1)+(s-1)       - DEMA_MtmBuffer[]
   begin4=begin3+u-1; // or =(q-1)+(r-1)+(s-1)+(u-1) - MainBuffer[]
   //
   rates_total_min=begin4+1; // minimal size
//--- starting index for plot #0
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,begin4);
//--- short indicator name
   string shortname=PriceName(AppliedPrice)+","+string(q)+","+string(r)+","+string(s)+","+string(u);
   IndicatorSetString(INDICATOR_SHORTNAME,"Blau_Mtm("+shortname+")");
//--- OnInit done
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(
                const int rates_total,     // rates total
                const int prev_calculated, // bars, calculated at previous call
                const datetime &Time[],    // Time
                const double &Open[],      // Open
                const double &High[],      // High
                const double &Low[],       // Low
                const double &Close[],     // Close
                const long &TickVolume[],  // Tick Volume
                const long &Volume[],      // Real Volume
                const int &Spread[]        // Spread
               )
  {
   int i,pos;
//--- check rates
   if(rates_total<rates_total_min) return(0);
//--- calc PriceBuffer[]
   CalculatePriceBuffer(
                        AppliedPrice,        // applied price
                        rates_total,         // rates total
                        prev_calculated,     // bars, calculated at previous call
                        Open,High,Low,Close, // Open[], High[], Low[], Close[] arrays
                        PriceBuffer          // price buffer
                       );
//--- calculation of q-period Momentum
   if(prev_calculated==0)      // at first call
     {
      pos=begin1;              // calc all values starting from begin1
      for(i=0;i<pos;i++)       // pos values
         MtmBuffer[i]=0.0;     // zero values
     }
   else pos=prev_calculated-1; // overwise recalc only last value
   // calculate MtmBuffer[]
   for(i=pos;i<rates_total;i++)
      MtmBuffer[i]=PriceBuffer[i]-PriceBuffer[i-(q-1)];
//--- EMA smoothing
   // r-period 1st EMA
   ExponentialMAOnBufferWB(
                           rates_total,     // rates total
                           prev_calculated, // bars, calculated at previous call
                           begin1,          // starting index
                           r,               // smoothing period
                           MtmBuffer,       // input array
                           EMA_MtmBuffer    // output array
                          );
   // s-period 2nd EMA
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin2,s,EMA_MtmBuffer,DEMA_MtmBuffer);
   // u-period 3rd EMA (for plot #0)
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin3,u,DEMA_MtmBuffer,MainBuffer);
//--- OnCalculate done. Return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Vamos considerar o código em detalhes.


1.4.1.1. Configurações do indicador Mtm (preço,q,r,s,u)

Literatura

O que ler sobre as configurações do indicador na Referência MQL5:

  1. Seção "Indicadores de personalização".
  2. A relação entre as propriedades do indicador e as funções correspondentes (Veja "Indicadores de personalização").
  3. Propriedades dos progrmas (# property) (Veja "Processador/Básico sobre linguagem").
  4. Estilos de renderização (propriedades de traçado gráfico) (Veja a seção "Constantes padrão, enumerações e estruturas / constantes do indicador").
  5. Propriedades dos indicadores de personalização (Veja a seção "Constantes padrão, enumerações e estruturas / constantes do indicador").
Copyright. Descrição do indicador
#property copyright "Copyright 2011, MetaQuotes Software Corp." // copyright
#property link      "https://www.mql5.com"                       // url
#property description "q-period Momentum (William Blau)"        // description

As configurações apenas por meio da diretiva de preprocessador #property. O direito de cópia (parâmetros copyright e link), versão (o parâmetro version) e uma descrição do programa mql5 (parâmetro description) são exibidos em "Propriedades" da janela do indicador (a aba "Propriedades", caixa "Adicional").

Incluir arquivo
#include <WilliamBlau.mqh>              // include file (terminal_data_folder\MQL5\Include)

Preprocessor substitui a linha #Include com o conteúdo do arquivo "WilliamBlau.mqh". Colchetes indicam que o arquivo "WilliamBlau.mqh" será retirado da pasta de dados do terminal. Para mais informações, veja Incluindo arquivos.

Sobre o conteúdo do arquivo "WilliamBlau.mqh", veja a introdução.

Configurações de indicador (em geral)

O indicador personalizado - são algumas plotagens gráficas. A plotagem gráfica do indicador pode ser exibida na janela principal do gráfico de preço ou em uma janela separada. Cada plotagem gráfica possui um determinado método de desenho, cor, estilo e espessura.

Os dados para a renderização da plotagem gráfica são retirados dos buffers de indicador (cada plotagem gráfica corresponde a de um a cinco buffers de indicador). Usamos um array de indicador como um buffer de indicador.

Para configurar o indicador, é necessário (veja Fig. 1.6):

  1. Especificar a janela para exibição dos indicadores.
  2. Especificar o número de plotagens gráficas.
  3. Especificar o número de buffers de indicador.
  4. Declaração dos arrays de indicador.
  5. Configure um link: array de indicador -> buffer de indicador -> plotagem gráfica.
  6. Descreva as propriedades de cada plotagem gráfica.
  7. Especifique a precisão de exibição dos valores de indicador.
  8. Especifique, para cada construção gráfica, o número de barras iniciais sem a renderização da plotagem gráfica.
  9. Configure os níveis horizontais e descreva as propriedades de cada nível horizontal (não presente).
  10. Defina as restrições de escala para a janela de indicador separada (não presente).
  11. Especifique um nome curto para o indicador.

Fig. 1,6. Indicador de momento Mtm (price, q, r, s, u)

Fig. 1,6. Indicador de momento Mtm (price, q, r, s, u)


Configurações de indicador são realizadas:

Para mais informações, veja Conexão entre propriedades de indicador e funções correspondentes.

A diferença nos métodos de configuração de indicador é que as configurações por meio da diretiva #property estão disponíveis antes de o indicador ser anexado ao gráfico de preço, enquanto as configurações por meio das funções especiais estão disponíveis após o indicador ter sido anexado ao gráfico de preço. A configuração das definições é realizada a partir da janela "Propriedades" do indicador.

As configurações: uma janela para exibir o indicador (1)
#property indicator_separate_window     // indicator in a separate window

A configuração é obrigatória e só é possível por meio da diretiva de preprocessador #property. Há duas opções para a exibição do indicador:

  1. Na janela principal do gráfico de preço - indicator_chart_window;
  2. Em uma janela separada - indicator_separate_window.
Configurações: O número de buffers (3) e plotagens gráficas (2)
#property indicator_buffers 5           // number of buffers used
#property indicator_plots   1           // number of plots

A configuração é obrigatória e só é possível por meio da diretiva de preprocessador #property. O número de buffers de indicador (parâmetro indicator_buffers) e o número de plotagens gráficas (parâmetro indicator_plots) não é limitado.

Configurações: Arrays de indicador (4)
//--- dynamic arrays
double MainBuffer[];     // u-period 3rd EMA (for graphic plot #0)
double PriceBuffer[];    // price array
double MtmBuffer[];      // q-period Momentum
double EMA_MtmBuffer[];  // r-period 1st EMA
double DEMA_MtmBuffer[]; // s-period 2nd EMA

Os arrays de indicador são declarados em nível global como arrays dinâmicos unidimensionais do tipo double.

Configurações: Configurando o link (5) entre os arrays de indicador, buffers de indicador e plotagens gráficas.
// graphic plot #0
SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);             // u-period 3rd EMA
// buffers for intermediate calculations
SetIndexBuffer(1,PriceBuffer,INDICATOR_CALCULATIONS);    // price buffer
SetIndexBuffer(2,MtmBuffer,INDICATOR_CALCULATIONS);      // q-period Momentum
SetIndexBuffer(3,EMA_MtmBuffer,INDICATOR_CALCULATIONS);  // r-period 1st EMA
SetIndexBuffer(4,DEMA_MtmBuffer,INDICATOR_CALCULATIONS); // s-period 2nd EMA

O código está escrito na função OnInit() do manipulador de evento Init().

O link do buffer de indicador com o array unidimensional correspondente é configurado com a função SetIndexBuffer():

bool SetIndexBuffer(
   int                 index,    // index of the indicator buffer (starts from 0)
   double              buffer[], // dynamic array
   ENUM_INDEXBUFFER_TYPE data_type // type of data, stored in the indicator array
   );

O buffer de indicador é um array dinâmico de tipo double, cujo tamanho é controlado pelo terminal cliente, de modo que ele sempre corresponde ao número de barras nas quais o indicador é calculado. A indexação dos buffers de indicador inicia do 0.

Um buffer de indicador pode armazenar três tipos de dados: INDICATOR_DATA, INDICATOR_COLOR_INDEX, INDICATOR_CALCULATIONS. Cada plotagem gráfica, dependendo do método de sua exibição, pode ser correspondido por um a cinco buffers de indicador: um a quatro valores de buffer de indicador (tipo de dado INDICATOR_DATA), e um buffer de cor (tipo de dado INDICATOR_COLOR_INDEX).

Buffers de indicador com o tipo de dado INDICATOR_CALCULATIONS são projetados para cálculos intermediários. Após a ligação, o array de indicador terá indexação como em arrays convencionais (veja abaixo na Seção 1.4.1.2).

Configurações: Propriedades de plotagens gráficas (6)

Para a configuração de cada conjunto de plotagens gráficas, as seguintes coisas são especificadas:

  1. Rótulo;
  2. Tipo de desenho (veja todos os 18 tipos na enumeração ENUM_DRAW_TYPE);
  3. Cor da linha;
  4. Estilo da linha (veja os estilos possíveis enumerados em ENUM_LINE_STYLE);
  5. Comprimento da linha.

Há duas maneiras possíveis de configurar:

1) por meio da diretiva de pré-processador #property (implementada desta maneira):

//--- graphic plot #0 (Main)
#property indicator_label1  "Mtm"       // label of graphic plot #0
#property indicator_type1   DRAW_LINE   // Drawing type: DRAW_LINE - line
#property indicator_color1  Blue        // Line color - Blue
#property indicator_style1  STYLE_SOLID // Line style: STYLE_SOLID - solid line
#property indicator_width1  1           // Line width

2) Usando um grupo de funções nas configurações das propriedades da plotagem gráfica PlotIndexSetDouble(), PlotIndexSetInteger(), PlotIndexSetString():

//--- graphic plot #0 (Main)
   PlotIndexSetString(0,PLOT_LABEL,"Mtm");            // label
   PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_LINE);    // drawing type as a line
   PlotIndexSetInteger(0,PLOT_LINE_COLOR,Blue);       // line color
   PlotIndexSetInteger(0,PLOT_LINE_STYLE,STYLE_SOLID); // line style
   PlotIndexSetInteger(0,PLOT_LINE_WIDTH,1);          // line width

O código está escrito na função OnInit() do manipulador de evento Init(). Especificação da função PlotIndexSet *():

bool PlotIndexSetDouble|Integer|String(
   int                             plot_index, // index of the graphic plot
   int                             prop_id,    // identifier of the property of the graphic plot
   double|int,char,bool,color|string  prop_value  // new value of the property
   );

Para refinar a exibição do tipo selecionado de plotagem gráfica, usamos os IDs de propriedade da plotagem gráfica, listados na enumeração ENUM_PLOT_PROPERTY.

A indexação das plotagens gráficas inicia do 0. A respeito da preferência em configurar por meio da diretiva #property, veja acima na seção "Preferências de indicador". Algumas propriedades de plotagens gráficas (a cor, estilo, comprimento da linha) estão disponíveis para alteração a partir da janela "Propriedades" (a aba "Cores") do indicador.

Configurações: A precisão da exibição dos valores de indicador (7)
//--- precision
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);

O código está escrito na função OnInit() do manipulador de evento Init(). A especificação da função de configuração de definições de indicador IndicatorSet * ():

bool IndicatorSetDouble|Integer|String(
   int                    prop_id,   // ID of indicator property
   double|int,color|string  prop_value // new value of a property
   );

Identificadores das propriedades do indicador estão listados na enumeração ENUM_CUSTOMIND_PROPERTY.

A precisão da exibição dos valores do indicador é determinada apenas pela função IndicatorSetInteger()o ID das propriedades do indicador INDICATOR_DIGITS, enumeração ENUM_CUSTOMIND_PROPERTY_INTEGER.

Em um exemplo onde os valores dos buffers de indicador, que são destinados a renderizar sob a exibição: próximo ao nome curto do indicador, em uma mensagem popup, quando o ponteiro do mouse é colocado sobre a linha do indicador - serão arredondados para _Digits - número de dígitos após o ponto decimal no preço do instrumento, ao qual o indicador está anexado.

Configurações: Número de barras iniciais sem renderização (8)

Os dados para renderizar o Momento de período q de William Blau é formado em quatro etapas:

Passo 1. Na base dos dados do array de preço PriceBuffer[], o momento (período q) é calculado. Os valores do momento do período q são colocados no array MtmBuffer[]. Uma vez que a indexação do array de preços começa do 0, os dados significantes no array de preços também começam no índice 0, então os dados significantes no array MtmBuffer[] começam com o índice (q-1).

Passo 2. Os dados significativos no array MtmBuffer[] são suavizados (período de suavização r). Os valores do Momento do período q suavizados são colocados no array EMA_MtmBuffer[]. Uma vez que a indexação do array MtmBuffer[] começa do 0, os dados significantes no array MtmBuffer[] começam com o índice (q-1), então os dados significantes no array EMA_MtmBuffer[] começam com o índice (q-1) + (r-1).

Etapas 3 e 4. Considerações similares são dadas para determinar a partir de qual barra começam os dados significativos no array DEMA_MtmBuffer[] (período de suavização s) e no array MainBuffer[] (período de suavização u). Veja Fig. 1.7.

Fig. 1,7. Os dados significativos do indicador Mtm (price, q, r, s, u)

Fig. 1,7. Os dados significativos do indicador Mtm (price, q, r, s, u)


Em um nível global, as variáveis são declaradas:

//--- global variables
int    begin1, begin2, begin3, begin4; // data starting indexes
    

Os valores das variáveis são o índice da barra, de onde começam os dados significativos, no correspondente ao array de indicador da variável. Os valores da variável são calculados no manipulador de eventos OnInit() e Init, e serão usados na função OnCalculate() do manipulador de eventos Calculate.

//---
   begin1=q-1;        //                             - MtmBuffer[]
   begin2=begin1+r-1; // or =(q-1)+(r-1)             - EMA_MtmBuffer[]
   begin3=begin2+s-1; // or =(q-1)+(r-1)+(s-1)       - DEMA_MtmBuffer[]
   begin4=begin3+u-1; // or =(q-1)+(r-1)+(s-1)+(u-1) - MainBuffer[]
   //
   rates_total_min=begin4+1; // minimal size
//--- starting index for plot #0
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,begin4);

O número de barras iniciais sem a exibição na plotagem gráfica é especificado usando a função PlotIndexSetInteger(), o identificador da propriedade de indicador PLOT_DRAW_BEGIN enumerações ENUM_PLOT_PROPERTY_INTEGER.

Configuração: O nome curto do indicador (11)
//--- short indicator name
   string shortname=PriceName(AppliedPrice)+","+string(q)+","+string(r)+","+string(s)+","+string(u);
   IndicatorSetString(INDICATOR_SHORTNAME,"Blau_Mtm("+shortname+")");

O código está escrito na função OnInit() do manipulador de evento Init(). O nome curto do indicador é especificado apenas utilizando a função IndicatorSetString(), identificador das propriedades de indicador INDICATOR_SHORTNAME (enumeração ENUM_CUSTOMIND_PROPERTY_STRING). A função PriceName() retorna o nome do tipo de preço, dependendo do valor do parâmetro de entrada AppliedPrice. O código da função PriceName() está localizado no arquivo "WilliamBlau.mqh" (veja Introdução).

Parâmetros de entrada
//--- input parameters
input int    q=2;  // q - period of Momentum
input int    r=20; // r - 1st EMA, applied to momentum
input int    s=5;  // s - 2nd EMA, applied to the 1st EMA
input int    u=3;  // u - 3rd EMA, applied to the 2nd EMA
input ENUM_APPLIED_PRICE AppliedPrice=PRICE_CLOSE; // AppliedPrice - price type

Para mais informações, veja variáveis de entrada. Os parâmetros de entrada estão disponíveis para alteração a partir da janela "Propriedades" (a aba "Entradas") do indicador.


1.4.1.2. O cálculo do indicador Mtm (price, q, r, s, u)

Cálculo: O algoritmo

O algoritmo para cálculo do indicador Mtm (price, q, r, s, u):

  1. Verifique se há dados suficientes para calcular o indicador.
  2. O cálculo do array de preços, de acordo com o tipo de preço especificado - formação do array PriceBuffer[]
  3. A determinação da barra de índice, a partir da qual iniciar/continuar o cálculo do momento do período q.
  4. O cálculo do momento do período q - o preenchimento do array MtmBuffer[].
  5. A primeira suavização pelo método EMA (período r) - o preenchimento do array EMA_MtmBuffer[].
  6. A segunda suavização pelo método EMA (período s) - o preenchimento do array DEMA_MtmBuffer[].
  7. A terceira suavização pelo método EMA (período u) - o preenchimento do array MainBuffer[] - o cálculo dos valores para a renderização da plotagem gráfica #0.
Cálculo: A função OnCalculate()

O cálculo dos valores de indicador é realizada na função OnCalculate() do manipulador de evento Calculate. Usamos a segunda forma de chamada de função OnCalculate().

int OnCalculate(
                const int rates_total,     // rates total
                const int prev_calculated, // bars, calculated at the previous call
                const datetime &Time[],    // Time
                const double &Open[],      // Open
                const double &High[],      // High
                const double &Low[],       // Low
                const double &Close[],     // Close
                const long &TickVolume[],  // Tick Volume
                const long &Volume[],      // Real Volume
                const int &Spread[]        // Spread
               )
  {
//---
//--- OnCalculate done. Return value of prev_calculated for next call
   return(rates_total);
  }

O argumento rates_total é o número de barras do gráfico de preço, que são renderizadas e estão disponíveis para o indicador para processamento. O prev_calculated é o número de barras do gráfico de preço que foram processadas pelo indicador no momento do início da chamada de função OnCalculate().

A função OnCalculate() retorna o número de barras do gráfico de preço que foram processadas pelo indicador no momento do final da chama atual. Esta função retorna o parâmetro rates_total e deve ser construída de tal maneira que, na primeira chamada, todas as barras do gráfico de preço seriam processadas.

Ou seja, se na primeira chamada da função OnCalculate(), o parâmetro prev_calculated for igual a 0, então na segunda chamada, o parâmetro prev_calculated é igual a rates_total ou rates_total + 1, e iniciando a partir da segunda chamada, a função OnCalculate() manipula (conta) apenas a última barra. Para mais esclarecimentos com exemplos, veja aqui.

Os buffers de indicador e os arrays Time[], Open[], High[], Low[], Close[], TickVolume[], Volume[], e Spread[] possuem uma direção de indexação da esquerda para a direita, do início para o fim do array, do dado mais antigo para o mais novo. O índice do primeiro elemento é igual a 0. O tamanho do buffer do indicador é controlado pelo terminal cliente, de modo que ele sempre corresponde ao número de barras sobre as quais o indicador é calculado.

Cálculo: Verifique se há dados suficientes para calcular o indicador (1)
//--- check rates
   if(rates_total<rates_total_min) return(0);

A variável global rates_total_min é o tamanho mínimo da série de tempo de entrada do indicador, calculado na função OnInit() do manipulador de eventos Init.

   rates_total_min=begin4+1; // minimum size of the input timeseries of the indicator
Cálculo: Os arrays de preço PriceBuffer[] (2)
//--- calculation of the prices array PriceBuffer[]
   CalculatePriceBuffer(
                        AppliedPrice,        // price type
                        rates_total,         // size of the input timeseries
                        prev_calculated,     // bars, processed on the previous call
                        Open,High,Low,Close, // Open[], High[], Low[], Close[]
                        PriceBuffer          // calculate the prices array
                       );

Para preencher o array de preços PriceBuffer[], é usada a função CalculatePriceBuffer(). O código da função CalculatePriceBuffer() está localizado no arquivo "WilliamBlau.mqh" (veja Introdução). O Tipo de preço é especificado no parâmetro de entrada AppliedPrice.

Cálculo: A definição da barra de índice, a partir da qual iniciar/continuar o cálculo do momento do período q (3)

A variável local pos é o índice da barra, a partir da qual o indicador será calculado na chamada atual da função OnCalculate(). Vamos combinar o cálculo da variável pos com o estágio de preparação do array MtmBuffer[] ao cálculo (o estágio de zerar os elementos insignificantes do array MtmBuffer[]).

Cálculo: momento do período q (4)
//--- calculation of q-period Momentum
   if(prev_calculated==0)      // at first call
     {
      pos=begin1;              // calc all values starting from begin1
      for(i=0;i<pos;i++)       // pos values
         MtmBuffer[i]=0.0;     // zero values
     }
   else pos=prev_calculated-1; // overwise recalc only last value
   // calculate MtmBuffer[]
   for(i=pos;i<rates_total;i++)
      MtmBuffer[i]=PriceBuffer[i]-PriceBuffer[i-(q-1)];

O momento do período q é calculado como a diferença entre o período atual PriceBuffer[i], e o preço (q-1) dos períodos anteriores PriceBuffer[i-(q-1)].

Cálculo: suavização pelo método EMA (5-7)

//--- EMA smoothing
   // r-period 1st EMA
   ExponentialMAOnBufferWB(
                           rates_total,     // rates total
                           prev_calculated, // bars, calculated at previous call
                           begin1,          // starting index
                           r,               // smoothing period
                           MtmBuffer,       // input array
                           EMA_MtmBuffer    // output array
                          );
   // s-period 2nd EMA
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin2,s,EMA_MtmBuffer,DEMA_MtmBuffer);
   // u-period 3rd EMA (for plot #0)
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin3,u,DEMA_MtmBuffer,MainBuffer);

A função ExponentialMAOnBuffer() está descrita na introdução. No exemplo do cálculo do primeiro EMA de movimentação do período r, a função ExponentialMAOnBuffer() preenche o array de saída EMA_MtmBuffer[] com os valores de EMA(r) do array de entrada MtmBuffer[]; com dados insignificantes até o índice (begin1-1), inclusive, são preenchidos com valores zero.

1.4.2. "Blau_TSI.mq5" - indicador TSI(price,q,r,s,u) - o índice de força real

O código do indicador TSI (price, q, r, s, u) (é construído nas bases das alterações e adições ao código "Blau_Mtm.mq5"):

//+------------------------------------------------------------------+
//|                                                     Blau_TSI.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp." // copyright
#property link      "https://www.mql5.com"                       // URL
#property description "True Strength Index (William Blau)"      // description
#include <WilliamBlau.mqh>               // include file (terminal_data_folder\MQL5\Include)
//--- indicator settings
#property indicator_separate_window      // indicator in a separate window
#property indicator_buffers 10           // number of buffers used
#property indicator_plots   1            // graphic plots
//--- horizontal levels
#property indicator_level1 -25           // level #0 (vertical)
#property indicator_level2 25            // level #1 (vertical)
#property indicator_levelcolor Silver    // level color
#property indicator_levelstyle STYLE_DOT // level style
#property indicator_levelwidth 1         // level width
//--- indicator min/max
#property indicator_minimum -100         // minimum
#property indicator_maximum 100          // maximum
//--- graphic plot #0 (Main)
#property indicator_label1  "TSI"        // label for graphic plot #0
#property indicator_type1   DRAW_LINE    // draw as a line
#property indicator_color1  Blue         // line color
#property indicator_style1  STYLE_SOLID  // line style
#property indicator_width1  1            // line width
//--- input parameters
input int    q=2;  // q - period of Momentum
input int    r=20; // r - 1st EMA, applied to Momentum
input int    s=5;  // s - 2nd EMA, applied to the 1st smoothing
input int    u=3;  // u - 3rd EMA, applied to the 2nd smoothing
input ENUM_APPLIED_PRICE AppliedPrice=PRICE_CLOSE; // AppliedPrice - price type
//--- dynamic arrays
double MainBuffer[];        // TSI (graphic plot #0)
double PriceBuffer[];       // price array
double MtmBuffer[];         // q-period Momentum
double EMA_MtmBuffer[];     // r-period 1st EMA
double DEMA_MtmBuffer[];    // s-period 2nd EMA
double TEMA_MtmBuffer[];    // u-period 3rd EMA
double AbsMtmBuffer[];      // q-period Momentum (absolute value)
double EMA_AbsMtmBuffer[];  // r-period 1st EMA (absolute value)
double DEMA_AbsMtmBuffer[]; // s-period 2nd EMA (absolute value)
double TEMA_AbsMtmBuffer[]; // u-period 3rd EMA (absolute value)
//--- global variables
int    begin1, begin2, begin3, begin4; // starting index
int    rates_total_min; // rates total min
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers
   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);                // TSI
   // intermediate buffers; (not used for plot)
   SetIndexBuffer(1,PriceBuffer,INDICATOR_CALCULATIONS);       // price array
   SetIndexBuffer(2,MtmBuffer,INDICATOR_CALCULATIONS);         // q-period Momentum
   SetIndexBuffer(3,EMA_MtmBuffer,INDICATOR_CALCULATIONS);     // r-period 1st EMA
   SetIndexBuffer(4,DEMA_MtmBuffer,INDICATOR_CALCULATIONS);    // s-period 2nd EMA
   SetIndexBuffer(5,TEMA_MtmBuffer,INDICATOR_CALCULATIONS);    // u-period 3rd EMA
   SetIndexBuffer(6,AbsMtmBuffer,INDICATOR_CALCULATIONS);      // q-period моментум (absolute value)
   SetIndexBuffer(7,EMA_AbsMtmBuffer,INDICATOR_CALCULATIONS);  // r-period 1st EMA (absolute value)
   SetIndexBuffer(8,DEMA_AbsMtmBuffer,INDICATOR_CALCULATIONS); // s-period 2nd EMA (absolute value)
   SetIndexBuffer(9,TEMA_AbsMtmBuffer,INDICATOR_CALCULATIONS); // u-period 3rd EMA (absolute value)
/*
//--- graphic plot #0 (Main)
   PlotIndexSetString(0,PLOT_LABEL,"TSI");             // label of graphic plot #0
   PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_LINE);    // draw as a line
   PlotIndexSetInteger(0,PLOT_LINE_COLOR,Blue);        // line color
   PlotIndexSetInteger(0,PLOT_LINE_STYLE,STYLE_SOLID); // line style
   PlotIndexSetInteger(0,PLOT_LINE_WIDTH,1);           // line width
*/
//--- precision
   IndicatorSetInteger(INDICATOR_DIGITS,2);
/*
//--- horizontal levels
   IndicatorSetInteger(INDICATOR_LEVELS,2);                // number of levels
   IndicatorSetDouble(INDICATOR_LEVELVALUE,0,-25);         // level #0
   IndicatorSetDouble(INDICATOR_LEVELVALUE,1,25);          // level #1
   IndicatorSetInteger(INDICATOR_LEVELCOLOR,Silver);       // level color
   IndicatorSetInteger(INDICATOR_LEVELSTYLE,STYLE_DOT);    // level style
   IndicatorSetInteger(INDICATOR_LEVELWIDTH,1);            // level width
   IndicatorSetString(INDICATOR_LEVELTEXT,0,"Oversold");   // level 0 description "Oversold"
   IndicatorSetString(INDICATOR_LEVELTEXT,1,"Overbought"); // level 1 description "Overbought"
//--- indicator scale
   IndicatorSetDouble(INDICATOR_MINIMUM,-100); // minimum
   IndicatorSetDouble(INDICATOR_MAXIMUM,100);  // maximum
*/
//---
   begin1=q-1;        //                             - MtmBuffer[], AbsMtmBuffer[]
   begin2=begin1+r-1; // or =(q-1)+(r-1)             - EMA_...[]
   begin3=begin2+s-1; // or =(q-1)+(r-1)+(s-1)       - DEMA_...[]
   begin4=begin3+u-1; // or =(q-1)+(r-1)+(s-1)+(u-1) - TEMA_...[], MainBuffer[]
   //
   rates_total_min=begin4+1; // rates total min
//--- starting index for plot #0
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,begin4);
//--- short indicator name
   string shortname=PriceName(AppliedPrice)+","+string(q)+","+string(r)+","+string(s)+","+string(u);
   IndicatorSetString(INDICATOR_SHORTNAME,"Blau_TSI("+shortname+")");
//--- OnInit done
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(
                const int rates_total,     // rates total
                const int prev_calculated, // bars, calculated at previous call
                const datetime &Time[],    // Time
                const double &Open[],      // Open
                const double &High[],      // High
                const double &Low[],       // Low
                const double &Close[],     // Close
                const long &TickVolume[],  // Tick Volume
                const long &Volume[],      // Real Volume
                const int &Spread[]        // Spread
               )
  {
   int i,pos;
   double value1,value2;
//--- check rates
   if(rates_total<rates_total_min) return(0);
//--- calc PriceBuffer[]
   CalculatePriceBuffer(
                        AppliedPrice,        // price type
                        rates_total,         // rates total
                        prev_calculated,     // bars, calculated at previous tick
                        Open,High,Low,Close, // Open[], High[], Low[], Close[]
                        PriceBuffer          // price buffer
                       );
//--- calculation of  mtm and |mtm|
   if(prev_calculated==0)      // at first call
     {
      pos=begin1;              // calc all values starting from begin1
      for(i=0;i<pos;i++)       // pos
        {
         MtmBuffer[i]=0.0;     // zero values
         AbsMtmBuffer[i]=0.0;  //
        }
     }
   else pos=prev_calculated-1; // overwise calc only last bar
   // calculate MtmBuffer[] and AbsMtmBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      MtmBuffer[i]=PriceBuffer[i]-PriceBuffer[i-(q-1)];
      AbsMtmBuffer[i]=MathAbs(MtmBuffer[i]);
     }
//--- EMA smoothing
   // r-period 1st EMA
   ExponentialMAOnBufferWB(
                           rates_total,     // rates total
                           prev_calculated, // bars, calculated at previous call
                           begin1,          // starting index
                           r,               // smoothing period
                           MtmBuffer,       // input array
                           EMA_MtmBuffer    // output array
                          );
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin1,r,AbsMtmBuffer,EMA_AbsMtmBuffer);
   // s-period 2nd EMA
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin2,s,EMA_MtmBuffer,DEMA_MtmBuffer);
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin2,s,EMA_AbsMtmBuffer,DEMA_AbsMtmBuffer);
   // u-period 3rd EMA
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin3,u,DEMA_MtmBuffer,TEMA_MtmBuffer);
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin3,u,DEMA_AbsMtmBuffer,TEMA_AbsMtmBuffer);
//--- TSI calculation (graphic plot #0)
   if(prev_calculated==0)      // at first call
     {
      pos=begin4;              // calc all values starting from begin4
      for(i=0;i<pos;i++)       // 
         MainBuffer[i]=0.0;    // zero values
     }
   else pos=prev_calculated-1; // overwise calc only last bar
   // calculation of MainBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      value1=100*TEMA_MtmBuffer[i];
      value2=TEMA_AbsMtmBuffer[i];
      MainBuffer[i]=(value2>0)?value1/value2:0;
     }
//--- OnCalculate done. Return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Vamos considerar em detalhes apenas as modificações e adições ao código "Blau_Mtm.mq5".

1.4.2.1. As configurações do indicador TSI (price, q, r, s, u) (alterações e adições ao código "Blau_Mtm.mq5")

Configurações de indicador (em geral)

As configurações do indicador TSI(price,q,r,s,u) diferem das configurações do indicador Mtm(price,q,r,s,u) (veja Fig. 1.8):

  1. Especificar a janela para exibir os indicadores (sem alteração)
  2. Especificar o número de estruturas gráficas (sem alteração)
  3. Especificar o número de buffers de indicador (o número de buffers aumentou)
  4. Declaração dos arrays de indicador (adicionado aos arrays)
  5. Atribuir os arrays/buffer/plotagens: o array de indicador -> buffer de indicador -> plotagem gráfica (reestruturando)
  6. Descrever as propriedades de cada plotagem gráfica (rótulo foi alterado)
  7. Especificar a precisão de exibição dos valores do indicador (precisão alterada)
  8. Especifica, para cada plotagem gráfica, o número de barras inicial sem exibir na plotagem gráfica (sem alteração)
  9. Configurar os níveis horizontais e descrever as propriedades de cada nível horizontal (novo).
  10. Especificar os limites para a escala da janela de indicador separada (novo).
  11. Especificar o nome curto do indicador (nome alterado).

Fig. 1,8. Indicador de índice de força real TSI (price, q, r, s, u)

Fig. 1,8. Indicador de índice de força real TSI (price, q, r, s, u)


Configurações (alterações)

No código "Blau_Mtm.mq5", as seguintes pequenas modificações foram feitas.

1. A descrição curta do programa mql5 foi alterada:

#property description "True Strength Index (William Blau)"      // description

2. (na configuração 6) O número de plotagens gráficas não aumentou, o método de desenho (DRAW_LINE - linha), a cor da linha (Azul), o estilo da linha (STYLE_SOLID - linha sólida), a o comprimento da linha (1) permanecem inalterados, mas o rótulo para a plotagem gráfica #0 foi alterado:

#property indicator_label1  "TSI"        // label for graphic plot #0

3. (na configuração 7) A precisão da exibição dos valores do indicador foi alterada:

   IndicatorSetInteger(INDICATOR_DIGITS,2);

4. (na configuração 11) O nome curto do indicador foi alterado:

   IndicatorSetString(INDICATOR_SHORTNAME,"Blau_TSI("+shortname+")");
Configurações: níveis horizontais (9)

Para configurar os níveis horizontais, as seguintes configurações devem ser especificadas para cada nível:

  1. O valor no eixo vertical;
  2. A descrição do nível (opcional). Camadas horizontais possuem um único estilo de renderização:
    1. Cor para exibição da linha;
    2. Estilo da linha (veja os estilos possíveis enumerados em ENUM_LINE_STYLE);
    3. A espessura da linha.

Há duas maneiras possíveis de configurar:

1) Usando a diretiva de pré-processador #property (implementada desta maneira):

//--- horizontal levels
#property indicator_level1 -25           // level #0 (vertical)
#property indicator_level2 25            // level #1 (vertical)
#property indicator_levelcolor Silver    // level color
#property indicator_levelstyle STYLE_DOT // level style
#property indicator_levelwidth 1         // level width

2) Usando o grupo de funções IndicatorSet *():

//--- horizontal levels
   IndicatorSetInteger(INDICATOR_LEVELS,2);                // number of levels
   IndicatorSetDouble(INDICATOR_LEVELVALUE,0,-25);         // level #0
   IndicatorSetDouble(INDICATOR_LEVELVALUE,1,25);          // level #1
   IndicatorSetInteger(INDICATOR_LEVELCOLOR,Silver);       // level color
   IndicatorSetInteger(INDICATOR_LEVELSTYLE,STYLE_DOT);    // level style
   IndicatorSetInteger(INDICATOR_LEVELWIDTH,1);            // level width
   IndicatorSetString(INDICATOR_LEVELTEXT,0,"Oversold");   // level 0 description "Oversold"
   IndicatorSetString(INDICATOR_LEVELTEXT,1,"Overbought"); // level 1 description "Overbought"

O código está escrito na função OnInit() do manipulador de evento Init(). A indexação dos níveis horizontais começa do 0. Para refinar a exibição do nível horizontal, os identificadores das propriedades do índice INDICATOR_LEVEL * são usados, e estão listados na enumeração ENUM_CUSTOMIND_PROPERTY.

A descrição de cada nível é definida apenas usando a função IndicatorSetString(), identificador da propriedade de indicador INDICATOR_LEVELTEXT (enumeração ENUM_CUSTOMIND_PROPERTY_STRING). A descrição do nível é colocada diretamente acima do nível, à esquerda.

Você pode adicionar ou remover níveis horizontais, alterar os valores, a descrição de cada nível, e o estilo da renderização do nível a partir da janela "Propriedades" (a aba "Níveis") do indicador.

Configurações: Limites da escala da janela separada de indicador (10)

Há duas maneiras possíveis de configurar:

1) Usando a diretiva de pré-processador #property (implementada desta maneira):

//--- indicator min/max
#property indicator_minimum -100         // minimum
#property indicator_maximum 100          // maximum

2) Usando a função IndicatorSetDouble(), os identificadores das propriedades dos indicadores INDICATOR_MINIMUM e INDICATOR_MAXIMUM (enumeração ENUM_CUSTOMIND_PROPERTY_DOUBLE).

//--- indicator scale
   IndicatorSetDouble(INDICATOR_MINIMUM,-100); // minimum
   IndicatorSetDouble(INDICATOR_MAXIMUM,100);  // maximum

O código está escrito na função OnInit() do manipulador de evento Init(). Os limites inferior e superior da escala de uma janela de indicador separada estão disponíveis para alteração a partir da janela "Propriedades" (a aba "Escala") do indicador.

Configurações (alterações): Os buffers de indicador (3-5)

As alterações na configuração "Array de indicador -> buffer de indicador -> plotagem gráfica":

1. (na configuração 3) O número de buffers aumentou:

#property indicator_buffers 10           // the number of buffers for the calculation of the indicator

2. (na configuração 4) Adicionados arrays de indicador que forem necessários para calcular o valor absoluto do momento do período q:

double AbsMtmBuffer[];      // q-period Momentum (absolute value)
double EMA_AbsMtmBuffer[];  // r-period 1st EMA (absolute value)
double DEMA_AbsMtmBuffer[]; // s-period 2nd EMA (absolute value)
double TEMA_AbsMtmBuffer[]; // u-period 3rd EMA (absolute value)

o propósito do array MainBuffer[] foi alterado:

double MainBuffer[];        // TSI (graphic plot #0)
double TEMA_MtmBuffer[];    // u-period 3rd EMA

3. (na configuração 5) A conexão de "array de indicador -> buffer de indicador -> plotagem gráfica" foi alterada:

   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);                // TSI
   // intermediate buffers; (not used for plot)
   SetIndexBuffer(1,PriceBuffer,INDICATOR_CALCULATIONS);       // price array
   SetIndexBuffer(2,MtmBuffer,INDICATOR_CALCULATIONS);         // q-period Momentum
   SetIndexBuffer(3,EMA_MtmBuffer,INDICATOR_CALCULATIONS);     // r-period 1st EMA
   SetIndexBuffer(4,DEMA_MtmBuffer,INDICATOR_CALCULATIONS);    // s-period 2nd EMA
   SetIndexBuffer(5,TEMA_MtmBuffer,INDICATOR_CALCULATIONS);    // u-period 3rd EMA
   SetIndexBuffer(6,AbsMtmBuffer,INDICATOR_CALCULATIONS);      // q-period моментум (absolute value)
   SetIndexBuffer(7,EMA_AbsMtmBuffer,INDICATOR_CALCULATIONS);  // r-period 1st EMA (absolute value)
   SetIndexBuffer(8,DEMA_AbsMtmBuffer,INDICATOR_CALCULATIONS); // s-period 2nd EMA (absolute value)
   SetIndexBuffer(9,TEMA_AbsMtmBuffer,INDICATOR_CALCULATIONS); // u-period 3rd EMA (absolute value)


1.4.2.2. O cálculo do indicador TSI (price, q, r, s, u) (alterações e adições ao código "Blau_Mtm.mq5")

Cálculo: O algoritmo

O algoritmo para cálculo do indicador TSI (price, q, r, s, u):

  1. Verifique se há dados suficientes para calcular o indicador.
  2. O cálculo do array de preços, de acordo com o tipo de preço especificado - formação do array PriceBuffer[].
  3. A determinação da barra de índice, a partir da qual iniciar/continuar o cálculo do momento do período q.
  4. O cálculo do momento do período q, e seu valor absoluto - o preenchimento dos arrays MtmBuffer[] e AbsMtmBuffer[].
  5. A primeira suavização pelo método EMA (período r) - o preenchimento dos arrays EMA_MtmBuffer[] e EMA_AbsMtmBuffer[].
  6. A segunda suavização pelo método EMA (período s) - o preenchimento dos arrays DEMA_MtmBuffer[] e DEMA_AbsMtmBuffer[].
  7. A terceira suavização pelo método EMA (período u) - o preenchimento dos arrays TEMA_MtmBuffer[] e TEMA_AbsMtmBuffer[].
  8. A determinação da barra de índice, a partir da qual iniciar/continuar o cálculo do índice de força real.
  9. O cálculo do índice de força real - o preenchimento do array MainBuffer[] - o cálculo dos valores para a plotagem gráfica #0.

A essência das alterações no algoritmo (brevemente):

  • a) (ver parágrafos 4-7) paralelamente ao cálculo do momento do período q (grupo de arrays * MtmtBuffer[]), o cálculo do valor absoluto do momento do período q (grupo de arrays *AbsMtmBuffer[]) é realizado;
  • b) (ver Seções 8-9) o cálculo do TSI é adicionado.
Cálculo: o momento do período q e seu valor absoluto (3-7)
//--- calculation of  mtm and |mtm|
   if(prev_calculated==0)      // at first call
     {
      pos=begin1;              // calc all values starting from begin1
      for(i=0;i<pos;i++)       // pos
        {
         MtmBuffer[i]=0.0;     // zero values
         AbsMtmBuffer[i]=0.0;  //
        }
     }
   else pos=prev_calculated-1; // overwise calc only last bar
   // calculate MtmBuffer[] and AbsMtmBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      MtmBuffer[i]=PriceBuffer[i]-PriceBuffer[i-(q-1)];
      AbsMtmBuffer[i]=MathAbs(MtmBuffer[i]);
     }
//--- EMA smoothing
   // r-period 1st EMA
   ExponentialMAOnBufferWB(
                           rates_total,     // rates total
                           prev_calculated, // bars, calculated at previous call
                           begin1,          // starting index
                           r,               // smoothing period
                           MtmBuffer,       // input array
                           EMA_MtmBuffer    // output array
                          );
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin1,r,AbsMtmBuffer,EMA_AbsMtmBuffer);
   // s-period 2nd EMA
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin2,s,EMA_MtmBuffer,DEMA_MtmBuffer);
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin2,s,EMA_AbsMtmBuffer,DEMA_AbsMtmBuffer);
   // u-period 3rd EMA
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin3,u,DEMA_MtmBuffer,TEMA_MtmBuffer);
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin3,u,DEMA_AbsMtmBuffer,TEMA_AbsMtmBuffer);
    

Cálculo: O índice de força real(8-9)

//--- TSI calculation (graphic plot #0)
   if(prev_calculated==0)      // at first call
     {
      pos=begin4;              // calc all values starting from begin4
      for(i=0;i<pos;i++)       // 
         MainBuffer[i]=0.0;    // zero values
     }
   else pos=prev_calculated-1; // overwise calc only last bar
   // calculation of MainBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      value1=100*TEMA_MtmBuffer[i];
      value2=TEMA_AbsMtmBuffer[i];
      MainBuffer[i]=(value2>0)?value1/value2:0;
     }

1.4.3. "Blau_Ergodic.mq5" - Ergodic(price,q,r,s,u,ul) - Oscilador Ergódico

O código do indicador Ergodic (price, q, r, s, u, ul) é baseado nas alterações do código Blau_TSI.mq5":

//+------------------------------------------------------------------+
//|                                                 Blau_Ergodic.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp." // copyright
#property link      "https://www.mql5.com"                       // URL
#property description "Ergodic Oscillator (William Blau)"       // description
#include <WilliamBlau.mqh>                 // include file (terminal_data_folder\MQL5\Include)
//--- indicator settings
#property indicator_separate_window        // indicator in a separate window
#property indicator_buffers 11             // number of buffers
#property indicator_plots   2              // indicator plots
//--- horizontal levels
#property indicator_level1 -25             // level #0
#property indicator_level2 25              // level #1
#property indicator_levelcolor Silver      // level color
#property indicator_levelstyle STYLE_DOT   // level style
#property indicator_levelwidth 1           // level width
//--- min/max
#property indicator_minimum -100           // minimum
#property indicator_maximum 100            // maximum
//--- graphic plot #0 (Main)
#property indicator_label1  "Ergodic"      // graphic plot #0
#property indicator_type1   DRAW_HISTOGRAM // draw as a histogram
#property indicator_color1  Silver         // histogram color
#property indicator_style1  STYLE_SOLID    // line style
#property indicator_width1  2              // line width
//--- graphic plot #1 (Signal Line)
#property indicator_label2  "Signal"       // graphic plot #1
#property indicator_type2   DRAW_LINE      // draw as a line
#property indicator_color2  Red            // line color
#property indicator_style2  STYLE_SOLID    // line style
#property indicator_width2  1              // line width
//--- input parameters
input int    q=2;  // q - period of Momentum
input int    r=20; // r - 1st EMA, applied to Momentum
input int    s=5;  // s - 2nd EMA, applied to the 1st smoothing
input int    u=3;  // u - 3rd EMA, applied to the 2nd smoothing
input int    ul=3; // ul- period of a Signal Line
input ENUM_APPLIED_PRICE AppliedPrice=PRICE_CLOSE; // AppliedPrice - price type
//--- dynamic arrays
double MainBuffer[];        // Ergodic (graphic plot #0)
double SignalBuffer[];      // Signal line: ul-period EMA of Ergodic (graphic plot #1)
double PriceBuffer[];       // price array
double MtmBuffer[];         // q-period Momentum
double EMA_MtmBuffer[];     // r-period of the 1st EMA
double DEMA_MtmBuffer[];    // s-period of the 2nd EMA
double TEMA_MtmBuffer[];    // u-period of the 3rd EMA
double AbsMtmBuffer[];      // q-period Momentum (absolute value)
double EMA_AbsMtmBuffer[];  // r-period of the 1st EMA (absolute value)
double DEMA_AbsMtmBuffer[]; // s-period of the 2nd EMA (absolute value)
double TEMA_AbsMtmBuffer[]; // u-period of the 3rd EMA (absolute value)
//--- global variables
int    begin1, begin2, begin3, begin4, begin5; // starting indexes
int    rates_total_min; // rates total min
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers
   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);                 // Ergodic
   // graphic plot #1
   SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);               // signal line: ul-period EMA of Ergodic
   // buffers for intermediate calculations
   SetIndexBuffer(2,PriceBuffer,INDICATOR_CALCULATIONS);        // price array
   SetIndexBuffer(3,MtmBuffer,INDICATOR_CALCULATIONS);          // q-period моментум
   SetIndexBuffer(4,EMA_MtmBuffer,INDICATOR_CALCULATIONS);      // r-period of the 1st EMA
   SetIndexBuffer(5,DEMA_MtmBuffer,INDICATOR_CALCULATIONS);     // s-period of the 2nd EMA
   SetIndexBuffer(6,TEMA_MtmBuffer,INDICATOR_CALCULATIONS);     // u-period of the 3rd EMA
   SetIndexBuffer(7,AbsMtmBuffer,INDICATOR_CALCULATIONS);       // q-period Momentum (absolute value)
   SetIndexBuffer(8,EMA_AbsMtmBuffer,INDICATOR_CALCULATIONS);   // r-period of the 1st EMA (absolute value)
   SetIndexBuffer(9,DEMA_AbsMtmBuffer,INDICATOR_CALCULATIONS);  // s-period of the 2nd EMA (absolute value)
   SetIndexBuffer(10,TEMA_AbsMtmBuffer,INDICATOR_CALCULATIONS); // u-period of the 3rd EMA (absolute value)
/*
//--- graphic plot #0 (Main)
   PlotIndexSetString(0,PLOT_LABEL,"Ergodic");           // label of graphic plot #0
   PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_HISTOGRAM); // draw as a histogram
   PlotIndexSetInteger(0,PLOT_LINE_COLOR,Silver);        // line color
   PlotIndexSetInteger(0,PLOT_LINE_STYLE,STYLE_SOLID);   // line style
   PlotIndexSetInteger(0,PLOT_LINE_WIDTH,2);             // line width
//--- graphic plot #1 (Signal Line)
   PlotIndexSetString(1,PLOT_LABEL,"Signal");            // label of graphic plot #1
   PlotIndexSetInteger(1,PLOT_DRAW_TYPE,DRAW_LINE);      // draw as a line
   PlotIndexSetInteger(1,PLOT_LINE_COLOR,Red);           // line color
   PlotIndexSetInteger(1,PLOT_LINE_STYLE,STYLE_SOLID);   // line style
   PlotIndexSetInteger(1,PLOT_LINE_WIDTH,1);             // line width
*/
//--- precision
   IndicatorSetInteger(INDICATOR_DIGITS,2);
/*
//--- horizontal levels
   IndicatorSetInteger(INDICATOR_LEVELS,2);                // number of indicator levels
   IndicatorSetDouble(INDICATOR_LEVELVALUE,0,-25);         // level #0
   IndicatorSetDouble(INDICATOR_LEVELVALUE,1,25);          // level #1
   IndicatorSetInteger(INDICATOR_LEVELCOLOR,Silver);       // level color
   IndicatorSetInteger(INDICATOR_LEVELSTYLE,STYLE_DOT);    // level style
   IndicatorSetInteger(INDICATOR_LEVELWIDTH,1);            // level width
   IndicatorSetString(INDICATOR_LEVELTEXT,0,"Oversold");   // level #0 "Oversold"
   IndicatorSetString(INDICATOR_LEVELTEXT,1,"Overbought"); // level #1 "Overbought"
//--- min/max values
   IndicatorSetDouble(INDICATOR_MINIMUM,-100); // min
   IndicatorSetDouble(INDICATOR_MAXIMUM,100);  // max
*/
//---
   begin1=q-1;         //                                    - MtmBuffer[], AbsMtmBuffer[]
   begin2=begin1+r-1;  // or =(q-1)+(r-1)                    - EMA_...[]
   begin3=begin2+s-1;  // or =(q-1)+(r-1)+(s-1)              - DEMA_...[]
   begin4=begin3+u-1;  // or =(q-1)+(r-1)+(s-1)+(u-1)        - TEMA_...[], MainBuffer[]
   begin5=begin4+ul-1; // or =(q-1)+(r-1)+(s-1)+(u-1)+(ul-1) - SignalBuffer[]
   //
   rates_total_min=begin5+1; // rates total min
//--- starting bar index for plot #0
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,begin4);
//--- starting bar index for plot #1
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,begin5);
//--- short indicator name
   string shortname=PriceName(AppliedPrice)+","+string(q)+","+string(r)+","+string(s)+","+string(u)+","+string(ul);
   IndicatorSetString(INDICATOR_SHORTNAME,"Blau_Ergodic("+shortname+")");
//--- OnInit done
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(
                const int rates_total,     // rates total
                const int prev_calculated, // bars, calculated at previous call
                const datetime &Time[],    // Time
                const double &Open[],      // Open
                const double &High[],      // High
                const double &Low[],       // Low
                const double &Close[],     // Close
                const long &TickVolume[],  // Tick Volume
                const long &Volume[],      // Real Volume
                const int &Spread[]        // Spread
               )
  {
   int i,pos;
   double value1,value2;
//--- rates total
   if(rates_total<rates_total_min) return(0);
//--- calculation of PriceBuffer[]
   CalculatePriceBuffer(
                        AppliedPrice,        // price type
                        rates_total,         // rates total
                        prev_calculated,     // bars, calculated at the previous call
                        Open,High,Low,Close, // Open[], High[], Low[], Close[]
                        PriceBuffer          // price array
                       );
//--- calculation of mtm and |mtm|
   if(prev_calculated==0)      // at first call
     {
      pos=begin1;              // starting from begin1
      for(i=0;i<pos;i++)       // pos
        {
         MtmBuffer[i]=0.0;     // zero values
         AbsMtmBuffer[i]=0.0;  //
        }
     }
   else pos=prev_calculated-1; // overwise calc only last bar
   // calculate MtmBuffer[] and AbsMtmBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      MtmBuffer[i]=PriceBuffer[i]-PriceBuffer[i-(q-1)];
      AbsMtmBuffer[i]=MathAbs(MtmBuffer[i]);
     }
//--- EMA smoothing
   // r-period of the 1st EMA
   ExponentialMAOnBufferWB(
                           rates_total,     // rates total
                           prev_calculated, // bars, calculated at previous call
                           begin1,          // starting index
                           r,               // smoothing period
                           MtmBuffer,       // input array
                           EMA_MtmBuffer    // output array
                          );
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin1,r,AbsMtmBuffer,EMA_AbsMtmBuffer);
   // s-period of 2nd EMA
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin2,s,EMA_MtmBuffer,DEMA_MtmBuffer);
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin2,s,EMA_AbsMtmBuffer,DEMA_AbsMtmBuffer);
   // u-period 3rd EMA
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin3,u,DEMA_MtmBuffer,TEMA_MtmBuffer);
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin3,u,DEMA_AbsMtmBuffer,TEMA_AbsMtmBuffer);
//--- calculation of Ergodic (graphic plot #0)
   if(prev_calculated==0)      // at first call
     {
      pos=begin4;              // starting from begin4
      for(i=0;i<pos;i++)       // pos
         MainBuffer[i]=0.0;    // zero values
     }
   else pos=prev_calculated-1; // overwise calculate only last bar
   // calculation of MainBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      value1=100*TEMA_MtmBuffer[i];
      value2=TEMA_AbsMtmBuffer[i];
      MainBuffer[i]=(value2>0)?value1/value2:0;
     }
//--- calculation of Signal Line (graphic plot #1)
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin4,ul,MainBuffer,SignalBuffer);
//--- OnCalculate done. Return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Vamos considerar em detalhes apenas as modificações e adições ao código "Blau_TSI.mq5".

1.4.3.1. Configurações do indicador Ergodic (price,q,r,s,u,ul) (alterações e adições ao código "Blau_TSI.mq5")

Configurações de indicador (em geral)

As configurações do indicador Ergodic(price,q,r,s,u,ul) diferem das configurações do indicador TSI(price,q,r,s,u) (veja Fig. 1.9):

  1. Especificar a janela para exibir os indicadores (sem alteração)
  2. Especificar o número de plotagens gráficas(uma plotagem gráfica é adicionada)
  3. Especificar o número de buffers de indicador (o número de buffers aumentou)
  4. Declaração dos arrays de indicador (adicionados aos arrays)
  5. Configure uma relação: array de indicador -> buffer de indicador -> plotagem gráfica (reestruturando).
  6. Descrever as propriedades de cada plotagem gráfica (propriedades alteradas, uma plotagem gráfica é adicionada)
  7. Especifique a precisão de exibição dos valores de indicador (sem alterações).
  8. Especificar, para cada estrutura gráfica, o número de barras inicial sem exibir na plotagem gráfica (adicionada uma plotagem gráfica).
  9. Configurar os níveis horizontais e descrever as propriedades de cada nível horizontal (sem alteração).
  10. Definir o limite da escala separada da janela do indicador (sem alteração).
  11. Especificar o nome curto do indicador (nome alterado).

Fig. 1,9. Indicador Ergodic (price,q,r,s,u,ul)

Fig. 1,9. Indicador Ergodic (price,q,r,s,u,ul)


Configurações (alterações)

O código "Blau_TSI.mq5" foi alterado das seguintes maneiras.

1. A descrição curta do programa mql5 foi alterada:

#property description "Ergodic Oscillator (William Blau)"       // description

2. Um parâmetro de entrada foi adicionado:

input int    ul=3; // ul- period of a Signal Line

3. (na configuração 11) Uma alteração foi realizada no nome curto do indicador:

//--- short indicator name
   string shortname=PriceName(AppliedPrice)+","+string(q)+","+string(r)+","+string(s)+","+string(u)+","+string(ul);
   IndicatorSetString(INDICATOR_SHORTNAME,"Blau_Ergodic("+shortname+")");
Configurações (alterações): Plotagens gráficas (2, 6)

1. (na configuração 2) Adicionada uma plotagem gráfica a mais (linha de sinal):

#property indicator_plots   2              // indicator plots

2. (na configuração 6) a) Alteradas as propriedades da primeira plotagem gráfica #0 "Ergódica".

Anteriormente, como uma maneira de exibir a linha, usamos (identificador DRAW_LINE), agora usamos um histograma da linha zero (DRAW_HISTOGRAM da enumeração ENUM_DRAW_TYPE)

Alterada a cor para exibição das linhas e o comprimento das linhas:

//--- graphic plot #0 (Main)
#property indicator_label1  "Ergodic"      // graphic plot #0
#property indicator_type1   DRAW_HISTOGRAM // draw as a histogram
#property indicator_color1  Silver         // histogram color
#property indicator_style1  STYLE_SOLID    // line style
#property indicator_width1  2              // line width

b) Adicionada uma plotagem gráfica #1 "Sinal" (linha de sinal):

//--- graphic plot #1 (Signal Line)
#property indicator_label2  "Signal"       // graphic plot #1
#property indicator_type2   DRAW_LINE      // draw as a line
#property indicator_color2  Red            // line color
#property indicator_style2  STYLE_SOLID    // line style
#property indicator_width2  1              // line width
Configurações (alterações): Os buffers de indicador (3-5)

As alterações na configuração "Array de indicador -> buffer de indicador -> estrutura gráfica":

1. (na configuração 3) O número de buffers aumentou:

#property indicator_buffers 11             // number of buffers

2. (na configuração 4) Adicionado um array de indicador, que é necessário para calcular e renderizar os valores de linha de sinal:

double SignalBuffer[];      // Signal line: ul-period EMA of Ergodic (graphic plot #1)

3. (na configuração 5) A relação "array de indicador -> buffer de indicador -> estrutura gráfica" foi alterada:

//--- indicator buffers
   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);                 // Ergodic
   // graphic plot #1
   SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);               // signal line: ul-period EMA of Ergodic
   // buffers for intermediate calculations
   SetIndexBuffer(2,PriceBuffer,INDICATOR_CALCULATIONS);        // price array
   SetIndexBuffer(3,MtmBuffer,INDICATOR_CALCULATIONS);          // q-period моментум
   SetIndexBuffer(4,EMA_MtmBuffer,INDICATOR_CALCULATIONS);      // r-period of the 1st EMA
   SetIndexBuffer(5,DEMA_MtmBuffer,INDICATOR_CALCULATIONS);     // s-period of the 2nd EMA
   SetIndexBuffer(6,TEMA_MtmBuffer,INDICATOR_CALCULATIONS);     // u-period of the 3rd EMA
   SetIndexBuffer(7,AbsMtmBuffer,INDICATOR_CALCULATIONS);       // q-period Momentum (absolute value)
   SetIndexBuffer(8,EMA_AbsMtmBuffer,INDICATOR_CALCULATIONS);   // r-period of the 1st EMA (absolute value)
   SetIndexBuffer(9,DEMA_AbsMtmBuffer,INDICATOR_CALCULATIONS);  // s-period of the 2nd EMA (absolute value)
   SetIndexBuffer(10,TEMA_AbsMtmBuffer,INDICATOR_CALCULATIONS); // u-period of the 3rd EMA (absolute value)
Configurações: Número de barras iniciais sem renderização (8)
  • O número de barras iniciais sem a renderização da plotagem gráfica #0 "Ergódica" não foi alterada. O método de cálculo é definido na Seção 1.4.1.1.
  • Os métodos de cálculo do número de barras iniciais sem a renderização da plotagem gráfica #1 "Sinal" são os mesmos. O array SignalBuffer[] é o resultado da suavização dos dados significantes do array MainBuffer[] (o período de suavização ul).

Uma vez que a indexação do array MainBuffer[] inicia do 0 e os dados significantes no array MainBuffer[] começam com o índice (q-1)+(r-1)+(s-1)+(u-1), os dados significantes no array SignalBuffer[] começam com o índice (q-1)+(r-1)+(s-1)+(u-1)+(ul-1).

A variável global begin5 é declarada:

int    begin1, begin2, begin3, begin4, begin5; // starting indexes

Cálculo (completo, veja adicionalmente a seção 1.4.1.1):

//---
   begin1=q-1;         //                                    - MtmBuffer[], AbsMtmBuffer[]
   begin2=begin1+r-1;  // or =(q-1)+(r-1)                    - EMA_...[]
   begin3=begin2+s-1;  // or =(q-1)+(r-1)+(s-1)              - DEMA_...[]
   begin4=begin3+u-1;  // or =(q-1)+(r-1)+(s-1)+(u-1)        - TEMA_...[], MainBuffer[]
   begin5=begin4+ul-1; // or =(q-1)+(r-1)+(s-1)+(u-1)+(ul-1) - SignalBuffer[]
   //
   rates_total_min=begin5+1; // rates total min
//--- starting bar index for plot #0
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,begin4);
//--- starting bar index for plot #1
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,begin5);


1.4.3.2. O cálculo do indicador Ergodic(price, q, r, s, u, ul) (alterações e adições ao código "Blau_TSI.mq5")

Cálculo: O algoritmo

O algoritmo para cálculo do indicador Ergodic (price, q, r, s, u, ul):

  1. Verifique se há dados suficientes para calcular o indicador.
  2. O cálculo do array de preços, de acordo com o tipo de preço especificado - preenchimento do array PriceBuffer[].
  3. A determinação da barra de índice, a partir da qual iniciar/continuar o cálculo do momento do período q.
  4. O cálculo do momento do período q, e seu valor absoluto - o preenchimento dos arrays MtmBuffer[] e AbsMtmBuffer[].
  5. A primeira suavização pelo método EMA (período r) - o preenchimento dos arrays EMA_MtmBuffer[] e EMA_AbsMtmBuffer[].
  6. A segunda suavização pelo método EMA (período s) - o preenchimento dos arrays DEMA_MtmBuffer[] e DEMA_AbsMtmBuffer[].
  7. A terceira suavização pelo método EMA (período u) - o preenchimento dos arrays TEMA_MtmBuffer[] e TEMA_AbsMtmBuffer[].
  8. A determinação da barra de índice, a partir da qual iniciar/continuar o cálculo do índice de força real.
  9. O cálculo da Ergódica (índice de força real) - o preenchimento do array MainBuffer[] - o cálculo dos valores para renderizar a plotagem gráfica #0.
  10. O cálculo da linha de sinal - a suavização da Ergódica pelo método EMA (período ul) - o preenchimento do array SignalBuffer[] - o cálculo dos valores para a renderização da plotagem gráfica #1.

A essência das alterações no algoritmo (brevemente) a) (veja Seção 1) o requisito para o tamanho mínimo da série de tempo de entrada do indicador foi alterado; b) (veja parágrafo 10) o cálculo da Linha de Sinal foi alterado.

Cálculo (alteração): Verifique se há dados suficientes para calcular o indicador (1)

Não há alterações no algoritmo:

//--- rates total
   if(rates_total<rates_total_min) return(0);

Os valores da variável global rates_total_min foram alterados (o tamanho mínimo da série de tempo de entrada do indicador; calculado na função OnInit() no evento Initialization):

   rates_total_min=begin5+1; // the minimum size of the input timeseries of the indicator
Cálculo: linha de sinal (10)
//--- calculation of Signal Line (graphic plot #1)
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin4,ul,MainBuffer,SignalBuffer);

2. Momento estocástico

Os indicadores considerados (veja o anexo) são divididos em dois grupos.

I. Indicadores, baseados na Estocástica:

  1. Blau_TStoch.mq5 - Estocástica (Estocástica de período q, estocástica de período q suavizada);
  2. Blau_TStochI.mq5 - índice de estocástica (estocástica de período q suavizada);
  3. Blau_TS_Stochastic.mq5 - Oscilador TS estocástico (baseado no índice da estocástica).

II. Indicadores, baseados no Momento estocástico:

  1. Blau_SM.mq5 - Momento estocástico (momento estocástico de período q; momento estocástico de período q suavizado);
  2. Blau_SMI.mq5 - índice de momento estocástico (momento de período q suavizado normalizado);
  3. Blau_SM_Stochastic.mq5 - Oscilador SM estocástico (baseado no índice de momento estocástico).


2,1. Indicadores, baseados na estocástica

O "Guia do usuário ao terminal cliente do MetaTrader", na seção "Análise/Indicadores técnicos/Osciladores/Oscilador estocástico" fornece uma descrição do terminal cliente embutido MetaTrader 5 dos indicadores técnicos do Oscilador Estocástico e as maneiras de seu uso na análise técnica (veja também iStochastic.)

2.1.1. Oscilador estocástico de George Lane

Estocástica, oscilador estocástico (Estocástica, Oscilador estocástico) - é um indicador, que mostra o preço, em relação à flutuação de preço para os períodos q anteriores. O autor e popularizador do indicador é George Lane.

Diferencie:

  • Estocástica rápida, algumas vezes chamada %K;
  • Estocástica lenta (Linha de sinal), algumas vezes chamada %D.

A fórmula da estocástica, por George Lane:

           price - LL(q)
%K = 100 * -------------
           HH(q) - LL(q)
%D = SMA(%k, ul)

onde:

  • % K - Estocástica lenta;
  • % D - Estocástica lenta (linha de sinal);
  • price - preço [fechamento] do período atual;
  • q - o número de períodos de tempo dos gráficos de preço usados no cálculo da estocástica;
  • HH (q) - o valor máximo para os períodos q anteriores dos preços mais altos para o período q;
  • LL (q) - o valor mínimo para os períodos q anteriores do preço mais baixo para o período q;
  • SMA (% K, ul) - a média móvel simples de ordem ul, aplicada à estocástica rápida (% K).

De acordo com a interpretação de George Lane, a ideia básica é que durante a tendência de um aumento de preço (tendência ascendente), o preço tende a parar, perto das máximas anteriores. Com a tendência de diminuição de preço (tendência descendente), o preço tende a parar perto das mínimas anteriores.

2.1.2. Oscilador estocástico de William Blau


Fig. 2,1. Indicadores de William Blau, baseados na Estocástica:

Fig. 2,1. Indicadores de William Blau, baseados na Estocástica:

2.1.2.1. Estocástica


Estocástica - é a distância do preço [fechamento] do período atual ao ponto mais baixo da faixa de flutuações de preço, para os períodos q anteriores. O valor da estocástica de período q mostra quanto o preço foi deslocado, em relação ao ponto mais baixo da faixa de período q de flutuações de preço. Os valores da estocástica de período q são positivas ou iguais a zero.

Fig. 2,2. Definição da estocástica

Fig. 2,2. Definição da estocástica

A fórmula da estocástica de período q:

stoch(price,q) = price - LL(q)

onde:

  • price - preço [fechamento] do período atual;
  • q - o número de períodos de tempo do gráfico de preços, envolvidos no cálculo da estocástica;
  • LL (q) - o valor mínimo para os períodos q anteriores do preço mais baixo para o período q.

A fórmula da estocástica de período q suavizada

TStoch(price,q,r,s,u) = EMA(EMA(EMA( stoch(price,q) ,r),s),u)

onde:

  • price - preço de [fechamento] - a base de preço do gráfico de preço;
  • q - número de barras, usadas no cálculo da estocástica;
  • stoch(price,q)=price-LL(q) - estocástica de período q;
  • EMA (stoch (price,q),r) - primeira suavização - EMA do período r, aplicada à estocástica do período q;
  • EMA (EMA(..., r),s) - a segunda suavização - EMA do período s, aplicada ao resultado da primeira suavização;
  • EMA (EMA (EMA (..., r), s), u) - a terceira suavização - EMA do período u, aplicada ao resultado da segunda suavização.

TStoch(price,q,r,s,u) - Estocástica. Especificação

  • Nome do arquivo: Blau_TStoch.mq5
  • Nome: Indicador estocástico (estocástica de período q; estocástica de período q suavizada), de acordo com William Blau.
  • Parâmetros de entrada:
    • q - o período para o qual a estocástica é calculada (por padrão, q = 5);
    • r -período do primeiro EMA, aplicado à estocástica (por padrão, r = 20);
    • s - período do segundo EMA, aplicado ao resultado da primeira suavização (por padrão, s = 5);
    • u - período do terceiro EMA, aplicado ao resultado da segunda suavização (por padrão, u = 3);
    • AppliedPrice - Tipo de preço (por padrão, AppliedPrice = PRICE_CLOSE).
  • Adicionalmente:
    • Mostrado em uma janela separada;
    • altera a renderização da plotagem gráfica - a cor, espessura, estilo de linha (aba "Cores")
  • Limitações:
    • q>0;
    • r>0, s>0, u>0. Se r, s, ou u forem iguais a 1, a suavização do EMA não é usada.
    • o tamanho mínimo do array de preços = (q-1 + r + s + u-3 +1).

2.1.2.2. O índice estocástico

O indicador de índice estocástico é a estocástica de período q suavizada normalizada.

Os valores da estocástica de período q suavizada são mapeados para um formato de porcentagem (o intervalo [0, 100]). Cada valor da estocástica de período q suavizada é normalizado pelo valor da faixa de preço do período q. A normalização permite interpretar o valor da estocástica de período q normalizada suavizada como o grau de estados de sobrecompra/sobrevenda do mercado.

A fórmula do índice estocástico:

                         100 * EMA(EMA(EMA( price-LL(q) ,r),s),u)       100 * TStoch(price,q,r,s,u)
TStochI(price,q,r,s,u) = ---------------------------------------- = ----------------------------------
                            EMA(EMA(EMA( HH(q)-LL(q) ,r),s),u)      EMA(EMA(EMA( HH(q)-LL(q) ,r),s),u)
if EMA(EMA(EMA(HH(q)-LL(q),r),s),u)=0, then TStochI(price,q,r,s,u)=0

onde:

  • price - preço de [fechamento] - a base de preço do gráfico de preço;
  • q - número de barras, usadas no cálculo da estocástica;
  • LL (q) - o valor mínimo do preço mais baixo para o período q;
  • HH (q) - o valor máximo do preço mais alto para o período q;
  • stoch(q)=price-LL(q) - estocástica de período q;
  • TStoch(price,q,r,s,u) - estocástica de período q suavizada três vezes;
  • HH(q)-LL(q) - Faixa de preço do período q;
  • EMA (..., r) - a primeira suavização - o EMA(r), aplicado a:
    1. à estocástica do período q;
    2. à faixa de preço do período q;
  • EMA (EMA(..., r),s) - a segunda suavização - o EMA(s) aplicado ao resultado da primeira suavização;
  • EMA (EMA (EMA (..., r), s), u) - a terceira suavização - EMA(u), aplicada ao resultado da segunda suavização.

TStochI(price,q,r,s,u) - índice estocástico. Especificação

  • Nome do arquivo: Blau_TStochI.mq5
  • Nome: índice estocástico (estocástica de período q suavizado normalizado), de acordo com William Blau.
  • Parâmetros de entrada:
    • q - o período para o qual a estocástica é calculada (por padrão, q = 5);
    • r -período do primeiro EMA, aplicado à estocástica (por padrão, r = 20);
    • s - período do segundo EMA, aplicado ao resultado da primeira suavização (por padrão, s = 5);
    • u - período do terceiro EMA, aplicado ao resultado da segunda suavização (por padrão, u = 3);
    • AppliedPrice - Tipo de preço (por padrão, AppliedPrice = PRICE_CLOSE).
  • Adicionalmente:
    • Mostrado em uma janela separada;
    • alterar o estilo de renderização da plotagem gráfica - a cor, espessura, estilo de linha (a aba "Cores");
    • (opcional) Dois níveis (por padrão 40 e 60) - adicionar/remover um nível; alterar o valor e descrição do nível, alterar o estilo de renderização dos níveis (a aba "Níveis");
    • alterar os limites inferior (por padrão, 0) e superior (por padrão, 100) da escala da janela de indicador separada (a aba "Escala").
  • Limitações:
    • q>0;
    • r>0, s>0, u>0. Se r, s, ou u forem iguais a 1, então no período do EMA correspondente, a suavização não será realizada;
    • o tamanho mínimo do array de preços = (q-1 + r + s + u-3 +1).

2.1.2.3. Oscilador estocástico

A definição de Oscilador Estocástico:

TS_Stochastic(price,q,r,s,u) = TStochI(price,q,r,s,u)
SignalLine(price,q,r,s,u,ul) = EMA( TS_Stochastic(price,q,r,s,u) ,ul)

onde:

  • TS_Stochastic() - Estocástica rápida, %k - índice estocástico TStochI(price,q,r,s,u);
  • SignalLine() - Estocástica lenta (Linha de sinal),% d - EMA do período ul, aplicado à estocástica rápida (% k);
  • ul - Linha de sinal do EMA do período - de acordo com William Blau, o valor ul deve ser igual ao período da última estocástica rápida do EMA significante (> 1).

TS_Stochastic(price,q,r,s,u,ul) - Oscilador estocástico. Especificação

  • Nome do arquivo: Blau_TS_Stochastic.mq5
  • Nome: Oscilador estocástico (baseado no índice estocástico), de acordo com William Blau.
  • Parâmetros de entrada:
    • graphic plot #0 - Estocástica rápida (índice estocástico),% k:
      • q - o período para o qual a estocástica é calculada (por padrão, q = 5);
      • r -período do primeiro EMA, aplicado à estocástica (por padrão, r = 20);
      • s - período do segundo EMA, aplicado ao resultado da primeira suavização (por padrão, s = 5);
      • u - período do terceiro EMA, aplicado ao resultado da segunda suavização (por padrão, u = 3);
    • graphic plot #1 - Estocástica lenta (linha de sinal), %d:
      • ul - Linha de sinal do EMA do período, aplicado à estocástica rápida (por padrão, ul = 3);
    • AppliedPrice - Tipo de preço (por padrão, AppliedPrice = PRICE_CLOSE).
  • Adicionalmente:
    • Mostrado em uma janela separada;
    • alterar o estilo de renderização de cada plotagem gráfica - a cor, espessura, estilo de linha (a aba "Cores");
    • dois níveis (por padrão 40 e 60) - adicionar/remover um nível; alterar o valor e descrição do nível, alterar o estilo de renderização dos níveis (a aba "Níveis");
    • alterar os limites inferior (por padrão, 0) e superior (por padrão, 100) da escala da janela de indicador separada (a aba "Escala").
  • Limitações:
    • q>0;
    • r>0, s>0, u>0. Se r, s, ou u forem iguais a 1, a suavização do EMA não é usada.
    • ul > 0. Se ul = 1, então a estocástica lenta (linha de sinal) e as linhas de estocástica rápida são as mesmas;
    • o tamanho mínimo do array de preços = (q-1 + r + s + u + ul-4 +1).

2.1.2.4. Continuidade


O Oscilador estocástico de William Blau inclui o Oscilador estocástico por George Lane. Para que a TS_Stochastic (William Blau) corresponda ao Oscilador Estocástico padrão (George Lane), implementado do MetaTrader 5, o seguinte deve ser especificado:

TS_Stochastic( price=Close, q=KPeriod, r=1, s=1, u=1, ul=DPeriod )
Stochastic( KPeriod=q, DPeriod=ul, Slowing=1, price="Low/High", method="Exponential" )

Fig. 2,3. Oscilador estocástico de William Blau contém o Oscilador estocástico de George Lane.

Fig. 2,3. Oscilador estocástico de William Blau contém o Oscilador estocástico de George Lane.

2.1.2.5. O código do Oscilador estocástico


No exemplo do indicador TS_Stochastic (price, q, r, s, u, ul):

1) A relação entre os arrays de indicador, buffers de indicador e plotagens gráficas:

//--- indicator buffers
   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);              // fast Stochastic
   // graphic plot #1
   SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);            // slow Stochastic: ul-period EMA of the fast Stochastic
   // buffers, used for intermediate calculations
   SetIndexBuffer(2,PriceBuffer,INDICATOR_CALCULATIONS);      // price array
   SetIndexBuffer(3,LLBuffer,INDICATOR_CALCULATIONS);         // min value (q bars)
   SetIndexBuffer(4,HHBuffer,INDICATOR_CALCULATIONS);         // max value (q bars)
   SetIndexBuffer(5,StochBuffer,INDICATOR_CALCULATIONS);      // q-period Stochastic
   SetIndexBuffer(6,EMA_StochBuffer,INDICATOR_CALCULATIONS);  // r-period of the 1st EMA
   SetIndexBuffer(7,DEMA_StochBuffer,INDICATOR_CALCULATIONS); // s-period of the 2nd EMA
   SetIndexBuffer(8,TEMA_StochBuffer,INDICATOR_CALCULATIONS); // u-period of the 3rd EMA
   SetIndexBuffer(9,HHLLBuffer,INDICATOR_CALCULATIONS);       // q-period price range
   SetIndexBuffer(10,EMA_HHLLBuffer,INDICATOR_CALCULATIONS);  // r-period of the 1st EMA (price range)
   SetIndexBuffer(11,DEMA_HHLLBuffer,INDICATOR_CALCULATIONS); // s-period of the 2nd EMA (price range)
   SetIndexBuffer(12,TEMA_HHLLBuffer,INDICATOR_CALCULATIONS); // u-period of the 3rd EMA (price range)

2) O algoritmo de cálculo para a estocástica de período q e a faixa de preço do período q:

   // calculation of StochBuffer[], HHLLBuffer[], LLBuffer[], HHBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      // LLBuffer[] - search for the minimal price (q bars)
      // HHBuffer[] - search for the maximal price (q bars)
      min=1000000.0;
      max=-1000000.0;
      for(k=i-(q-1);k<=i;k++)
        {
         if(min>Low[k])  min=Low[k];
         if(max<High[k]) max=High[k];
        }
      LLBuffer[i]=min;
      HHBuffer[i]=max;
      // StochBuffer[] - q-period Stochastic
      StochBuffer[i]=PriceBuffer[i]-LLBuffer[i];
      // HHLLBuffer[] - q-period price range
      HHLLBuffer[i]=HHBuffer[i]-LLBuffer[i];
     }


2,2. Indicadores, baseados no momento estocástico

Fig. 2,4. Indicadores de William Blau, baseados no momento estocástico

Fig. 2,4. Indicadores de William Blau, baseados no momento estocástico

2.2.1. Momento estocástico

O Momento estocástico (Stochastic Momentum, SM) - é a distância do preço do período atual para o meio da faixa de preço sobre os períodos q anteriores. O valor do momento estocástico de período q mostra a posição do preço na faixa de preço.

O sinal do momento estocástico de período q mostra a posição do preço, relativa ao meio da faixa de preço do período q: um momento estocástico positivo - o preço está acima do ponto médio, um negativo - o preço está abaixo do ponto médio.

Fig. 2,5. A definição do momento estocástico

Fig. 2,5. A definição do momento estocástico

A fórmula do momento estocástico de período q:

sm(price,q) = price - 1/2 * [LL(q) + HH(q)]

onde:

  • price - preço [fechamento] do período atual;
  • q - número de barras, usadas no cálculo do momento estocástico;
  • LL (q) - o valor mínimo do preço mais baixo para o período q;
  • HH (q) - o valor máximo dos preços mais altos para o período q;
  • 1/2* [LL(q)+HH (q)] - o meio da faixa de preço do período q.

A fórmula do momento estocástico de período q suavizado:

SM(price,q,r,s,u) = EMA(EMA(EMA( sm(price,q) ,r),s),u)

onde:

  • price - preço de [fechamento] - a base de preço do gráfico de preço;
  • q - número de barras, usadas no cálculo do momento estocástico;
  • sm(price,q)=price-1/2*[LL(q)+HH(q)] - o momento estocástico de período q;
  • EMA (sm(price,q),r) - a primeira suavização - o EMA (r), aplicado ao momento estocástico de período q;
  • EMA (EMA(..., r),s) - a segunda suavização - o EMA(s) aplicado ao resultado da primeira suavização;
  • EMA(EMA(EMA(sm(q),r),s),u) - a terceira suavização - EMA(u), aplicada ao resultado da segunda suavização.


2.2.1.2. SM(price,q,r,s,u) - Momento estocástico. Especificação

  • Nome do arquivo: Blau_SM.mq5
  • Nome: Indicador de momento estocástico (momento estocástico de período q, momento estocástico de período q suavizado), de acordo com William Blau.
  • Parâmetros de entrada:
    • q - o período pelo qual o momento estocástico é calculado (por padrão, q = 5);
    • r -período do primeiro EMA, aplicado ao momento estocástico (por padrão, r = 20);
    • s - período do segundo EMA, aplicado ao resultado da primeira suavização (por padrão, s = 5);
    • u - período do terceiro EMA, aplicado ao resultado da segunda suavização (por padrão, u = 3);
    • AppliedPrice - Tipo de preço (por padrão, AppliedPrice = PRICE_CLOSE).
  • Adicionalmente:
    • Mostrado em uma janela separada;
    • altera a renderização da plotagem gráfica - a cor, espessura, estilo de linha (aba "Cores")
  • Limitações:
    • q>0;
    • r>0, s>0, u>0. Se r, s, ou u forem iguais a 1, a suavização do EMA não é usada.
    • o tamanho mínimo do array de preços = (q-1 + r + s + u-3 +1).

2.2.2. O índice de momento estocástico

O índice de momento estocástico (SMI) - é um indicador de uma taxa estocástica normalizada (momento estocástico de período q suavizado) Os valores do momento estocástico de período q suavizado é dado em formato de porcentagem (intervalo de exibição [-100, 100]).

Cada valor do momento estocástico de período q suavizado é normalizado pelo valor de metade da faixa de período q de flutuações de preço. A normalização permite a interpretação do valor do SMI como um grau de um nível de sobrecompra (valor positivo) ou nível de sobrevenda (negativo) do mercado.

A fórmula do índice de momento estocástico:

                     100 * EMA(EMA(EMA( price-1/2*[LL(q)+HH(q)] ,r),s),u)           100 * SM(price,q,r,s,u)
SMI(price,q,r,s,u) = ---------------------------------------------------- = ----------------------------------------
                           EMA(EMA(EMA( 1/2*[HH(q)-LL(q)] ,r),s),u)         EMA(EMA(EMA( 1/2*[HH(q)-LL(q)] ,r),s),u)
if EMA(EMA(EMA(1/2*[HH(q)-LL(q)],r),s),u)=0, then SMI(price,q,r,s,u)=0

onde:

  • price - preço de [fechamento] - a base de preço do gráfico de preço;
  • LL (q) - o valor mínimo do preço mais baixo para o período q;
  • HH (q) - o valor máximo dos preços mais altos para o período q;
  • sm(price,q)=price-1/2*[LL(q)+HH(q)] - o momento estocástico de período q;
  • SM(price,q,r,s,u) - momento estocástico de período q suavizado três vezes;
  • HH(q)-LL(q) - Faixa de preço do período q;
  • 1/2* [LL (q)+HH(q)] - o meio da faixa de preço do período q;
  • 1/2*[HH(q)-LL(q)] - metade da faixa de preço do período q;
  • EMA (..., r) - a primeira suavização - o EMA(r), aplicado a:
    1) Momento estocástico de período q
    2) Metade da faixa de preço do período q;
  • EMA (EMA(..., r),s) - a segunda suavização - o EMA(s) aplicado ao resultado da primeira suavização;
  • EMA (EMA (EMA (..., r), s), u) - a terceira suavização - EMA(u), aplicada ao resultado da segunda suavização.


2.2.2.2. SMI(price,q,r,s,u) - índice de momento estocástico. Especificação

  • Nome do arquivo: Blau_SMI.mq5
  • Nome: índice de momento estocástico (momento estocástico de período q suavizado normalizado), de acordo com William Blau.
  • Parâmetros de entrada:
    • q - o período pelo qual o momento estocástico é calculado (por padrão, q = 5);
    • r -período do primeiro EMA, aplicado ao momento estocástico (por padrão, r = 20);
    • s - período do segundo EMA, aplicado aos resultados da primeira suavização (por padrão, s = 5);
    • u - período do terceiro EMA, aplicado aos resultados da segunda suavização (por padrão, u = 3);
    • AppliedPrice - Tipo de preço (por padrão, AppliedPrice = PRICE_CLOSE).
  • Adicionalmente:
    • Mostrado em uma janela separada;
    • altera o estilo de renderização da plotagem gráfica - a cor, espessura, estilo de linha (aba "Cores")
    • (opcional) Dois níveis (por padrão -40 e +40) - adicionar/remover um nível; alterar o valor e descrição do nível, alterar o estilo de renderização dos níveis (a aba "Níveis");
    • alterar os limites inferior (por padrão, -100) e superior (por padrão, 100) da escala da janela de indicador único (a aba "Escala").
  • Limitações:
    • q>0;
    • r>0, s>0, u>0. Se r, s, ou u forem iguais a 1, então no período do EMA correspondente, a suavização não será realizada;
    • o tamanho mínimo do array de preços = (q-1 + r + s + u-3 +1).

2.2.3. O oscilador estocástico

A definição de Oscilador Estocástico:
SM_Stochastic(price,q,r,s,u) = SMI(price,q,r,s,u)
SignalLine(price,q,r,s,u,ul) = EMA( SM_Stochastic(price,q,r,s,u) ,ul)

onde:

  • SM_Stochastic() - índice de momento estocástico SMI(price,q,r,s,u);
  • SignalLine() - Linha de sinal - EMA do período, ul, aplicado ao índice de momento estocástico;
  • ul - Linha de sinal do EMA do período - de acordo com William Blau, o valor ul deve ser igual ao período do último índice EMA (>1) significante da taxa estocástica.


2.2.3.1. SM_Stochastic(price,q,r,s,u,ul) - Oscilador estocástico. Especificação

  • Nome do arquivo: Blau_SM_Stochastic.mq5
  • O nome: Oscilador estocástico (baseado no momento estocástico), de acordo com William Blau.
  • Parâmetros de entrada:
    • graphic plot #0 - o índice de momento estocástico:
      • q - o período pelo qual o momento estocástico é calculado (por padrão, q = 5);
      • r -período do primeiro EMA, aplicado ao momento estocástico (por padrão, r = 20);
      • s - período do segundo EMA, aplicado ao resultado da primeira suavização (por padrão, s = 5);
      • u - período do terceiro EMA, aplicado ao resultado da segunda suavização (por padrão, u = 3);
    • graphic plot #1 - a linha de sinal:
      • ul - Linha de sinal do EMA do período, com respeito ao índice da taxa estocástica (por padrão, ul = 3);
    • AppliedPrice - Tipo de preço (por padrão, AppliedPrice = PRICE_CLOSE).
  • Adicionalmente:
    • Mostrado em uma janela separada;
    • alterar o estilo de renderização de cada plotagem gráfica - a cor, espessura, estilo de linha (a aba "Cores");
    • dois níveis (por padrão -40 e +40) - adicionar/remover um nível; alterar o valor e descrição do nível, alterar a renderização dos níveis (a aba "Níveis");
    • alterar os limites inferior (por padrão, -100) e superior (por padrão, 100) da escala da janela de indicador único (a aba "Escala").
  • Limitações:
    • q>0;
    • r>0, s>0, u>0. Se r, s, ou u forem iguais a 1, então no período do EMA correspondente, a suavização não será realizada;
    • ul > 0. Se ul = 1, então a linha de sinal coincide com o índice da taxa estocástica;
    • o tamanho mínimo do array de preços = (q-1 + r + s + u + ul-4 +1).

2.2.4. O código do Oscilador estocástico

SM_Stochastic (price, q, r, s, u, ul):

1) A relação entre os arrays de indicador, buffers de indicador e plotagens gráficas:

//--- indicator buffers
   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);                   // Stochastic Momentum Index
   // graphic plot #1
   SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);                 // Signal Line: ul-period EMA of Stochastic Momentum Index
   // buffers for intermediate calculations (not used for plotting)
   SetIndexBuffer(2,PriceBuffer,INDICATOR_CALCULATIONS);          // price array
   SetIndexBuffer(3,LLBuffer,INDICATOR_CALCULATIONS);             // minimal price value (q bars)
   SetIndexBuffer(4,HHBuffer,INDICATOR_CALCULATIONS);             // maximal price value (q bars)
   SetIndexBuffer(5,SMBuffer,INDICATOR_CALCULATIONS);             // q-period Stochastic Momentum
   SetIndexBuffer(6,EMA_SMBuffer,INDICATOR_CALCULATIONS);         // r-period of the 1st EMA
   SetIndexBuffer(7,DEMA_SMBuffer,INDICATOR_CALCULATIONS);        // s-period of the 2nd EMA
   SetIndexBuffer(8,TEMA_SMBuffer,INDICATOR_CALCULATIONS);        // u-period of the 3rd EMA
   SetIndexBuffer(9,HalfHHLLBuffer,INDICATOR_CALCULATIONS);       // half of price range (q bars)
   SetIndexBuffer(10,EMA_HalfHHLLBuffer,INDICATOR_CALCULATIONS);  // r-period of the 1st EMA (half of price range)
   SetIndexBuffer(11,DEMA_HalfHHLLBuffer,INDICATOR_CALCULATIONS); // s-period of the 2nd EMA (half of price range)
   SetIndexBuffer(12,TEMA_HalfHHLLBuffer,INDICATOR_CALCULATIONS); // u-period of the 3rd EMA (half of price range)

2) O algoritmo de cálculo do momento estocástico de período q e metade da faixa de preço de período q:

//--- calculation of q-period Stochastic Momentum and half of price range (q bars)
   if(prev_calculated==0)       // at first call
     {
      pos=begin1;               // starting from 0
      for(i=0;i<pos;i++)        // pos values
        {
         SMBuffer[i]=0.0;       // zero values
         HalfHHLLBuffer[i]=0.0; //
         LLBuffer[i]=0.0;       //
         HHBuffer[i]=0.0;       //
        }
     }
   else pos=prev_calculated-1;  // overwise calculate only last value
   // calculation of SMBuffer[], HalfHHLLBuffer[], LLBuffer[], HHBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      // calculation of LLBuffer[] - search for the minimal price (q bars)
      // calculation of HHBuffer[] - search for the maximal price (q bars)
      min=1000000.0;
      max=-1000000.0;
      for(k=i-(q-1);k<=i;k++)
        {
         if(min>Low[k])  min=Low[k];
         if(max<High[k]) max=High[k];
        }
      LLBuffer[i]=min;
      HHBuffer[i]=max;
      // calculation of SMBuffer[] - q-period Stochastic Momentum
      SMBuffer[i]=PriceBuffer[i]-0.5*(LLBuffer[i]+HHBuffer[i]);
      // calculation of HalfHHLLBuffer[] - half of price range (q bars)
      HalfHHLLBuffer[i]=0.5*(HHBuffer[i]-LLBuffer[i]);
     }

3. O indicador de desvio de tendência

Os indicadores considerados (veja o anexo) são divididos em dois grupos.

I. Indicadores, com base em um desvio da tendência de mercado.

  1. Blau_MDI.mq5- um indicador de desvio médio da tendência (desvio médio, desvio de média móvel);
  2. Blau_Ergodic_MDI.mq5- Oscilador de MDI ergódico (com base no desvio médio).

II. Indicadores, baseados na convergência/divergência de médias móveis.

  1. Blau_MACD.mq5- Convergência/Divergência de médias móveis (MACD; MACD suavizada);
  2. Blau_Ergodic_MACD.mq5- Oscilador MACD ergódico (com base no indicador MACD).


3,1. Indicadores, com base no desvio das tendências de mercado.

Fig. 3,1. Os indicadores de William Blau são baseados em um desvio das tendências de mercado

Fig. 3,1. Os indicadores de William Blau são baseados em um desvio das tendências de mercado

3.1.1. Indicador de desvio médio

O desvio médio da tendência é a distância entre o preço e o EMA (média móvel exponencialmente suavizada) do período r, aplicado ao preço.

A tendência de desenvolvimento do mercado: o EMA(r), aplicado ao preço é usado para determinar a tendência ascendente (aumento exponencial) ou tendência descendente (diminuição exponencial) de preços.

A média móvel suaviza a curva de preço, mas um leve aumento do período da média móvel leva a um atraso, que é claramente visível nos pontos de reversão de preço (veja adicionalmente 1.1.1, Fig. 1.2). O valor do desvio médio da tendência mostra a distância ao EMA(r), aplicada ao preço.

O sinal do desvio médio da tendência mostra a posição do preço, relativa ao EMA(r) aplicado ao preço: um desvio positivo da tendência - o preço é maior que o expoente, negativo - o preço é mais baixo do que o expoente.

A fórmula para o desvio médio da tendência:

md(price,r) = price - EMA(price,r)

onde:

  • price - preço do período atual;
  • EMA (price,r) - a tendência de mercado - EMA do período r, aplicado ao preço.

Veja o "Guia do usuário para o terminal cliente MetaTrader", na seção "Análise/Indicadores técnicos/Indicadores de tendência":

  1. Média móvel exponencial dupla, DEMA;
  2. Média móvel exponencial tripla, TEMA.

Um índice similar é usado por Alexander Elder em seus indicadores Bears Power e Bulls Power. Veja o "Guia do usuário para o terminal cliente MetaTrader", na seção "Análise/Indicadores técnicos/Osciladores":

  1. Bears Power;
  2. Bulls Power.

O indicador de desvio médio da tendência (Mean Deviation Index, MDI) - é um desvio de média móvel suavizada da tendência de mercado.

A fórmula do indicador do desvio médio da tendência:

MDI(price,r,s,u) = EMA(EMA( md(price,r) ,s),u) = EMA(EMA( price-EMA(price,r) ,s),u)

onde:

  • price - preço de [fechamento] - a base de preço do gráfico de preço;
  • EMA (price, r) - a tendência de mercado - a primeira suavização do EMA(r), aplicada ao preço;
  • md (price,r) = price-EMA (price,r) - o desvio médio da tendência - o desvio do preço do EMA(r), aplicado ao preço.
  • EMA (md (price, r), s) - a segunda suavização - o EMA(s), aplicado ao desvio médio da tendência;
  • EMA (EMA (md(price,r),s),u) - a terceira suavização - o EMA(u), aplicado ao resultado da segunda suavização.


3.1.1.3. MDI(price,r,s,u) - índice de desvio médio. Especificação

  • Nome do arquivo: Blau_MDI.mq5
  • Nome: O indicador do desvio médio do mercado (desvio médio; um desvio médio suavizado), de acordo com William Blau.
  • Parâmetros de entrada:
    • r -período do primeiro EMA, aplicado ao preço (por padrão, r = 20);
    • s - período do segundo EMA, aplicado ao desvio médio (por padrão, s = 5);
    • u - período do terceiro EMA, aplicado ao resultado da segunda suavização (por padrão, u = 3);
    • AppliedPrice - Tipo de preço (por padrão, AppliedPrice = PRICE_CLOSE).
  • Adicionalmente:
    • Mostrado em uma janela separada;
    • altera a renderização da plotagem gráfica - a cor, espessura, estilo de linha (aba "Cores")
  • Limitações:
    • r>1;
    • s>0, u>0. Se s ou u forem iguais a 1, a suavização do EMA não é usada.
    • o tamanho mínimo do array de preços = (r+s+u-3+1).

3.1.2. Oscilador MDI ergódico

Definição do oscilador MDI ergódico:
Ergodic_MDI(price,r,s,u) = MDI(price,r,s,u)
SignalLine(price,r,s,u,ul) = EMA( Ergodic_MDI(price,r,s,u) ,ul)

onde:

  • Ergodic_MDI() - Ergódico - índice de desvio médio MDI(price,r,s,u);
  • SignalLine() - Linha de sinal - EMA do período ul, aplicado à ergódica;
  • ul - Um período EMA de uma linha de sinal - de acordo com William Blau, o valor ul deve ser igual ao período da última ergódica de EMA significante (>1).


3.1.2.2. Ergodic_MDI(price,r,s,u,ul) - Oscilador MDI ergódico. Especificação

  • Nome do arquivo: Blau_Ergodic_MDI.mq5
  • Nome: O oscilador MDI ergódico (baseado no índice de desvio médio), de acordo com William Blau.
  • Parâmetros de entrada:
    • graphic plot #0 - Ergódica (o indicador do desvio médio da tendência):
      • r -período do primeiro EMA, aplicado ao preço (por padrão, r = 20);
      • s - período do segundo EMA, aplicado ao resultado da primeira suavização (por padrão, s = 5);
      • u - período do terceiro EMA, aplicado ao resultado da segunda suavização (por padrão, u = 3);
    • graphic plot #1 - a linha de sinal:
      • ul - Linha de sinal do EMA do período, aplicado à ergódica (por padrão, ul = 3);
    • AppliedPrice - Tipo de preço (por padrão, AppliedPrice = PRICE_CLOSE).
  • Adicionalmente:
    • Mostrado em uma janela separada;
    • altera o estilo da renderização de cada estrutura gráfica - a cor, comprimento, estilo de linha (a aba "Cores").
  • Limitações:
    • r>1;
    • s>0, u>0. Se s ou u forem iguais a 1, a suavização do EMA não é usada.
    • ul > 0. Se ul = 1, então a linha de sinal e as linhas ergódicas são as mesmas;
    • o tamanho mínimo do array de preços = (r+s+u+ul-4+1).

3.1.3. O código do Oscilador ergódico

Como exemplo, vamos considerar o indicador Ergodic_MDI(price, r, s, u, ul):

1) A relação entre os arrays de indicador, buffers de indicador e plotagens gráficas:

//--- indicator buffers
   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);              // ergodic: u-period 3rd EMA
   // graphic plot #1
   SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);            // signal line: ul-period EMA of Ergodic
   // buffers for intermediate calculations; not used for plotting
   SetIndexBuffer(2,PriceBuffer,INDICATOR_CALCULATIONS);     // price array
   SetIndexBuffer(3,EMA_PriceBuffer,INDICATOR_CALCULATIONS); // r-period 1st EMA (price)
   SetIndexBuffer(4,MDBuffer,INDICATOR_CALCULATIONS);        // среднее отклонение
   SetIndexBuffer(5,DEMA_MDBuffer,INDICATOR_CALCULATIONS);   // s-period 2nd EMA

2) O algoritmo para cálculo do desvio médio:

//--- calculation of the mean deviation
   if(prev_calculated==0)      // at first call
     {
      pos=begin2;              // starting from 0
      for(i=0;i<pos;i++)       // pos data
         MDBuffer[i]=0.0;      // zero values
     }
   else pos=prev_calculated-1; // overwise calculate only last bar
   // r-period 1st EMA: calculation of EMA_PriceBuffer[]
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin1,r,PriceBuffer,EMA_PriceBuffer);
   // calculation of MDBuffer[]
   for(i=pos;i<rates_total;i++)
      MDBuffer[i]=PriceBuffer[i]-EMA_PriceBuffer[i];


3,2. Indicadores, com base na convergência/divergência da média móvel

Fig. 3,2. Indicadores de William Blau são baseados na convergência/divergência de médias móveis

Fig. 3,2. Indicadores de William Blau são baseados na convergência/divergência de médias móveis

3.2.1. O indicador de convergência/divergência das médias móveis

A convergência/divergência de média móvel (Moving Average Convergence/Divergence, MACD) - é a diferença entre duas médias móveis exponencialmente suavizadas: o EMA(s) rápido e o EMA(r) lento, aplicadas ao preço.

O sinal da MACD mostra a posição do EMA(s), relativo ao EMA(r): uma MACD positiva - EMA(s) está acima do EMA(r), uma MACD negativa - EMA(s) está abaixo do EMA(r). Alteração da MACD pelo valor absoluto: um aumento da |MACD| indica a discrepância entre as médias móveis, uma diminuição da |MACD| indica uma convergência das médias móveis.

A fórmula da convergência/divergência de média móvel:

macd(price,r,s) = EMA(price,s) - EMA(price,r)
s < r

onde:

  • price - preço [fechamento] do período atual;
  • EMA(price,r) - EMA(r) lento, aplicado ao preço;
  • EMA(price,s) - EMA(s) rápido, aplicado ao preço.

O indicador MACD mostra o relacionamento entre as médias exponenciais rápida e lenta (convergência/divergência suavizada das médias móveis).

A fórmula do indicador MACD:

MACD(price,r,s,u) = EMA( macd(price,r,s) ,u) = EMA( EMA(price,s)-EMA(price,r) ,u)
s < r

onde:

  • price - preço de [fechamento] - o preço do gráfico de preço;
  • EMA (price, r) - a primeira suavização - o exponencial lento do EMA(r), aplicado ao preço;
  • EMA (price, s) - a segunda suavização - o EMA(s) rápido, s, aplicado ao preço;
  • macd(r,s)=EMA(price,s)-EMA (price,r) - o MACD;
  • EMA(macd (r,s),u) - a terceira suavização - o EMA(u), aplicado ao MACD: um EMA (price,s) rápido e um EMA (price,r) lento.

3.2.1.1. MACD(price,r,s,u) - o indicador de convergência/divergência de média móvel. Especificação

  • Nome do arquivo: Blau_MACD.mq5
  • Nome: O indicador MACD (MACD; suavizado), de acordo com William Blau.
  • Parâmetros de entrada:
    • r -período do primeiro EMA (lento), aplicado ao preço (por padrão, r = 20);
    • s - período do segundo EMA (rápido), aplicado ao desvio médio (por padrão, s = 5);
    • u - período do terceiro EMA, aplicado à convergência/divergência de médias móveis (por padrão, u = 3);
    • AppliedPrice - Tipo de preço (por padrão, AppliedPrice = PRICE_CLOSE).
  • Adicionalmente:
    • Mostrado em uma janela separada;
    • altera a renderização da plotagem gráfica - a cor, espessura, estilo de linha (aba "Cores")
  • Limitações:
    • r>1, s>1;
    • s <r (limitar="" pelos="" requisitos="" da="" teoria,="" não="" é="" verificado="" no="" nível="" do="" programa);
    • u>0. Se u = 1, a suavização não é realizada;
    • o tamanho mínimo do array de preços = ([max(r,s)]+u-2+1).

3.2.2. Oscilador MACD ergódico

Definição do oscilador MACD ergódico:
Ergodic_MACD(price,r,s,u) = MACD(price,r,s,u)
SignalLine(price,r,s,u,ul) = EMA( Ergodic_MACD(price,r,s,u) ,ul)

onde:

  • Ergodic_MACD () - Ergódica - é um indicador de convergência/divergência de médias móveis MACD(price,r,s,u);
  • SignalLine() - Linha de sinal - EMA (ul), aplicado à ergódica;
  • ul - um período EMA de uma linha de sinal - de acordo com William Blau, o valor ul deve ser igual ao período da última ergódica EMA significante (>1).

O "guia de usuário do terminal cliente MetaTrader", na seção "Análise/Indicadores técnicos/Osciladores/MACD", descreve o indicador técnico Convergência/Divergência das médias móveis (MACD), embutido no terminal cliente do MetaTrader, e como usá-lo em análises técnicas (veja também iMACD).

Em contraste com o MACD padrão, William Blau usa a média móvel exponencialmente suavizada (no MACD padrão, a média móvel simples é usada).

3.2.2.1. Ergodic_MACD(price,r,s,u,ul) - Oscilador MACD ergódico. Especificação

  • Nome do arquivo: Blau_Ergodic_MACD.mq5
  • Nome: Oscilador MACD Ergódico (com base no indicador de convergência/divergência de médias móveis), de acordo com William Blau.
  • Parâmetros de entrada:
    • graphic plot #0 - Ergódica (a convergência/divergência de médias móveis):
      • r -período do primeiro EMA (lento), aplicado ao preço (por padrão, r = 20);
      • s - período do segundo EMA (rápido), aplicado ao desvio médio (por padrão, s = 5);
      • u - período do terceiro EMA, aplicado à convergência/divergência de médias móveis (por padrão, u = 3);
    • graphic plot #1 - a linha de sinal:
      • ul - a linha de sinal EMA do período, é aplicada à ergódica (por padrão, ul = 3);
    • AppliedPrice - Tipo de preço (por padrão, AppliedPrice = PRICE_CLOSE).
  • Adicionalmente:
    • Mostrado em uma janela separada;
    • altera o estilo da renderização de cada estrutura gráfica - a cor, comprimento, estilo de linha (a aba "Cores").
  • Limitações:
    • r>1, s>1;
    • s <r (limitar="" pelos="" requisitos="" da="" teoria,="" não="" é="" verificado="" no="" nível="" do="" programa);
    • u>0. Se u = 1, a suavização não é realizada;
    • ul > 0. Se ul = 1, então a linha de sinal coincide com a ergódica;
    • o tamanho mínimo do array de preços =([max(r,s)]+u+ul-3+1).

3.2.3. O código do Oscilador MACD ergódico

Como exemplo, vamos considerar o indicador Ergodic_MACD(price, r, s, u, ul):

1) A ligação entre os arrays de indicador, buffers de indicador e plotagens gráficas:

//--- indicator buffers
   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);               // Ergodic: u-period 3rd EMA
   // graphic plot #1
   SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);             // Signal Line: ul-period EMA, applied to Ergodic
   // buffers for intermediate calculations
   SetIndexBuffer(2,PriceBuffer,INDICATOR_CALCULATIONS);      // price array
   SetIndexBuffer(3,EMA1_PriceBuffer,INDICATOR_CALCULATIONS); // r-period 1st EMA (slow), applied to price
   SetIndexBuffer(4,EMA2_PriceBuffer,INDICATOR_CALCULATIONS); // s-period 2nd EMA (fast), applied to price
   SetIndexBuffer(5,MACDBuffer,INDICATOR_CALCULATIONS);       // moving averages convergence/divergence

2) O algoritmo de convergência/divergência das médias móveis

//--- calculation of moving average convergence/divergence
   if(prev_calculated==0)      // at first call
     {
      pos=begin2;              // 
      for(i=0;i<pos;i++)       // pos
         MACDBuffer[i]=0.0;    // zero values
     }
   else pos=prev_calculated-1; // overwise calculate only last value
   // r-period 1st EMA: calculation of EMA1_PriceBuffer[]
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin1,r,PriceBuffer,EMA1_PriceBuffer);
   // s-period 2nd EMA: calculation of EMA2_PriceBuffer[]
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin1,s,PriceBuffer,EMA2_PriceBuffer);
   // calculation of MACDBuffer[]
   for(i=pos;i<rates_total;i++)
      MACDBuffer[i]=EMA2_PriceBuffer[i]-EMA1_PriceBuffer[i];

3,3. Adição

No cálculo do MDI ergódico e do oscilador MACD, de acordo com William Blau, a normalização não é usada (para referência, veja as seções 1.2.1 e 1.3.1). Portanto, o Oscilador MDI ergódico e o oscilador MACD não pode ser usado para interpretar o grau de mercado de sobrecompra ou sobrevenda.

Por exemplo, as recomendações para usar os sinais de indicador do MACD a partir do "guia de usuário para o terminal cliente do MetaTrader" na seção "Análise/Indicadores técnicos/Osciladores/MACD":

O MACD também é útil como um indicador de sobrecompra/sobrevenda. quando a média móvel mais curta afasta-se dramaticamente da média móvel mais longa (isto é, o MACD aumenta), é provável que o preço de segurança esteja extrapolando e logo retornará a preços mais realistas.

neste caso, a partir do aspecto da análise técnica.


4. Momento de candlestick

Os indicadores considerados (veja o anexo) são divididos em dois grupos.

  1. Blau_CMtm.mq5- é o indicador de momento de candlestick (momento de candlestick do período q; momento de candlestick de período q suavizado);
  2. Os índices (momento de candlestick de período q suavizado normalizado):
    • Blau_CMI.mq5- o índice de momento de candlestick (normalização pelo valor absoluto do momento de candlestick de período q);
    • Blau_CSI.mq5- o índice de candlestick (normalizado pelo comprimento do candlestick de período q);
  3. O oscilador ergódico do candlestick
    • Blau_Ergodic_CMI.mq5- o oscilador CMI ergódico (baseado no índice de momento de candlestick);
    • Blau_Ergodic_CSI.mq5- o oscilador CSI ergódico (baseado no índice de candlestick);

Fig. 4,1. Indicadores, por William Blau, baseados no momento de candlestick (normalizados pelo valor absoluto do momento de candlestick de período q)

Fig. 4,1. Indicadores, por William Blau, baseados no momento de candlestick (normalizados pelo valor absoluto do momento de candlestick de período q)

Fig. 4,2. Indicadores, por William Blau, baseados no momento de candlestick (normalizados pelo comprimento do candlestick de período q)

Fig. 4,2. Indicadores, por William Blau, baseados no momento de candlestick (normalizados pelo comprimento do candlestick de período q)

4,1. O Momento de candlestick

4.1.1. A definição do momento de candlestick

O momento (veja seção 1.1) - é a diferença entre o preço atual (geralmente o preço de fechamento de hoje) e o preço anterior (geralmente o preço de fechamento de ontem). O momento pode refletir a alteração de preço em qualquer período de tempo do gráfico de preço.

O Momento de candlestick (de acordo com William Blau) - é a diferença entre o preço de fechamento e o preço de abertura, dentro do mesmo período (com um candlestick). O sinal do momento de candlestick mostra a direção da alteração de preço: um momento de candlestick positivo - o preço aumentou sobre o período, um negativo - o preço diminuiu sobre o período.

A fórmula do momento de candlestick:

cmtm = close - open

onde:

  • close - o preço de fechamento do período [atual] do candlestick;
  • open - o preço de abertura do período [atual] do candlestick.

Do ponto de vista da universalidade, vamos estender a definição do momento de candlestick:

  1. O momento de candlestick pode refletir a alteração de preço em qualquer período de tempo do gráfico de preço;
  2. O preço base (o preço de fechamento, preço de abertura) pode ser arbitrário.

Fig. 4,3. A definição do candlestick de período q

Fig. 4,3. A definição do candlestick de período q


A fórmula do momento de candlestick de período q:

cmtm(price1,price2,q) = price1 - price2[q-1]

onde:

  • q - número de barras do gráfico de preço, usado no cálculo do momento de candlestick;
  • price1 - preço [fechamento] no final do período q;
  • price2[q-1] - preço [abertura] no início do período q.

A fórmula do momento de candlestick de período q suavizado:

CMtm(price1,price2,q,r,s,u) = EMA(EMA(EMA( cmtm(price1,price2,q) ,r),s),u)

onde:

  • q - número de barras do gráfico de preço, usado no cálculo do momento de candlestick de período q;
  • price1 - preço [fechamento] no final do período q;
  • price2 - preço [abertura] no início do período q;
  • cmtm(price1,price2,q)=price1-price2[q-1] - momento de candlestick de período q;
  • EMA (cmtm (price1, price2, q), r) - a primeira suavização - EMA(r), aplicada ao momento de candlestick de período q;
  • EMA (EMA(..., r),s) - a segunda suavização - o EMA(s) aplicado ao resultado da primeira suavização;
  • EMA (EMA (EMA (..., r), s), u) - a terceira suavização - EMA(u), aplicada ao resultado da segunda suavização.


4.1.2. CMtm(price1,price2,q,r,s,u) - Indicador de momento de candlestick. Especificação
  • Nome do arquivo: Blau_CMtm.mq5
  • Nome: O indicador de momento de candlestick (momento de candlestick de período q suavizado), de acordo com William Blau.
  • Parâmetros de entrada:
    • 1 - o período do momento de candlestick (por padrão, q=1);
    • r -período do primeiro EMA, aplicado ao momento de candlestick (por padrão, r = 20);
    • s - período do segundo EMA, aplicado ao resultado da primeira suavização (por padrão, s = 5);
    • u - período do terceiro EMA, aplicado ao resultado da segunda suavização (por padrão, u = 3);
    • AppliedPrice1 - Tipo de preço [fechamento] (por padrão, AppliedPrice = PRICE_CLOSE).
    • AppliedPrice2 - Tipo de preço [abertura] (por padrão, AppliedPrice = PRICE_OPEN).
  • Adicionalmente:
    • Mostrado em uma janela separada;
    • altera a renderização da plotagem gráfica - a cor, espessura, estilo de linha (aba "Cores")
  • Limitações:
    • q>0;
    • r>0, s>0, u>0. Se r, s, ou u forem iguais a 1, a suavização do EMA não é usada.
    • o tamanho mínimo do array de preços = (q-1 + r + s + u-3 +1).


4,2. O Momento de candlestick normalizado

4.2.1. índice de Momento de candlestick

O índice de momento de candlestick (CMI) é o momento de candlestick de período q normalizado.

Os valores do momento suavizado do candlestick de período q são dados como uma porcentagem (intervalo de mapeamento [-100, 100]). Cada valor do momento suavizado do candlestick do período q é normalizado pelo valor do momento de candlestick de período q suavizado, tomado no valor absoluto. A normalização permite que o valor CMI seja interpretado como um grau de nível de mercado de sobrecompra (valor positivo) ou sobrevenda (valor negativo).

A fórmula do índice de momento de candlestick:

                             100 * EMA(EMA(EMA( cmtm(price1,pric2,q) ,r),s),u)          100 * CMtm(price1,pric2,q,r,s,u)
CMI(price1,price2,q,r,s,u) = –––––––––––-------------––––––––-–––––––––––––––– = –––––––––––––––-------------–––-–––––––––––––
                               EMA(EMA(EMA( |cmtm(price1,pric2,q)| ,r),s),u)     EMA(EMA(EMA( |cmtm(price1,pric2,q)| ,r),s),u)
if EMA(EMA(EMA(|cmtm(price1,pric2,q)|,r),s),u)=0, then CMI(price1,price2,q,r,s,u)=0

onde:

  • q - o número de períodos de tempo do gráfico de preço, envolvidos no cálculo do momento do período q do candlestick;
  • price1 - preço [fechamento] no final do período q;
  • price2 - preço [abertura] no início do período q;
  • cmtm(price1,pric2,q)=price1-pric2[q-1], - Momento de candlestick de período q;
  • |cmtm(price1,pric2,q)| - valor absoluto do momento de candlestick de período q;
  • SM(price,q,r,s,u) - momento de candlestick de período q suavizado três vezes;
  • EMA (..., r) - a primeira suavização - o EMA(r), aplicado a:
    1) o momento de candlestick de período q
    2) o valor absoluto do momento de candlestick de período q;
  • EMA (EMA(..., r),s) - a segunda suavização - o EMA(s), aplicado ao resultado da primeira suavização;
  • EMA (EMA (EMA (..., r), s), u) - a terceira suavização - EMA(u), aplicada ao resultado da segunda suavização.


4.2.1.1. CMI(price1,price2,q,r,s,u) - índice de momento de candlestick. Especificação

  • Nome do arquivo: Blau_CMI.mq5
  • Nome: índice do momento candlestick de período q (momento de candlestick de período q suavizado normalizado; normalização pelo valor absoluto do momento de candlestick de período q), de acordo com William Blau.
  • Parâmetros de entrada:
    • q - o período do momento de candlestick (por padrão, q=1);
    • r -período do primeiro EMA, aplicado ao momento de candlestick de período q (por padrão, r = 20);
    • s - período do segundo EMA, aplicado ao resultado da primeira suavização (por padrão, s = 5);
    • u - período do terceiro EMA, aplicado ao resultado da segunda suavização (por padrão, u = 3);
    • AppliedPrice1 - Tipo de preço [fechamento] (por padrão, AppliedPrice = PRICE_CLOSE).
    • AppliedPrice2 - Tipo de preço [abertura] (por padrão, AppliedPrice = PRICE_OPEN).
  • Adicionalmente:
    • Mostrado em uma janela separada;
    • altera o estilo de renderização da plotagem gráfica - a cor, espessura, estilo de linha (aba "Cores")
    • (opcional) dois níveis (o padrão é -25 e +25) - adicionar e remover um nível; alterar o valor, a descrição do nível, alterar o estilo de renderização dos níveis (a aba "Níveis");
    • alterar os limites inferior (por padrão, -100) e superior (por padrão, 100) da escala da janela de indicador único (a aba "Escala").
  • Limitações:
    • q>0;
    • r>0, s>0, u>0. Se r, s, ou u forem iguais a 1, então no período do EMA correspondente, a suavização não será realizada;
    • o tamanho mínimo do array de preços = (q-1 + r + s + u-3 +1).

4.2.2. O índice de candlestick

O índice de candlestick (CSI) - é um indicador do momento de candlestick de período q normalizado (momento de candlestick de período q suavizado normalizado). Os valores do momento de candlestick de período q suavizado são dados como uma porcentagem da escala (intervalo de mapeamento [-100, 100]).

Cada valor do momento de candlestick de período q é normalizado pelo valor da faixa de preço do período q (ou pelo comprimento do candlestick de período q). A normalização permite interpretar o valor de CSI como um grau de nível de mercado de sobrecompra (valor positivo) ou sobrevenda (valor negativo).

A fórmula do índice de candlestick:

                             100 * EMA(EMA(EMA( cmtm(price1,pric2,q) ,r),s),u)    100 * CMtm(price1,pric2,q,r,s,u)
CSI(price1,price2,q,r,s,u) = –––––––––––––––––––-–––-------------––––––––––––– = ––––––––––––––––--––-–––––––––––––
                                    EMA(EMA(EMA( HH(q)-LL(q) ,r),s),u)           EMA(EMA(EMA( HH(q)-LL(q) ,r),s),u)
if EMA(EMA(EMA(HH(q)-LL(q),r),s),u)=0, then CSI(price1,price2,q,r,s,u)=0

onde:

  • q - número de barras do gráfico de preço, usado no cálculo do momento de candlestick de período q;
  • price1 - preço [fechamento] no final do período q;
  • price2 - preço [abertura] no início do período q;
  • cmtm(price1,pric2,q)=price1-price2[q-1] - momento de candlestick de período q;
  • LL (q) - o valor mínimo do preço mais baixo para o período q;
  • HH (q) - o valor máximo do preço mais alto para o período q
  • HH(q)-LL(q) - faixa de preço do período q (comprimento do candlestick de período q);
  • CMtm(price1,pric2,q,r,s,u) - momento de candlestick de período q suavizado três vezes;
  • EMA (..., r) - a primeira suavização - o EMA(r), aplicado a:
    1) momento de candlestick de período q,
    2) faixa de preço de período q (ou comprimento do candlestick de período q);
  • EMA (EMA(..., r),s) - a segunda suavização - o EMA(s), aplicado ao resultado da primeira suavização;
  • EMA (EMA (EMA (..., r), s), u) - a terceira suavização - o EMA(u), aplicado ao resultado da segunda suavização.

4.2.2.1. CSI(price1,price2,q,r,s,u) - índice de candlestick. Especificação

  • Nome do arquivo: Blau_CSI.mq5
  • Nome: índice do candlestick de período q (momento de candlestick de período q suavizado normalizado; normalização pelo comprimento do candlestick de período q), de acordo com William Blau.
  • Parâmetros de entrada:
    • q - o período para o qual o momento de candlestick de período q é calculado (por padrão, q = 1);
    • r -período do primeiro EMA, aplicado ao momento de candlestick (por padrão, r = 20);
    • s - período do segundo EMA, aplicado ao resultado da primeira suavização (por padrão, s = 5);
    • u - período do terceiro EMA, aplicado ao resultado da segunda suavização (por padrão, u = 3);
    • AppliedPrice1 - Tipo de preço [fechamento] (por padrão, AppliedPrice = PRICE_CLOSE).
    • AppliedPrice2 - Tipo de preço [abertura] (por padrão, AppliedPrice = PRICE_OPEN).
  • Adicionalmente:
    • Mostrado em uma janela separada;
    • altera o estilo de renderização da plotagem gráfica - a cor, espessura, estilo de linha (aba "Cores")
    • (opcional) dois níveis (o padrão é -25 e +25) - adicionar e remover um nível; alterar o valor, a descrição do nível, alterar o estilo de renderização dos níveis (a aba "Níveis");
    • alterar os limites inferior (por padrão, -100) e superior (por padrão, 100) da escala da janela de indicador único (a aba "Escala").
  • Limitações:
    • q>0;
    • r>0, s>0, u>0. Se r, s, ou u forem iguais a 1, a suavização do EMA não é usada.
    • o tamanho mínimo do array de preços = (q-1 + r + s + u-3 +1).

4,3. Os osciladores ergódicos do candlestick

4.3.1. O oscilador CMI ergódico

Definição do oscilador CMI ergódico:
Ergodic_CMI(price1,pric2,q,r,s,u) = CMI(price1,pric2,q,r,s,u)
SignalLine(price1,pric2,q,r,s,u,ul) = EMA( Ergodic_CMI(price1,pric2,q,r,s,u) ,ul)

onde:

  • Ergodic_CMI() - Ergódica - índice de momento de candlestick CMI(price1,price2,q,r,s,u);
  • SignalLine() - Linha de sinal - EMA (ul), aplicado à ergódica;
  • ul - um período EMA de uma linha de sinal - de acordo com William Blau, o valor ul deve ser igual ao período da última ergódica EMA significante (>1).

Ergodic_CMI(price1,pric2,q,r,s,u,ul) - oscilador CMI ergódico. Especificação

  • Nome do arquivo: Blau_Ergodic_CMI.mq5
  • Nome: O oscilador CMI ergódico (baseado no índice de momento de candlestick), de acordo com William Blau.
  • Parâmetros de entrada:
    • graphic plot #0 - ergódica (índice de momento de candlestick):
      • 1 - o período do momento de candlestick (por padrão, q=1);
      • r -período do primeiro EMA, aplicado ao momento de candlestick de período q (por padrão, r = 20);
      • s - período do segundo EMA, aplicado ao resultado da primeira suavização (por padrão, s = 5);
      • u - período do terceiro EMA, aplicado ao resultado da segunda suavização (por padrão, u = 3);
    • graphic plot #1 - a linha de sinal:
      • ul - período de linha de sinal, aplicado à ergódica (por padrão, ul = 3);
    • AppliedPrice1 - Tipo de preço [fechamento] (por padrão, AppliedPrice = PRICE_CLOSE).
    • AppliedPrice2 - Tipo de preço [abertura] (por padrão, AppliedPrice = PRICE_OPEN).
  • Adicionalmente:
    • Mostrado em uma janela separada;
    • alterar o estilo de renderização de cada plotagem gráfica - a cor, espessura, estilo de linha (a aba "Cores");
    • dois níveis (o padrão é -25 e +25) - adicionar e remover um nível; alterar o valor, a descrição do nível, alterar o estilo de renderização dos níveis (a aba "Níveis");
    • alterar os limites inferior (por padrão, -100) e superior (por padrão, 100) da escala da janela de indicador único (a aba "Escala").
  • Limitações:
    • q>0;
    • r>0, s>0, u>0. Se r, s, ou u forem iguais a 1, então no período do EMA correspondente, a suavização não será realizada;
    • ul > 0. Se ul = 1, então a linha de sinal coincide com a ergódica;
    • o tamanho mínimo do array de preços = (q-1 + r + s + u + ul-4 +1).


O código do Oscilador CMI ergódico


Como exemplo, vamos considerar o indicador Ergodic_CMI (price1,price2,r,s,u,ul):

1) A relação entre os arrays de indicador, buffers de indicador e plotagens gráficas:

//--- indicator buffers
   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);                  // Ergodic
   // graphic plot #1
   SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);                // Signal Line: EMA(ul), applied to Ergodic
   // buffers for intermediate calculations
   SetIndexBuffer(2,Price1Buffer,INDICATOR_CALCULATIONS);        // price array [close]
   SetIndexBuffer(3,Price2Buffer,INDICATOR_CALCULATIONS);        // price array [open]
   SetIndexBuffer(4,CMtmBuffer,INDICATOR_CALCULATIONS);          // q-period Candlestick Momentum
   SetIndexBuffer(5,EMA_CMtmBuffer,INDICATOR_CALCULATIONS);      // r-period 1st EMA
   SetIndexBuffer(6,DEMA_CMtmBuffer,INDICATOR_CALCULATIONS);     // s-period 2nd EMA
   SetIndexBuffer(7,TEMA_CMtmBuffer,INDICATOR_CALCULATIONS);     // u-period 3rd EMA
   SetIndexBuffer(8,AbsCMtmBuffer,INDICATOR_CALCULATIONS);       // q-period Candlestick Momentum (absolute value)
   SetIndexBuffer(9,EMA_AbsCMtmBuffer,INDICATOR_CALCULATIONS);   // r-period 1st EMA (absolute value)
   SetIndexBuffer(10,DEMA_AbsCMtmBuffer,INDICATOR_CALCULATIONS); // s-period 2nd EMA (absolute value)
   SetIndexBuffer(11,TEMA_AbsCMtmBuffer,INDICATOR_CALCULATIONS); // u-period 3rd EMA (absolute value)

2) O algoritmo para cálculo de cmtm e |cmtm|:

//--- calculation of Price1Buffer[] and Price2Buffer[]
   CalculatePriceBuffer(
                        AppliedPrice1,       // applied price [close]
                        rates_total,         // rates total
                        prev_calculated,     // number of bars, calculated at previous call
                        Open,High,Low,Close, // Open[], High[], Low[], Close[]
                        Price1Buffer         // target array
                       );
   CalculatePriceBuffer(AppliedPrice2,rates_total,prev_calculated,Open,High,Low,Close,Price2Buffer);
//--- calculation of cmtm and |cmtm|
   if(prev_calculated==0)      // at first call
     {
      pos=begin1;              // 
      for(i=0;i<pos;i++)       // 
        {
         CMtmBuffer[i]=0.0;    // zero values
         AbsCMtmBuffer[i]=0.0; //
        }
     }
   else pos=prev_calculated-1; // overwise calculate only last value
   // calculation of CMtmBuffer[] and AbsCMtmBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      CMtmBuffer[i]=Price1Buffer[i]-Price2Buffer[i-(q-1)];
      AbsCMtmBuffer[i]=MathAbs(CMtmBuffer[i]);
     }


4.3.2. O oscilador CSI ergódico

O oscilador CSI ergódico é definido como segue:

Ergodic_CSI(price1,pric2,q,r,s,u) = CSI(price1,pric2,q,r,s,u)
SignalLine(price1,pric2,q,r,s,u,ul) = EMA( Ergodic_CSI(price1,pric2,q,r,s,u) ,ul)

onde:

  • Ergodic_CSI() - Ergódica - índice de candlestick CSI(price1,price2,q,r,s,u);
  • SignalLine() - Linha de sinal - EMA (ul), aplicado à ergódica;
  • ul - um período EMA de uma linha de sinal - de acordo com William Blau, o valor ul deve ser igual ao período da última ergódica EMA significante (>1).


4.3.2.1. Ergodic_CSI(price1,pric2,q,r,s,u,ul) - oscilador CSI ergódico. Especificação

  • Nome do arquivo: Blau_Ergodic_CSI.mq5
  • Nome: O oscilador CSI ergódico (baseado no índice de candlestick), de acordo com William Blau.
  • Parâmetros de entrada:
    • graphic plot #0 - ergódica (índice de candlestick):
      • q - o período para o qual o momento de candlestick de período q é calculado (por padrão, q = 1);
      • r -período do primeiro EMA, aplicado ao momento de candlestick (por padrão, r = 20);
      • s - período do segundo EMA, aplicado ao resultado da primeira suavização (por padrão, s = 5);
      • u - período do terceiro EMA, aplicado ao resultado da segunda suavização (por padrão, u = 3);
    • graphic plot #1 - a linha de sinal:
      • ul - a linha de sinal EMA do período, é aplicada à ergódica (por padrão, ul = 3);
    • AppliedPrice1 - Tipo de preço [fechamento] (por padrão, AppliedPrice = PRICE_CLOSE).
    • AppliedPrice2 - Tipo de preço [abertura] (por padrão, AppliedPrice = PRICE_OPEN).
  • Adicionalmente:
    • Mostrado em uma janela separada;
    • alterar o estilo de renderização de cada plotagem gráfica - a cor, espessura, estilo de linha (a aba "Cores");
    • dois níveis (o padrão é -25 e +25) - adicionar e remover um nível; alterar o valor, a descrição do nível, alterar o estilo de renderização dos níveis (a aba "Níveis");
    • alterar os limites inferior (por padrão, -100) e superior (por padrão, 100) da escala da janela de indicador único (a aba "Escala").
  • Limitações:
    • q>0;
    • r>0, s>0, u>0. Se r, s, ou u forem iguais a 1, então no período do EMA correspondente, a suavização não será realizada;
    • ul > 0. Se ul = 1, então a linha de sinal coincide com a ergódica;
    • o tamanho mínimo do array de preços = (q-1 + r + s + u + ul-4 +1).


4.3.2.2. O código do Oscilador CSI ergódico


No exemplo do indicador Ergodic_CSI (price1, price2, r, s, u, ul):

1) A relação entre os arrays de indicador, buffers de indicador e plotagens gráficas:

//--- indicator buffers
   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);               // Ergodic
   // graphic plot #1
   SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);             // Signal Line: EMA(ul), applied to Ergodic
   // buffers, used for intermediate calculations
   SetIndexBuffer(2,Price1Buffer,INDICATOR_CALCULATIONS);     // price array [close]
   SetIndexBuffer(3,Price2Buffer,INDICATOR_CALCULATIONS);     // price arrya [open]
   SetIndexBuffer(4,LLBuffer,INDICATOR_CALCULATIONS);         // lowest prices (q bars)
   SetIndexBuffer(5,HHBuffer,INDICATOR_CALCULATIONS);         // highest prices (q bars)
   SetIndexBuffer(6,CMtmBuffer,INDICATOR_CALCULATIONS);       // q-period Candlestick Momentum
   SetIndexBuffer(7,EMA_CMtmBuffer,INDICATOR_CALCULATIONS);   // r-period 1st EMA
   SetIndexBuffer(8,DEMA_CMtmBuffer,INDICATOR_CALCULATIONS);  // s-period 2nd EMA
   SetIndexBuffer(9,TEMA_CMtmBuffer,INDICATOR_CALCULATIONS);  // u-period 3rd EMA
   SetIndexBuffer(10,HHLLBuffer,INDICATOR_CALCULATIONS);      // price range (q bars)
   SetIndexBuffer(11,EMA_HHLLBuffer,INDICATOR_CALCULATIONS);  // r-period 1st EMA (price range)
   SetIndexBuffer(12,DEMA_HHLLBuffer,INDICATOR_CALCULATIONS); // s-period 2nd EMA (price range)
   SetIndexBuffer(13,TEMA_HHLLBuffer,INDICATOR_CALCULATIONS); // u-period 3rd EMA (price range)

2) O algoritmo de cálculo do cmtm e a faixa de preço do período q:

//--- calculation of Price1Buffer[] and Price2Buffer[]
   CalculatePriceBuffer(
                        AppliedPrice1,       // price type [close]
                        rates_total,         // rates total
                        prev_calculated,     // number of bars, calculated at previous call
                        Open,High,Low,Close, // Open[], High[], Low[], Close[]
                        Price1Buffer         // target array
                       );
   CalculatePriceBuffer(AppliedPrice2,rates_total,prev_calculated,Open,High,Low,Close,Price2Buffer);
//--- calculation of cmtm and price range (q bars)
   if(prev_calculated==0)      // at first call
     {
      pos=begin1;              // 
      for(i=0;i<pos;i++)       // 
        {
         CMtmBuffer[i]=0.0;    // zero values
         HHLLBuffer[i]=0.0;    //
         LLBuffer[i]=0.0;      //
         HHBuffer[i]=0.0;      //
        }
     }
   else pos=prev_calculated-1; // overwise calculate only last value
   // calculation of CMtmBuffer[], HHLLBuffer[], LLBuffer[], HHBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      // CMtmBuffer[] - q-period Candlestick Momentum
      CMtmBuffer[i]=Price1Buffer[i]-Price2Buffer[i-(q-1)];
      // LLBuffer[] - search for the lowest price (q bars)
      // HHBuffer[] - search for the highest price (q bars)
      min=1000000.0;
      max=-1000000.0;
      for(k=i-(q-1);k<=i;k++)
        {
         if(min>Low[k])  min=Low[k];
         if(max<High[k]) max=High[k];
        }
      LLBuffer[i]=min;
      HHBuffer[i]=max;
      // HHLLBuffer[] - Price Range (q bars)
      HHLLBuffer[i]=HHBuffer[i]-LLBuffer[i];
     }

5. Tendência direcional

Os indicadores considerados (veja anexo):

  1. Blau_HLM.mq5- é um indicador do fechamento virtual (momento alto-baixo composto de período q; momento alto-baixo composto de período q suavizado);
  2. Blau_DTI.mq5- o índice de tendência direcional (momento alto-baixo composto de período q suavizado normalizado);
  3. Blau_Ergodic_DTI.mq5- oscilador DTI ergódico (baseado no índice de tendência direcional).

Fig. 5,1. Indicadores de índice de tendência direcional

Fig. 5,1. Indicadores de índice de tendência direcional

5,1. Momento alto-baixo composto

5.1.1. Definindo o momento de tendência ascendente e tendência descendente

Uma das definições da tendência. Se os valores dos preços máximos aumentam, então há uma tendência ascendente. Se os valores dos preços mínimos estão diminuindo, então há uma tendência descendente.

Um grupo de indicadores de momento, discutidos na seção 1, pode ser usado para calcular o momento para os preços máximos:

Mtm( price=High, q, r, s, u )
TSI( price=High, q, r, s, u )
Ergodic( price=High, q, r, s, u )

e para os preços mínimos:

Mtm( price=Low, q, r, s, u )
TSI( price=Low, q, r, s, u )
Ergodic( price=Low, q, r, s, u )

O momento de tendência ascendente ou Momento alto para cima (HMU) é a diferença positiva entre o preço máximo do período atual, e o preço máximo no início da faixa de preço do período q. O valor do momento do período q da tendência ascendente mostra uma velocidade relativa do crescimento do preço máximo para o período atual, comparado ao preço máximo no início das flutuações da faixa de preço do período q.

A fórmula para o momento de período q da tendência ascendente:

HMU(q) = High - High[q-1], if High - High[q-1] > 0
HMU(q) = 0, if High - High[q-1] <= 0

onde:

  • q - é o número dos períodos de tempo do gráfico de preço, envolvidos no cálculo do momento de tendência ascendente;
  • High - o preço máximo para o período atual;
  • High[q–1] - preço máximo (q-1) períodos atrás.

O momento de tendência descendente ou o Momento baixo para baixo (LMD) - é uma diferença positiva entre o preço mínimo do período atual e o preço mais baixo para o início das flutuações das faixas de preço do período q. O valor do momento do período q da tendência descendente mostra a velocidade relativa da diminuição do preço mínimo para o período atual, comparado ao preço mais baixo no início da faixa de preço do período q.

A fórmula do momento de tendência descendente de período q:

LMD(q) = -(Low - Low[q-1]), if Low - Low[q-1] < 0
LMD(q) = 0, if Low - Low[q-1] >= 0

onde:

  • q - é o número de períodos de tempo do gráfico de preço, usados no cálculo do momento de tendência descendente;
  • Low - o preço mínimo para o período atual;
  • Low[q-1] - o preço mínimo (q-1) períodos atrás.

Um momento alto-baixo composto (High-Low Momentum, HLM) - é a diferença entre o momento de período q da tendência ascendente e o momento de período q da tendência descendente. O sinal do momento alto-baixo composto indica a tendência de alterações de preço: um HLM positivo - uma tendência de aumento de preço (tendência ascendente), e um negativo - a tendência de diminuição de preço (tendência descendente).

Fórmula:

HLM(q) = HMU(q) - LMD(q)

onde:

  • q - o número de períodos de tempo do gráfico de preço, envolvidos no cálculo dos momentos de tendência ascendente e descendente;
  • HMU(q) - o momento de tendência ascendente para o período q;
  • LMD(q) - o momento de tendência descendente para o período q.

A fórmula do momento alto-baixo composto de período q suavizado (fechamento virtual):

HLM(q,r,s,u) = EMA(EMA(EMA( HLM(q) ,r),s),u) = EMA(EMA(EMA( HMU(q)-HMD(q) ,r),s),u)

onde:

  • q - o número de períodos de tempo do gráfico de preço, envolvidos no cálculo dos momentos de tendência ascendente e descendente;
  • HMU(q) - o momento de tendência ascendente para o período q;
  • LMD(q) - o momento de tendência descendente para o período q;
  • HLM(q) = HMU(q)-LMD(q) - o momento alto-baixo composto de período q;
  • EMA (HLM (q), r) - a primeira suavização - o EMA(r), aplicado ao momento alto-baixo composto de período q;
  • EMA (EMA(..., r),s) - a segunda suavização - o EMA(s), aplicado ao resultado da primeira suavização
  • EMA (EMA (EMA (..., r), s), u) - a terceira suavização - o EMA(u), aplicado ao resultado da segunda suavização.

A curva do gráfico da soma acumulada de momentos complexos para os máximos e mínimos é chamada de fechamento virtual.


5.1.2. HLM(q,r,s,u) - Indicador de fechamento virtual. Especificação
  • Nome do arquivo: Blau_HLM.mq5
  • Nome: Indicador de fechamento virtual (momento alto-baixo composto de período q; um momento alto-baixo composto de período q), de acordo com William Blau.
  • Parâmetros de entrada:
    • q - o período para o qual o HLM é calculado (por padrão, q = 2);
    • r -período do primeiro EMA, aplicado ao HLM (por padrão, r = 20);
    • s - período do segundo EMA, aplicado ao resultado da primeira suavização (por padrão, s = 5);
    • u - período do terceiro EMA, aplicado ao resultado da segunda suavização (por padrão, u = 3).
  • Adicionalmente:
    • Mostrado em uma janela separada;
    • altera a renderização da plotagem gráfica - a cor, espessura, estilo de linha (aba "Cores")
  • Limitações:
    • q>0;
    • r>0, s>0, u>0. Se r, s, ou u forem iguais a 1, então no período do EMA correspondente, a suavização não será realizada;
    • o tamanho mínimo do array de preços = (q-1 + r + s + u-3 +1).

5,2. índice de tendência direcional

5.2.1. A definição do índice de tendência direcional

O índice de tendência direcional (Directional Trend Index, DTI) - é um indicador de um momento alto-baixo composto de período q normalizado (HLM suavizado normalizado). Os valores do HLM são dados como uma porcentagem da escala (intervalo de exibição [-100, 100]).

Cada valor do HLM suavizado é normalizado pelo valor de um HLM suavizado, tomado como um valor absoluto. A normalização permite que o valor DTI seja interpretado como um grau de nível de mercado de sobrecompra (valor positivo) ou sobrevenda (valor negativo).

A fórmula do índice de tendência direcional:

               100 * EMA(EMA(EMA( HLM(q) ,r),s),u)          100 * HLM(q,r,s,u)
DTI(q,r,s,u) = –––––––––––––––––––––––––---––––––– = ––––––––––––––--–––––––––––––––
                 EMA(EMA(EMA( |HLM(q)| ,r),s),u)     EMA(EMA(EMA( |HLM(q)| ,r),s),u)
if EMA(EMA(EMA(|HLM(q)|,r),s),u)=0, then DTI(price,q,r,s,u)=0

onde:

  • q - o número de períodos de tempo do gráfico de preço, envolvidos no cálculo dos momentos de tendência ascendente e descendente;
  • HLM(q) = HMU(q)-LMD(q) - um momento de período q complexo para os máximos e mínimos.
  • |HLM(q)| - HLM(q) de valor absoluto;
  • HLM(q,r,s,u) - HLM(q) suavizado três vezes;
  • EMA (..., r) - a primeira suavização - o EMA(r), aplicado a:
    1) ao HLM(q)
    2) ao valor absoluto do HLM (q);
  • EMA (EMA(..., r),s) - a segunda suavização - o EMA(s), aplicado ao resultado da primeira suavização;
  • EMA (EMA (EMA (..., r), s), u) - a terceira suavização - o EMA(u), aplicado ao resultado da segunda suavização.
5.2.2. DTI(q,r,s,u) - índice de tendência direcional. Especificação
  • Nome do arquivo: Blau_DTI.mq5
  • Nome: índice de tendência direcional (momento alto-baixo composto de período q suavizado normalizado), de acordo com William Blau.
  • Parâmetros de entrada:
    • q - o período para o qual o HLM é calculado (por padrão, q = 2);
    • r -período do primeiro EMA, aplicado ao HLM (por padrão, r = 20);
    • s - período do segundo EMA, aplicado ao resultado da primeira suavização (por padrão, s = 5);
    • u - período do terceiro EMA, aplicado ao resultado da segunda suavização (por padrão, u = 3).
  • Adicionalmente:
    • Mostrado em uma janela separada;
    • altera o estilo de renderização da plotagem gráfica - a cor, espessura, estilo de linha (aba "Cores")
    • (opcional) dois níveis (o padrão é -25 e +25) - adicionar e remover um nível; alterar o valor, a descrição do nível, alterar o estilo de renderização dos níveis (a aba "Níveis");
    • alterar os limites inferior (por padrão, -100) e superior (por padrão, 100) da escala da janela de indicador único (a aba "Escala").
  • Limitações:
    • q>0;
    • r>0, s>0, u>0. Se r, s, ou u forem iguais a 1, então no período do EMA correspondente, a suavização não será realizada;
    • o tamanho mínimo do array de preços = (q-1 + r + s + u-3 +1).

5,3. O oscilador DTI ergódico

5.3.1. Definição do oscilador DTI ergódico:

Ergodic_DTI(q,r,s,u) = DTI(q,r,s,u)
SignalLine(q,r,s,u,ul) = EMA( Ergodic_DTI(q,r,s,u) ,ul)

onde:

  • Ergodic_DTI() - Ergódica - índice de tendência direcional DTI(q,r,s,u);
  • SignalLine() - Linha de sinal - uma média móvel exponencial do período ul, aplicada à ergódica;
  • ul - um período EMA de uma linha de sinal - de acordo com William Blau, o valor ul deve ser igual ao período da última ergódica EMA significante (>1).
5.3.2. Ergodic_DTI(q,r,s,u,ul) - Oscilador DTI ergódico. Especificação
  • Nome do arquivo: Blau_Ergodic_DTI.mq5
  • Nome: O oscilador DTI ergódico (baseado no índice de tendência direcional), de acordo com William Blau.
  • Parâmetros de entrada:
    • graphic plot #0 - ergódica (índice de tendência direcional):
      • q - o período para o qual o HLM é calculado (por padrão, q = 2);
      • r -período do primeiro EMA, em relação ao HLM (por padrão, r = 20);
      • s - período do segundo EMA, em relação aos resultados da primeira suavização (por padrão, s = 5);
      • u - período do terceiro EMA, em relação ao resultado da segunda suavização (por padrão, u = 3);
    • construção gráfica #1 - a linha de sinal:
      • ul - a linha de sinal EMA do período, é aplicada à ergódica (por padrão, ul = 3);
  • Adicionalmente:
    • Mostrado em uma janela separada;
    • alterar o estilo de renderização de cada plotagem gráfica - a cor, espessura, estilo de linha (a aba "Cores");
    • dois níveis (o padrão é -25 e +25) - adicionar e remover um nível; alterar o valor, a descrição do nível, alterar o estilo de renderização dos níveis (a aba "Níveis");
    • alterar os limites inferior (por padrão, -100) e superior (por padrão, 100) da escala da janela de indicador único (a aba "Escala").
  • Limitações:
    • q>0;
    • r>0, s>0, u>0. Se r, s, ou u forem iguais a 1, a suavização do EMA não é usada.
    • ul > 0. Se ul = 1, então a linha de sinal coincide com a ergódica;
    • o tamanho mínimo do array de preços = (q-1 + r + s + u + ul-4 +1).


5,4. O código dooscilador DTI ergódico

O indicador Ergodic_DTI (q,r,s,u,ul):

1) A ligação entre os arrays de indicador, buffers de indicador e plotagens gráficas:

//--- indicator buffers
   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);                 // Ergodic Line
   // graphic plot #1
   SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);               // Signal Line: EMA(ul), applied to Ergodic
   // buffers, used for intermediate calculations
   SetIndexBuffer(2,HMUBuffer,INDICATOR_CALCULATIONS);          // q-period Up Trend Momentum
   SetIndexBuffer(3,LMDBuffer,INDICATOR_CALCULATIONS);          // q-period Down Trend Momentum
   SetIndexBuffer(4,HLMBuffer,INDICATOR_CALCULATIONS);          // Composite q-period High/Low Momentum
   SetIndexBuffer(5,EMA_HLMBuffer,INDICATOR_CALCULATIONS);      // r-period 1st EMA
   SetIndexBuffer(6,DEMA_HLMBuffer,INDICATOR_CALCULATIONS);     // s-period 2nd EMA
   SetIndexBuffer(7,TEMA_HLMBuffer,INDICATOR_CALCULATIONS);     // u-period 3rd EMA
   SetIndexBuffer(8,AbsHLMBuffer,INDICATOR_CALCULATIONS);       // Composite q-period High/Low Momentum (absolute values)
   SetIndexBuffer(9,EMA_AbsHLMBuffer,INDICATOR_CALCULATIONS);   // r-period 1st EMA (absolute values)
   SetIndexBuffer(10,DEMA_AbsHLMBuffer,INDICATOR_CALCULATIONS); // s-period 2nd EMA (absolute values)
   SetIndexBuffer(11,TEMA_AbsHLMBuffer,INDICATOR_CALCULATIONS); // u-period 3rd EMA (absolute values)

2) O algoritmo de cálculo do HLM e |HLM|:

//--- calculation of HLM and |HLM|
   if(prev_calculated==0)      // at first call
     {
      pos=begin1;              // 
      for(i=0;i<pos;i++)       // 
        {
         HLMBuffer[i]=0.0;     // zero values
         AbsHLMBuffer[i]=0.0;  //
         HMUBuffer[i]=0.0;     //
         LMDBuffer[i]=0.0;     //
        }
     }
   else pos=prev_calculated-1; // overwise calculate only last value
   // calculation of HLMBuffer[], AbsHLMBuffer[], HMUBuffer[], LMDBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      HMUBuffer[i]=High[i]-High[i-(q-1)];    HMUBuffer[i]=(HMUBuffer[i]>0)?HMUBuffer[i]:0;
      LMDBuffer[i]=-1*(Low[i]-Low[i-(q-1)]); LMDBuffer[i]=(LMDBuffer[i]>0)?LMDBuffer[i]:0;
      HLMBuffer[i]=HMUBuffer[i]-LMDBuffer[i];
      AbsHLMBuffer[i]=MathAbs(HLMBuffer[i]);
     }

Conclusão

A primeira parte do artigo "sistemas de comércio e indicadores de William Blau em MQL5. Parte 1: Indicadores" fornece uma descrição dos indicadores e osciladores desenvolvidos em MQL5, a partir do livro "Momento, direção e divergência" de William Blau.

O uso destes indicadores e osciladores ao realizar decisões de comércio será descrito na segunda parte do artigo "Sistemas de comércio e indicadores de William Blau em MQL5. Parte 2: Sistemas de comércio".

O conteúdo do arquivo anexo deste artigo ("Blau_Indicators_MQL5_en.zip"):

Arquivo Descrição
O arquivo incluído. Local: "terminal_data_folder\MQL5\Include"
WilliamBlau.mqh
Indicadores. Local: "terminal_data_folder\MQL5\Indicators"
Indicadores, baseados no momento
Blau_Mtm.mq5 O indicador de momento (momento de período q, momento de período q suavizado)
Blau_TSI.mq5 O índice de força real (momento de período q suavizado normalizado)
Blau_Ergodic.mq5 Oscilador ergódico (baseado no índice de força real)
Indicadores, baseados na estocástica
Blau_TStoch.mq5 Estocástica (estocástica de período q, estocástica de período q suavizada)
Blau_TStochI.mq5 índice estocástico (estocástica de período q suavizado normalizado)
Blau_TS_Stochastic.mq5 Oscilador TS estocástico (baseado no índice estocástico)
Indicadores, baseados no momento estocástico
Blau_SM.mq5 Momento estocástico (momento estocástico de período q, momento estocástico de período q suavizado)
Blau_SMI.mq5 índice de momento estocástico (RSI de momento estocástico de q normalizado suavizado)
Blau_SM_Stochastic.mq5 Oscilador SM estocástico (baseado no índice de momento estocástico)
Indicadores, com base em um desvio da tendência de mercado.
Blau_MDI.mq5 Indicador de desvio médio (desvio médio, desvio médio suavizado)
Blau_Ergodic_MDI.mq5 Oscilador MDI ergódico (com base no indicador de desvio médio)
Indicadores, com base na convergência/divergência da média móvel
Blau_MACD.mq5 Indicador de convergência/divergência das médias móveis (MACD; MACD suavizado)
Blau_Ergodic_MACD.mq5 Oscilador MACD ergódico (baseado no indicador MACD)
Indicadores, baseados no momento de candlestick
Blau_CMtm.mq5 O indicador de momento de candlestick (momento de candlestick de período q, momento de candlestick de período q suavizado)
Blau_CMI.mq5 índice do momento de candlestick (momento de candlestick de período q suavizado normalizado; normalização pelo valor absoluto do momento de candlestick de período q)
Blau_CSI.mq5 índice de candlestick (momento de candlestick de período q suavizado normalizado; normalização pelo comprimento do candlestick de período q)
Blau_Ergodic_CMI.mq5 Oscilador CMI ergódico (baseado no índice de momento de candlestick)
Blau_Ergodic_CSI.mq5 Oscilador CSI ergódico (baseado no índice de candlestick)
Indicadores, baseados no momento composto
Blau_HLM.mq5 Indicador do fechamento virtual (momento alto-baixo composto de período q; momento alto-baixo composto de período q suavizado);
Blau_DTI.mq5 índice de tendência direcional (momento alto-baixo composto de período q suavizado normalizado)
Blau_Ergodic_DTI.mq5 Oscilador DTI ergódico (baseado no índice de tendência direcional)

Traduzido do russo pela MetaQuotes Ltd.
Artigo original: https://www.mql5.com/ru/articles/190

Arquivos anexados |
Construindo um Expert Advisor de arrastar e soltar semiautomático interativo com base no risco predefinido e proporção R/R Construindo um Expert Advisor de arrastar e soltar semiautomático interativo com base no risco predefinido e proporção R/R
Alguns operadores executam todas suas negociações automaticamente, e alguns misturam negociações automáticas e manuais, com base na saída de diversos indicadores. Sendo um membro do último grupo, precisei de uma ferramenta interativa para avaliar risco dinamicamente e obter níveis de preço diretamente do gráfico. Este artigo apresentará uma maneira de implementar um Expert Advisor interativo semiautomático, com risco de equidade predefinido e proporção R/R. O risco do Expert Advisor, R/R e parâmetros de tamanho de lote podem ser alterados durante o tempo de execução no painel do EA.
Construindo um Analisador de Espectro Construindo um Analisador de Espectro
Este artigo é destinado a familiarizar seus leitores com uma possível variável de uso de objetos gráficos da linguagem MQL5. Ele analisa um indicador que implementa um painel de gerenciamento de um simples analisador de espectro usando objetos gráficos. O artigo é destinado para leitores familiarizados com o básico do MQL5.
Desenhando e implementando novos widgets GUI com base no objeto CChartObject Desenhando e implementando novos widgets GUI com base no objeto CChartObject
Depois que escrevi um artigo anterior sobre um Expert Advisor semiautomático com interface GUI, descobri que seria desejável aprimorar a interface com algumas novas funcionalidades para Expert Advisors e indicadores mais complexos. Após familiarizar-me com as classes da Biblioteca Padrão do MQL5, implementei novos widgets. Este artigo descreve um processo de planejamento e implementação de novos widgets GUI MQL5 que podem ser usados em indicadores e Expert Advisors. Os widgets apresentados no artigo são CChartObjectSpinner, CChartObjectProgressBar e CChartObjectEditTable.
Série de preço médio para cálculos intermediários sem utilizar buffers adicionais Série de preço médio para cálculos intermediários sem utilizar buffers adicionais
Este artigo é sobre algorítimos tradicionais e incomuns de média comprimidos em classes de tipo único e simples. Eles são destinados à utilização universal em quase todos os desenvolvimentos de indicadores. Espero que as classes sugeridas sejam uma boa alternativa para chamadas 'volumosas' e indicadores personalizados e técnicos.