English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Türkçe
Indicatori e Sistemi di Trading di William Blau in MQL5. Parte 1: Indicatori

Indicatori e Sistemi di Trading di William Blau in MQL5. Parte 1: Indicatori

MetaTrader 5Sistemi di trading | 16 dicembre 2021, 11:29
391 0
Andrey F. Zelinsky
Andrey F. Zelinsky

Il trading tecnico può essere sfruttato solo se sono disponibili buoni strumenti.
Gli strumenti di un buon trader sono l'esperienza, il giudizio e una gerarchia matematica fornita da un buon programma per computer di trading.
William Blau

Introduzione

La prima parte dell'articolo "Indicatori e Sistemi di Trading in MQL5 di William Blau. Parte 1: Indicatori " è una descrizione di indicatori e oscillatori, descritta da William Blau nel libro "Momentum, Direction, and Divergence".

Gli indicatori e gli oscillatori, descritti in questo articolo, sono presentati come codici sorgente in linguaggio MQL5 e allegati nel file di archivio "Blau_Indicators_MQL5_en.zip".

L'idea chiave dell'analisi di William Blau

L'analisi tecnica di William Blau si compone di quattro fasi:

  1. Utilizzando i dati delle serie di prezzi (barre q) l'indicatore viene calcolato e tracciato sul grafico. L'indicatore non riflette l'andamento generale del movimento dei prezzi e non consente di determinare i punti di inversione di tendenza.
  2. L'indicatore viene smussato più volte utilizzando il metodo EMA: la prima volta (con il periodo r), la seconda volta (con il periodo s) e la terza volta (con il periodo u); viene tracciato un indicatore smussato. Un indicatore smussato in modo abbastanza accurato e riproduce le fluttuazioni dei prezzi con un ritardo minimo. Permette di determinare l'andamento del movimento dei prezzi e dei punti di inversione ed elimina il rumore del prezzo.
  3. L'indicatore smussato viene normalizzato, viene tracciato un indicatore normalizzato e smussato. La normalizzazione consente di interpretare il valore dell'indicatore come gli stati di ipercomprato o ipervenduto del mercato.
  4. Un indicatore normalizzato e smussato viene smussato una volta con il metodo EMA (periodo ul); viene costruito un oscillatore: vengono aggiunti l'istogramma dell'indicatore e la linea del segnale, i livelli di ipercomprato e ipervenduto del mercato. L'oscillatore ci consente di distinguere gli stati di ipercomprato/ipervenduto del mercato, i punti di riverenza e la fine di un trend.

Indicatori

L'articolo descrive i seguenti gruppi di indicatori:

  1. Indicatori, basati sul Momentum:
  2. Indicatori, basati su Stochastic:
  3. Indicatori, basati sul Momentum Stocastico:
  4. Indicatori, basati su una Deviazione Media dalle tendenze del mercato:
  5. Indicatori basati sulla convergenza/divergenza della Media Mobile:
  6. Indicatori, basati sul Candlestick Momentum:
  7. Indicatori, basati su un Momentum composito alto-basso:

Per ciascun gruppo di indicatori vengono presentati i seguenti elementi:

  • Indice dell’indicatore smussato;
  • L'indice dell'indicatore normalizzato e smussato;
  • L'oscillatore, basato sull'indice dell'indice normalizzato smussato.

La sezione True Strength Index contiene:

  • Un'analisi dettagliata dell'approccio di William Blau sotto l'aspetto dell'analisi tecnica del grafico dei prezzi;
  • Una descrizione dettagliata dell'algoritmo e del codice di ciascun indicatore dei gruppi di indicatori basati su Momentum.

Come metodo di smoothing William Blau utilizza ils (EMA) della media mobile esponenzialmente smussata. La Media Mobile Esponenziale viene calcolata aggiungendo al valore precedente della Media Mobile, una certa percentuale del prezzo corrente.

Quando si utilizza l'EMA, gli ultimi prezzi hanno un peso maggiore.

La funzione di calcolo dell'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))

dove:

  • EMA(k,n) - media mobile esponenzialmente smussata del periodo n per il momento del periodo k;
  • price(k) - il prezzo al momento del periodo k.

La descrizione dei quattro tipi di medie mobili e dei metodi del loro utilizzo nell'analisi tecnica (vedi anche iMA)si trova nella "Guida di MetaTrader 5" ("Analytics/TechnicalIndicators/Trend Indicators/Moving Average").

La Libreria delle Funzioni

La libreria di funzioni per il calcolo delle medie mobili si trova nel "MovingAverages.mqh". Ci occupiamo di ExponentialMAOnBuffer(), che riempie il buffer dell'array di output[] con i valori EMA del prezzo dell'array di input[]. Tuttavia, l'implementazione di ExponentialMAOnBuffer() presentata in "MovingAverages.mqh" ha lo svantaggio che non funziona con il periodo n = 1.

Vedi nel codice sorgente:

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

Tuttavia, William Blau nel suo libro usa il periodo di smoothing n = 1 come assenza di smoothing.

Pertanto, il codice della funzione ExponentialMAOnBuffer() ha subito alcune modifiche:

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

e otteniamo l'ExponentialMAOnBufferWB(). Il codice di questa funzione si trova nel file "WilliamBlau.mqh".

Il file "WilliamBlau.mqh" ha anche le seguenti funzioni:

  • La funzione PriceName() restituisce il tipo di prezzo come stringa:
string PriceName(
                 const int applied_price // price type
                )
  • La funzione CalculatePriceBuffer() calcola la matrice dei prezzi di questo tipo di prezzo:
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
                        )

Il tipo di prezzo applicato e il timeframe del grafico dei prezzi

William Blau considera i prezzi di chiusura del timeframe Giornaliero. Gli indicatori, sviluppati in questo articolo, consentono di scegliere il tipo di prezzo (vedi costanti di prezzo) il timeframe del grafico dei prezzi dipende dal timeframe dell'indicatore (vedi timeframe del grafico).

 

1. Il True Strength Index

Gli indicatori considerati (vedi allegato):

  1. Blau_Mtm.mq5 - Indicatore del tasso (Q-period Momentum; q-period Momentum smussato);
  2. Blau_TSI.mq5 - True strengths Index (q-period Momentum normalizzato e smussato);
  3. Blau_Ergodic.mq5 - Oscillatore ergodico (basato sul True Strength Index).

1.1. Momentum

La descrizione dell'indicatore tecnico integrato Momentum, e il suo utilizzo nell'analisi tecnica può essere trovata nella sezione "Analytics / Indicatori tecnici / Oscillatori / Momentum" (vedi anche iMomentum ). In contrasto con il Momentum standard (iMomentum) il Momentum di William Blau calcola il Momentum come la variazione assoluta del prezzo.

Un esempio dell'implementazione MQL5 del True Strength Indicator (TSI) di William Blau è presentato nell'articolo "MQL5: Crea il Tuo Indicatore”.


1.1.1. Analisi tecnica utilizzando l'indicatore Momentum

L'oggetto dell'analisi tecnica è il grafico dei prezzi dello strumento finanziario. Ogni elemento del grafico è una barra dei prezzi. La barra dei prezzi ha le seguenti caratteristiche: tempo di apertura, prezzo di apertura, prezzo massimo, prezzo minimo, prezzo di chiusura, volumi di trading e altro. La barra dei prezzi è formata e riflette il comportamento dei prezzi durante uno specifico e discreto periodo di tempo (timeframe del grafico).

Il compito dell'analisi tecnica del grafico dei prezzi è determinare l'attuale tendenza del movimento dei prezzi, rivelare i picchi e i bassi dei prezzi e prevedere la direzione della variazione dei prezzi nel prossimo periodo di tempo. La complessità di questo, è che il prezzo, pur muovendosi entro i limiti della sua tendenza di base, fa fluttuazioni multidirezionali creando un cosiddetto rumore di prezzo.

Quello che William Blau ha proposto. La prima differenza: il Momentum. William Blau ha calcolato il Momentum come relativo alla variazione di prezzo [chiusura] per ogni [giorno] periodo di tempo; e ha creato l'indicatore Momentum. Da un punto di vista matematico la funzione Momentum è la prima derivata del prezzo.

Fig. 1.1. Indicatore di Momentum (q-period Momentum)

Fig. 1.1. Indicatore di Momentum (q-period Momentum)

Il Momentum visualizza le fluttuazioni dei prezzi del periodo di un giorno mostra la velocità (entità) e la direzione delle variazioni di prezzo in questo periodo, ma non riflette l'andamento generale del movimento dei prezzi e non determina i punti di inversione di tendenza.

La seconda differenza è lo smoothing. La media mobile del Momentum (la somma cumulativa delle fluttuazioni giornaliere dei prezzi) riproduce quasi esattamente sia le variazioni principali che locali dei prezzi della curva. La Fig. 1.2 (a) nelle sottofinestre I, II presenta il Momentum smussato (medie mobili con periodi 20 e 300, rispettivamente).

Più alto è il periodo della Media Mobile, più accuratamente il Momentum levigato approssima (riproduce) le fluttuazioni della curva dei prezzi. Da un punto di vista matematico la funzione di smussare il Momentum è la funzione integrale del momentum, o la funzione ripristinata del prezzo.

Fig. 1.2 (a). Momentum Indicator (momentum q-period smussato)

Fig. 1.2 (a). Indicatore di momentum (momentum q-period smussato)


Fig. 1.2 (b). Momentum Indicator (momentum q-period smussato)

Fig. 1.2 (b). Indicatore di momentum (momentum q-period smussato)


In Fig. 1.2 (a), nella finestra principale, sono presentati gli indicatori smussati dall'EMA (con periodi di 5, 20, 100). Un leggero aumento del periodo della media mobile porta a un ritardo e la media mobile diventa praticamente incapace di riprodurre le fluttuazioni della curva dei prezzi.

La terza differenza è il resmoothing. Il primo smoothing del Momentum definisce l'andamento principale del movimento dei prezzi, così come i punti di inversione, ma non elimina il rumore. Per eliminare il rumore dei prezzi è necessario un re-smoothing con un piccolo periodo della media mobile.

Fig. 1.2 (b), nella sottofinestra I presenta l'indicatore Momentum smussato (media mobile con periodo 20), le sottofinestre II e III presentano il Momentum doppio e triplo smussato (periodi di media mobile di 5, 3). Una levigatura ripetuta elimina il rumore del prezzo, ma aggiunge un leggero spostamento della curva (un ritardo).

La quarta differenza: la differenza in un segnale di tendenze mutevoli. Lo smoothing del Momentum con un piccolo periodo di media può portare a una divergenza del Momentum smussato con l'andamento della curva dei prezzi.

In Fig. 1.2 (a), la discrepanza è osservata nella sottofinestra I, e in Fig. 1.2 (b) - nelle sottofinestre I, II, III (la direzione delle variazioni di prezzo diverge dalla direzione del cambiamento nel Momentum smussato). Tali differenze spesso indicano un cambiamento di tendenza. Da un punto di vista matematico la divergenza è una funzione del periodo di smoothing.

L'affidabilità dell'interpretazione di queste differenze come segnale di cambiamento delle tendenze può essere migliorata se consideriamo la divergenza solo per le aree di ipercomprato o ipervenduto (vedi п. 1.2.1).


1.1.2. Definizione del Momentum

Il Momentum è una variazione di prezzo relativa.

Il segno del Momentum mostra la direzione della variazione del prezzo: un Momentum positivo - il prezzo è aumentato nel periodo, un negativo - il prezzo è diminuito nel corso del periodo. Il magnitudo del Momentum - è la velocità relativa della variazione di prezzo (primo derivato del prezzo).

Fig. 1.3. Definizione del Momentum

Fig. 1.3. Definizione del Momentum

Formula del Momentum:

mtm(price) = price - price[1]

dove:

  • prezzo - prezzo [chiusura] del periodo corrente;
  • prezzo [1] - prezzo di [chiusura] del periodo precedente.

William Blau esamina il momentum come la differenza tra il prezzo di [chiusura] del periodo corrente e il prezzo di [chiusura] del periodo precedente. William Blau, nel suo calcolo di un singolo periodo momentum, utilizza i prezzi di due periodi (il periodo corrente e il periodo precedente).

Introduciamo nella formula per il calcolo del momento un indicatore di periodo, q - è il numero di periodi di tempo coinvolti nel calcolo (Di William Blau q = 2).

Formula del Momentum del periodo q:

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

dove:

  • q - numero di barre, utilizzato nel calcolo della quantità di moto;
  • prezzo - prezzo [chiusura] del periodo corrente;
  • prezzo [q-1] - prezzo di [chiusura] (q-1) periodi fa.

Nella formula risultante, il nostro Momentum a due periodi corrisponde al relativo periodo Momentum di William Blau.

Formula di un momentum q-period smussato:

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

dove:

  • prezzo - prezzo di [chiusura] - la base di prezzo del grafico dei prezzi;
  • q - numero di barre, utilizzato nel calcolo del Momentum;
  • mtm(price,q)=price-price[q-1] - q-period Momentum;
  • EMA (mtm (prezzo, q), r) - il primo smoothing - l'EMA(r), applicato al Momentum q-period;
  • EMA (EMA(..., r),s) - il secondo smoothing- l'EMA(e), applicato al risultato del 1o smoothing;
  • EMA (EMA (EMA (..., r), s), u) - il terzo smoothing - l'EMA(u), applicato al risultato del 2o smoothing.

1.1.3. Mtm(price,q,r,s,u) - indicatore del tasso (momentum). Specifiche
  • Nome del File: Blau_Mtm.mq5
  • Il nome: Momentum (q-period Momentum; q-period Momentum smussato) di William Blau.
  • Parametri di Input:
    • q - il periodo per il quale viene calcolato il Momentum (default q = 2);
    • r -period dell'EMA 1-st, applicato al Momentum (default r = 20);
    • s - periodo del 2 ° EMA, applicato al risultato del 1 ° smoothing (di default s = 5);
    • u - periodo del 3 ° EMA, applicato al risultato del 2 ° smoothing (per impostazione predefinita, u = 3);
    • AppliedPrice - tipo di prezzo (default AppliedPrice=PRICE_CLOSE).
  • Inoltre:
    • visualizzato in una finestra separata;
    • modifiche del rendering del plotting grafico - il colore, lo spessore, lo stile della linea (la scheda "Colori").
  • Limitazioni:
    • q>0;
    • r>0, s>0, u>0. Se r, s o u sono uguali a 1, lo smoothing EMA non viene utilizzato. Ad esempio, se imposti Mtm (prezzo, 2,20,5,1), otteniamo un momentum doppio smussato, ma se imposti Mtm (prezzo, 2,1,1,1), otteniamo un momentum non smussato;
    • la dimensione minima dell’array dei prezzi = (q-1 + r + s + u-3 +1).

 

1.2. Il True Strengths Index

1.2.1. Analisi tecnica utilizzando il True Strength Index

Continua: Vedere l'inizio nella Sezione 1.1.1.

Il quinto: normalizzazione. Portare attraverso la normalizzazione dei valori del Momentum smussato su una singola scala (mappatura all'intervallo [-1, +1]), ci consente di determinare gli stati di ipercomprato o ipervenduto del mercato. Moltiplicazione ripetuta dei valoridel momento levigato normalizzato un fattore di 100 converte le serie numeriche nell'intervallo percentuale (mappando all'intervallo [-100, 100]).

Fig. 1.4. Quantità di moto levigata normalizzata

Fig. 1.4. Momentum Smussato Normalizzato


Una discrepanza come segnale di tendenze mutevoli può essere considerata affidabile se il momentum normalizzato è nello stato di ipercomprato o ipervenduto.


1.2.2. La definizione del True Strength Index

Il True Strength Index (True Strength Index, TSI) - è un indicatore del Momentum normalizzato (Momentum normalizzato q-period). Portare i valori del ​Momentum smussato ad una singola scala (mappatura all'intervallo [-1, +1]) è fornito con la normalizzazione di ogni valore del Momentum smussato (la somma cumulativa delle fluttuazioni di prezzo del q-period smussato) per il valore del Momentum smussato, preso in valore assoluto.

La moltiplicazione per un coefficiente di 100 modifica l'intervallo del display in [-100, +100] (percentuale). La normalizzazione consente di interpretare il valore della STI come un livello di ipercomprato (positivo) o ipervenduto (negativo).

La formula del True Strength Index:

                     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

dove:

  • prezzo - prezzo di [chiusura] - la base di prezzo del grafico dei prezzi;
  • q - periodo del Momentum;
  • mtm(price,q)=price-price[q-1] - q-period momentum;
  • | Mtm (prezzo, q) | - il valore assoluto del Momentum q-period;
  • Mtm (prezzo, q, r, s, u) - q-period Momentum smussato tre volte
  • EMA (..., r) - il primo smoothing - l'EMA del periodo r, applicato a:
    1) Momentum q-period;
    2) valore assoluto del Momentum q-period;
  • EMA (EMA(..., r),s) - il secondo smoothing- l'EMA(e), applicato al risultato del 1o smoothing;
  • EMA (EMA (EMA (..., r), s), u) - il terzo smoothing - EMA(u), applicato al risultato del 2o smoothing.

1.2.3. TSI(price,q,r,s,u) - il True Strength Index. Specifiche
  • Nome del File: Blau_TSI.mq5
  • Il nome: Il True Strength Index (q-period relative Momentum normalizzato smussato ) di William Blau.
  • Parametri di Input:
    • q - il periodo per il quale viene calcolato il momento (default q = 2);
    • r -period dell'EMA 1-st, applicato al Momentum (default r = 20);
    • s - periodo del 2 ° EMA, applicato al risultato del 1 ° smoothing (di default s = 5);
    • u - periodo del 3 ° EMA, applicato al risultato del 2 ° smoothing (per impostazione predefinita, u = 3);
    • AppliedPrice - tipo di prezzo (default AppliedPrice=PRICE_CLOSE).
  • Inoltre:
    • visualizzato in una finestra separata;
    • modificare lo stile di rendering del plotting grafico - il colore, lo spessore, lo stile della linea (la scheda "Colori");
    • (facoltativo) a due livelli (il valore predefinito è -25 e +25) - aggiungere/rimuovere un livello; modificare il valore, la descrizione del livello, modificare lo stile di rendering dei livelli (la scheda "Livelli");
    • modificare i limiti inferiore (per impostazione predefinita -100) e superiore (per impostazione predefinita 100) della scala della finestra del singolo indicatore (la scheda "Scala").
  • Limitazioni:
    • q>0;
    • r>0, s>0, u>0. Se r, s o u sono uguali a 1, nel corrispondente periodo EMA, lo smoothing non verrà eseguito;
    • la dimensione minima dell’array dei prezzi = (q-1 + r + s + u-3 +1).

 

1.3. Oscillatore ergodico

1.3.1. Analisi tecnica con l'oscillatore ergodico

Continua: Vedi l'inizio in Sec. 1.1.1, 1.2.1.

Sesto: le aree di un mercato ipercomprato e ipervenduto. Intervallo unitario [-1, +1] o un intervallo percentuale [-100.100], entro il quale si verificano cambiamenti nei valori ​del momentum normalizzato smussato, consente di definire le aree di mercato ipercomprato o ipervenduto.

La classe di indici di analisi tecnica, che caratterizzano lo stato di ipercomprato o ipervenduto del mercato, è chiamata oscillatore. Per ogni oscillatore, i livelli sono determinati, all'approccio a cui vengono ricevuti i segnali di un mercato ipercomprato o ipervenduto. Gli oscillatori sono inefficaci sui mercati di tendenza, in quanto il mercato può trovarsi in condizioni di ipercomprato / ipervenduto per un periodo arbitrariamente lungo.

Settimo: Linea di Segnale. Per ottenere un segnale sulla fine di una tendenza e una tendenza di inversione di un movimento di prezzo, viene utilizzata una linea di segnale. Il segnale da acquistare viene ricevuto quando la linea principale attraversa la linea del segnale dal basso verso l'alto. Il segnale da vendere viene ricevuto quando la linea principale attraversa la linea del segnale dall'alto verso il basso. Nel caso in cui ci sia una linea principale - questa è un ergodico (true strength index), quindi una re-smoothing dell'ergodico forma una linea di segnale. La procedura di ri-levigatura è uguale all'ultimo processo di smoothing ergodico.

Ottavo: l'andamento del movimento dei prezzi. La tendenza del movimento dei prezzi è verso l'alto (tendenza al rialzo), quando la linea principale (ergodica) passa sopra la linea del segnale. La tendenza del movimento dei prezzi è verso il basso (tendenza al ribasso), quando la linea principale (ergodica) passa sotto la linea del segnale.

Fig. 1.5. Oscillatore Ergodico

Fig. 1.5. Oscillatore Ergodico


1.3.2. Definizione dell'Oscillatore Ergodico

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)

dove:

  • Ergodic() - ergodico - True Strength Index STI(price,q,r,s,u);
  • Il SignalLine() -una linea di segnale - l'EMA(ul), applicato all'ergodico;
  • ul - un periodo EMA di una linea di segnale - secondo William Blau, il valore ul deve essere uguale al periodo dell'ultimo significativo (>1) dell'ergodico EMA. Ad esempio, se si utilizza un doppi smoothing Ergodic (prezzo, q, r, s, u) = Ergodic (prezzo, 2,20,5,1), quindi da William Blau ul = s = 5.

1.3.3. Ergodico (prezzo, q,r,s,u,ul) - oscillatore ergodico. Specifiche
  • Nome del File: Blau_Ergodic.mq5
  • Nome: Oscillatore Ergodico (basato su un vero indice di forza) di William Blau.
  • Parametri di Input:
    • grafico #0 - Ergodico (il true strength index):
      • q - il periodo per il quale viene calcolato il momento (default q = 2);
      • r -period dell'EMA 1-st, applicato al Momentum (default r = 20);
      • s - periodo del 2 ° EMA, applicato al risultato del 1 ° smoothing (di default s = 5);
      • u - periodo del 3 ° EMA, applicato al risultato del 2 ° smoothing (per impostazione predefinita, u = 3);
    • plot del grafico #1 - la linea del segnale:
      • ul - punto linea di segnale EMA, viene applicato all'ergodico (di default ul = 3);
    • AppliedPrice - tipo di prezzo (default AppliedPrice=PRICE_CLOSE).
  • Inoltre:
    • visualizzato in una finestra separata;
    • modificare lo stile di rendering di ciascun grafico : il colore, lo spessore, lo stile della linea (la scheda "Colori");
    • due livelli (per impostazione predefinita -25 e +25) - aggiungi / rimuovi un livello, cambia il valore, la descrizione del livello, cambia lo stile di rendering dei livelli (la scheda "Livelli");
    • modificare i limiti inferiori (per impostazione predefinita -100) e superiori (per impostazione predefinita 100) della scala della finestra del singolo indicatore (la scheda "Scala").
  • Limitazioni:
    • q>0;
    • r>0, s>0, u>0. Se r, s o u sono uguali a 1, lo smoothing EMA non viene utilizzato;
    • ul>0. Se ul = 1, allora la Linea del Segnale e le linee Ergodiche sono le stesse;
    • la dimensione minima dell'array di prezzi = (q-1 + r + s + u + ul-4 +1).

1.4. Il Codice (descrizione dettagliata)

1.4.1. "Blau_Mtm.mq5" - indicator Mtm(price,q,r,s,u) - momentum

Il codice dell'indicatore 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);
  }
//+------------------------------------------------------------------+

Consideriamo il codice in dettaglio.


1.4.1.1. Impostazioni indicatore Mtm (prezzo,q,r,s,u)

Letteratura

Cosa leggere sulle impostazioni dell'indicatore nel MQL5 Reference:

  1. Sezione "Indicatori personalizzati".
  2. La relazione tra le proprietà dell'indicatore e le funzioni corrispondenti (vedere "Indicatori Personalizzati").
  3. Proprietà dei programmi (proprietà #) (vedere "Nozioni di Base sulla Lingua/Preprocessore").
  4. Stili di rendering (proprietà del plotting grafico) (vedere la sezione "Costanti standard, enumerazioni e strutture /costanti indicatore").
  5. Proprietà degli indicatori personalizzati (vedere la sezione "Costanti standard, enumerazioni e strutture / costanti di indicatore").
Copyright. Descrizione dell'indicatore
#property copyright "Copyright 2011, MetaQuotes Software Corp." // copyright
#property link      "https://www.mql5.com"                       // url
#property description "q-period Momentum (William Blau)"        // description

Impostazioni solo tramite la direttiva del preprocessore #property. Il сopyright (parametri copyright e link), versione (la versionedel parametro ) e una descrizione del programma mql5 (descrizionedel parametro ) sono visualizzati nelle "Proprietà" della finestra dell'indicatore (la scheda "Proprietà", casella "Aggiuntivo").

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

Il preprocessore sostituisce la riga #Include <WilliamBlau.mqh> con il contenuto del file "WilliamBlau.mqh". Le parentesi angolari indicano che il file "WilliamBlau.mqh" verrà prelevato dalla cartella dei dati del terminale. Per ulteriori informazioni, vedere Inclusione di file.

Sul contenuto del file "WilliamBlau.mqh" vedi l'introduzione.

Impostazioni dell'indicatore (in generale)

L'indicatore personalizzato - è pochi plot di grafici. Il grafico dell'indicatore può essere visualizzato nella finestra principale del grafico dei prezzi o in una finestra separata. Ogni grafico ha un determinato metodo di disegno, colore, stile e spessore.

I dati per il rendering del grafico sono presi dai buffer degli indicatori (ogni grafico corrisponde da uno a cinque buffer di indicatori). Utilizziamo un array di indicatori come buffer di indicatori.

Per impostare l'indicatore, è necessario (vedi Fig. 1.6):

  1. Specificare la finestra per la visualizzazione degli indicatori.
  2. Specificate il numero di grafici.
  3. Non ci sono limiti per il numero di buffer di indicatori.
  4. Dichiarazione degli array di indicatori.
  5. Impostare un collegamento: array di indicatori -> buffer di indicatori -> plot del grafico.
  6. Descrivere le proprietà di ogni grafico.
  7. Specificare la precisione di visualizzazione dei valori dell'indicatore.
  8. Specificare per ogni costruzione grafica, il numero di barre iniziali senza il rendering del plotting grafico.
  9. Impostare i livelli orizzontali e descrivere le proprietà di ciascun livello orizzontale (non presente).
  10. Impostare le restrizioni di scala per la finestra dell'indicatore separata (non presente.)
  11. Specificare il nome breve dell'indicatore.

Fig. 1.6. Indicatore di Momentum Mtm (prezzo,q,r,s,u)

Fig. 1.6. Indicatore di Momentum Mtm (prezzo, q, r, s, u)


Le impostazioni dell'indicatore vengono eseguite:

Per avere più informazioni su questo vedi Collegamento tra Proprietà Indicatore e Funzioni Corrispondenti

La differenza nei metodi di impostazione dell'indicatore è che le impostazioni attraverso la direttiva #property sono disponibili prima che l'indicatore sia allegato al grafico dei prezzi, mentre le impostazioni attraverso funzioni speciali sono disponibili dopo che l'indicatore è stato allegato al grafico dei prezzi. La configurazione delle impostazioni viene eseguita dalla finestra "Proprietà" dell'indicatore.

Le impostazioni: una finestra per la visualizzazione dell'indicatore (1)
#property indicator_separate_window     // indicator in a separate window

La configurazione è obbligatoria ed è possibile solo attraverso la direttiva del preprocessore #property. Ci sono due opzioni di visualizzazione degli indicatori:

  1. Nella finestra principale del grafico dei prezzi - indicator_chart_window;
  2. In una finestra separata - indicator_separate_window.
Impostazioni: Numero di buffer (3) e plot di grafici (2)
#property indicator_buffers 5           // number of buffers used
#property indicator_plots   1           // number of plots

La configurazione è obbligatoria ed è possibile solo attraverso la direttiva #property preprocessore. Il numero di buffer di indicatori (parametro indicator_buffers) e il numero di grafici (parametro indicator_plots) non è limitato.

Impostazioni: Array di Indicatori (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

Gli array degli indicatori sono dichiarate a livello globale come unidimensionali matrici dinamiche di tipo doppio.

Impostazioni: Impostazione del collegamento (5) tra gli array di indicatori, i buffer di indicatori e i grafici.
// 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

Il codice è scritto nella funzione OnInit() dell’handler eventi Init().

Il collegamento del buffer dell'indicatore con l’array unidimensionale corrispondente viene impostato con la funzione 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
   );

Il buffer dell'indicatore è un array dinamic o unidimensionale di doppio tipo, la cui dimensione è controllata dal terminale client, in modo che corrisponda sempre al numero di barre su cui viene calcolato l'indicatore. L'indicizzazione delle riserve di indicatori inizia da 0.

Un buffer di indicatori può memorizzare tre tipi di dati: INDICATOR_DATA ,INDICATOR_COLOR_INDEX, INDICATOR_CALCULATIONS. Ogni grafico, a seconda del metodo di visualizzazione, può essere corrisposto da uno a cinque buffer indicatore: da uno a quattro valori del buffer dell'indicatore (tipo di dati INDICATOR_DATA) e un buffer di colore (tipo di dati INDICATOR_COLOR_INDEX.)

I buffer di indicatori con i dati di tipo INDICATOR_CALCULATIONS sono progettati per calcoli intermedi. Dopo l'associazione, l'array di indicatori avrà un'indicizzazione proprio come negli array convenzionali (vedere di seguito nella Sezione 1.4.1.2).

Impostazioni: Proprietà dei plot grafici (6)

Per la configurazione di ogni set di grafici, vengono specificati i seguenti elementi:

  1. Etichetta;
  2. Tipo di disegno (vedere tutti i 18 tipi nell'enumerazione ENUM_DRAW_TYPE);
  3. Colore della riga
  4. Stile riga (vedere i possibili stili enumerati in ENUM_LINE_STYLE);
  5. Larghezza della riga

Esistono due modi possibili per configurare:

1) Attraverso la direttiva preprocessore #property (implementata in questo modo):

//--- 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) Utilizzando un gruppo di funzioni delle impostazioni delle proprietà del plot grafico 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

Il codice viene scritto nella funzione OnInit() dell’handler degli eventi Init. Specifica della funzione 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
   );

Per perfezionare la visualizzazione del tipo di grafico selezionato, utilizziamo gli ID proprietà del plotting grafico, elencati nell'enumerazione ENUM_PLOT_PROPERTY.

L'indicizzazione dei grafici inizia da 0. Per quanto riguarda la preferibilità della configurazione tramite una direttiva #property vedi sopra nella sezione "Preferenze Indicatore". Alcune proprietà dei grafici (il colore, lo stile, la larghezza della linea) sono disponibili per la modifica dalla finestra "Proprietà" (la scheda "Colori") dell'indicatore.

Impostazioni: La precisione della visualizzazione dei valori dell'indicatore ​​(7)
//--- precision
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);

Il codice viene scritto nella funzione OnInit() dell’handler degli eventiInit. La specifica della funzione di configurazione delle impostazioni dell'indicatore IndicatorSet * ():

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

Identificatori di proprietà indicatori sono elencati nell'enumerazione ENUM_CUSTOMIND_PROPERTY.

La precisione della visualizzazione dei valori dell'indicatore è data solo dalla funzione IndicatorSetInteger(), l'ID delle proprietà dell'indicatore INDICATOR_DIGITS, e l’enumerazione ENUM_CUSTOMIND_PROPERTY_INTEGER.

In un esempio in cui i valoridei buffer dell'indicatore, che hanno lo scopo di renderizzare, sotto il display: accanto al nome breve dell'indicatore, in un messaggio pop-up, quando il puntatore del mouse è posizionato sopra la linea dell'indicatore - verrà arrotondato a _Digits - numero di cifre dopo il punto decimale nel prezzo dello strumento, a cui è collegato l'indicatore.

Impostazioni: Numero di barre iniziali senza il rendering (8)

I dati per il rendering del Momentum q-period di William Blau si formano in quattro fasi:

Fase 1. Sulla base dei dati dell’array dei prezzi PriceBuffer[], viene calcolato il Momentum (il periodo q). I valori ​del periodo q Momentum sono collocati nell’array MtmBuffer[]. Poiché l'indicizzazione dell’array dei prezzi inizia da 0, anche i dati significativi nell'array dei prezzi iniziano dall'indice 0, quindi i dati significativi nell'array MtmBuffer[] iniziano con l'indice (q-1).

Fase 2. I dati significativi nell'array MtmBuffer[] sono smussati (periodo di smoothing r). I valori ​del periodo q smussato Momentum sono collocati nell’array EMA_MtmBuffer[]. Poiché l'indicizzazione dell'array MtmBuffer[] inizia da 0, i dati significativi nell'array MtmBuffer[] iniziano con l'indice (q-1), quindi i dati significativi nell'array EMA_MtmBuffer[] iniziano con l'indice (q-1) + (r-1).

La 3 ° e 4 ° fase. Considerazioni simili sono date per determinare da quale barra iniziano i dati significativi nell’array DEMA_MtmBuffer[] (periodo di smoothing s) e nell'array MainBuffer[] (periodo di smoothing u). Vedi Fig. 1.7.

Fig. 1.7. I dati significativi dell'indicatore Mtm (prezzo,q,r,s,u)

Fig. 1.7. I dati significativi dell'indicatore Mtm (price,q,r,s,u)


A livello globale le variabili sono dichiarate:

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

I valori ​delle variabili - è l'indice della barra, da cui iniziano i dati significativi, nel corrispondente array di indicatori variabili. I valori delle variabili ​sono calcolati nella funzione OnInit() dell’handler di eventi Init, e verranno utilizzati nella funzione OnCalculate() dell’handler di eventi 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);

Il numero di barre iniziali senza la visualizzazione al grafico viene specificato utilizzando la funzione PlotIndexSetInteger(), l'identificatore della proprietà dell'indicatore PLOT_DRAW_BEGIN enumerazioni ENUM_PLOT_PROPERTY_INTEGER.

Configurazione: Nome breve dell'indicatore (11)
//--- short indicator name
   string shortname=PriceName(AppliedPrice)+","+string(q)+","+string(r)+","+string(s)+","+string(u);
   IndicatorSetString(INDICATOR_SHORTNAME,"Blau_Mtm("+shortname+")");

Il codice viene scritto nella funzione OnInit() dell’handler degli eventi Init. Il nome breve dell'indicatore viene specificato solo utilizzando la funzione IndicatorSetString(),identificatore delle proprietà dell'indicatore INDICATOR_SHORTNAME (ENUM_CUSTOMIND_PROPERTY_STRING enumeration). La funzione PriceName () restituisce il nome del tipo di prezzo, a seconda del valore del parametro di input AppliedPrice. Il codice della funzione PriceName ()  si trova nel file "WilliamBlau.mqh" (vedi Introduzione).

Parametri di Input
//--- 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

Per ulteriori informazioni, vedere variabili di input. I parametri di input sono disponibili per la modifica dalla finestra "Proprietà" (la scheda "Input") dell'indicatore.


1.4.1.2. Il calcolo dell'indicatore Mtm (prezzo,q,r,s,u)

Calcolo: L'algoritmo

L'algoritmo per il calcolo dell'indicatore Mtm(prezzo,q,r,s,u):

  1. Controlla se ci sono dati sufficienti per calcolare l'indicatore.
  2. Il calcolo dell'array dei prezzi in base al tipo di prezzo specificato - formazione dell'array PriceBuffer[]
  3. La determinazione della barra dell'indice, da cui iniziare/continuare il calcolo del Momentum q-period.
  4. Il calcolo del momento del periodo q - il riempimento dell'array MtmBuffer[].
  5. Il primo smoothing con il metodo EMA (periodo r) - il riempimento dell'array EMA_MtmBuffer[].
  6. Il secondo smoothing con il metodo EMA (periodo s) - il riempimento dell’array DEMA_MtmBuffer[].
  7. Il terzo smoothing con il metodo EMA (periodo u) - il riempimento dell'array MainBuffer[] - il calcolo dei valori ​per il rendering del plot grafico #0.
Calcolo: La funzione OnCalculate()

Il calcolo dei valori degli indicatori ​viene eseguito nella funzione OnCalculate()dell’handler di eventi Calculate. Usiamo la seconda forma di chiamata alla funzione 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);
  }

L'argomento rates_total  è il numero di barre del grafico dei prezzi che vengono renderizzate e sono disponibili all'indicatore per l'elaborazione. Il prev_calculated - è il numero di barre del grafico dei prezzi che sono state elaborate dall'indicatore al momento dell'inizio della chiamata alla funzione corrente OnCalculate().

La funzione OnCalculate() restituisce il numero di barre del grafico dei prezzi che sono state elaborate dall'indicatore al momento della fine della chiamata corrente. Questa funzione restituisce il parametro OnCalculate() e deve essere costruita in modo tale che alla prima chiamata vengano elaborate tutte le barre non elaborate del grafico dei prezzi.

Cioè, se alla prima chiamata della funzione OnCalculate(), il parametro prev_calculated è uguale a 0, quindi alla seconda chiamata, il parametro prev_calculated è uguale a rates_totalo rates_total +1, e a partire dalla seconda chiamata, la funzione OnCalculate() gestisce (conta) solo l'ultima barra. Per ulteriori chiarimenti con un esempio, vedere qui.

I buffer degli indicatori e gli array Time[], Open[], High[], Low[], Close[], TickVolume[], Volume[] e Spread[] hanno una direzione predefinita di indicizzazione da sinistra a destra, dall'inizio alla fine dell'array, dai dati più vecchi a quelli più recenti. L'indice del primo elemento è uguale a 0. La dimensione del buffer dell'indicatore è controllata dal terminale client, in modo che corrisponda sempre al numero di barre su cui viene calcolato l'indicatore.

Calcolo: Verificare se ci sono dati sufficienti per calcolare l'indicatore (1)
//--- check rates
   if(rates_total<rates_total_min) return(0);

La variabile globale rates_total_min  è la dimensione minima delle timeserie di input dell'indicatore, calcolata nella funzione OnInit() dell’handler di eventiInit.

   rates_total_min=begin4+1; // minimum size of the input timeseries of the indicator
Calcolo: I prezzi degli array 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
                       );

Per riempire l’array dei prezzi PriceBuffer[], viene utilizzata la funzione CalculatePriceBuffer(). Il codice della funzione CalculatePriceBuffer()  si trova nel file "WilliamBlau.mqh" (vedi introduzione). Il tipo di prezzo è specificato nel parametro di input AppliedPrice.

Calcolo: La definizione dell'indice a barre, da cui iniziare/continuare il calcolo del Momentum q-period (3)

La variabile locale pos è l'indice della barra, da cui l'indicatore verrà calcolato sulla chiamata corrente della funzione OnCalculate(). Combiniamo il calcolo della variabile pos  con la fase di preparazione dell'array MtmBuffer[] al calcolo (la fase di azzeramento degli elementi insignificanti dell'array MtmBuffer[]).

Calcolo: q-period Momentum (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)];

Il Momentum q-period è calcolato come differenza tra il periodo corrente PriceBuffer[i] e il prezzo (q-1) dei periodi precedenti PriceBuffer[i-(q-1)].

Calcolo: smoothing con il metodo 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);

La funzione ExponentialMAOnBuffer() è descritta nell'introduzione. Sull'esempio del calcolo del periodo r in movimento 1st EMA: la funzione ExponentialMAOnBuffer() riempie l'array di output EMA_MtmBuffer[] con i valori dell’EMA (r) dell'array di input MtmBuffer[]; con dati insignificanti fino all'indice (inizio1-1) inclusi, sono riempiti con valori zero.

 

1.4.2. "Blau_TSI.mq5" - indicatore STI(prezzo,q,r,s,u) - il true strength index

Il codice dell'indicatore STI (prezzo,q,r,s,u) (è costruito sulla base di modifiche e aggiunte al codice "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);
  }
//+------------------------------------------------------------------+

Consideriamo nel dettaglio solo le modifiche e le aggiunte al codice "Blau_Mtm.mq5".

1.4.2.1. Le configurazioni dell'indicatore STI (prezzo,q,r s,u) (modifiche e aggiunte al codice "Blau_Mtm.mq5")

Impostazioni dell'indicatore (in generale)

Le configurazioni della STI indicatore (prezzo,q,r,s,u) differiscono dalle configurazioni dell'indicatore Mtm(prezzo,q,r,s,u) (cfr. fig. 1.8):

  1. Specificare la finestra per la visualizzazione degli indicatori (nessuna modifica)
  2. Specificare il numero di strutture grafiche (nessuna modifica)
  3. Specificare il numero di buffer di indicatori (il numero di buffer è aumentato.)
  4. Dichiarazione degli array di indicatori(aggiunte agli array).
  5. Assegnare gli array/buffer/plot: l'indicatore array -> indicatore buffer -> plot grafico(ristrutturazione.)
  6. Descrivere le proprietà di ogni grafico(l'etichetta è stata modificata)
  7. Specificare l'accuratezza della visualizzazione dei valori dell'indicatore ​(precisione modificata)
  8. Specificare, per ogni grafico, il numero di barre iniziali senza mostrarle sul plot grafico (nessuna modifica)
  9. Impostare i livelli orizzontali e descrivere le proprietà di ogni livello orizzontale (nuovo)
  10. Impostare i limiti per la scala della finestra dell'indicatore separato (nuovo)
  11. Specificare il nome breve dell'indicatore (nome modificato.)

Fig. 1.8. Indicatore STI (prezzo,q,r,s,u) True Strength Index

Fig. 1.8. Indicatore STI (prezzo,q,r,s,u) True Strength Index


Configurazioni (modifiche)

Nel codice "Blau_Mtm.mq5" vengono apportate le seguenti piccole modifiche.

1. La breve descrizione del programma mql5 è cambiata:

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

2. (nella configurazione 6) Il numero di grafici non è aumentato, il metodo di disegno (DRAW_LINE - linea), il colore della riga (blu), lo stile della riga (STYLE_SOLID - riga continua) e la larghezza della riga (1) sono rimasti invariati, ma l'etichetta per il grafico #0 è cambiata:

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

3. (nella configurazione 7) La precisione della visualizzazione dei valori dell'indicatore viene modificata:

   IndicatorSetInteger(INDICATOR_DIGITS,2);

4. (nella configurazione 11) il nome breve dell'indicatore viene modificato:

   IndicatorSetString(INDICATOR_SHORTNAME,"Blau_TSI("+shortname+")");
Configurazioni: livelli orizzontali (9)

Per configurare i livelli orizzontali, è necessario specificare quanto segue per ogni livello:

  1. Valore sull'asse verticale;
  2. Descrizione del livello (facoltativo). I livelli orizzontali hanno un unico stile di rendering:
    1. Colore per la visualizzazione della linea; 
    2. Stile linea (vedere i possibili stili enumerati in ENUM_LINE_STYLE);
    3. Spessore della riga.

Esistono due modi possibili per configurare:

1) Utilizzo della direttiva preprocessore #property (Implementato in questo modo).

//--- 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) Utilizzando il gruppo delle funzioni 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"

Il codice viene scritto nella funzione OnInit() dell’handler degli eventi Init. L'indicizzazione dei livelli orizzontali parte da 0. Per perfezionare la visualizzazione del livello orizzontale, vengono utilizzati gli identificatori delle proprietà dell'indice INDICATOR_LEVEL*, elencati nell'enumerazione ENUM_CUSTOMIND_PROPERTY.

La descrizione di ogni livello viene impostata solo utilizzando la funzione IndicatorSetString(), l'identificatore della proprietà dell'indicatore INDICATOR_LEVELTEXT (enumerazione ENUM_CUSTOMIND_PROPERTY_STRING ). La descrizione del livello è posizionata direttamente sopra il livello, a sinistra. 

È possibile aggiungere/rimuovere livelli orizzontali, modificare i valori, la descrizione di ciascun livello e lo stile di rendering del livello dalla finestra "Proprietà" (la scheda "Livelli") dell'indicatore.

Configurazioni: Limiti della scala della finestra dell'indicatore separata (10)

Esistono due modi possibili per configurare:

1) Utilizzo della direttiva preprocessore #property (Implementato in questo modo).

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

2) Utilizzando la funzione IndicatorSetDouble(), gli identificatori delle proprietà degli indicatori INDICATOR_MINIMUM e INDICATOR_MAXIMUM  (enumerazione ENUM_CUSTOMIND_PROPERTY_DOUBLE ).

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

Il codice viene scritto nella funzione OnInit() dell’handler degli eventi Init. I limiti inferiore e superiore della scala di una finestra di indicatore separata sono disponibili per la modifica dalla finestra "Proprietà" (la scheda "Scala") dell'indicatore.

Configurazioni (modifiche): I buffer dell’indicatore (3-5)

Le modifiche nella configurazione "indicator array -> indicator buffer -> graphic plot":

1. (nella configurazione 3) Il numero di buffer è aumentato:

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

2. (nella configurazione 4) Aggiunti array di indicatori necessari per calcolare il valore assoluto del momentum del periodo 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)

lo scopo dell'array MainBuffer[] viene modificato:

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

3. (nella configurazione 5) La connessione di "indicator array -> indicator buffer -> graphic plot" viene modificata:

   // 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. Il calcolo dell'indicatore STI (prezzo,q,r,s,u) (modifiche e aggiunte al codice "Blau_Mtm.mq5")

Calcolo: L'algoritmo

L'algoritmo per il calcolo dell'indicatore STI (prezzo,q,r,s,u):

  1. Controlla se ci sono dati sufficienti per calcolare l'indicatore.
  2. Il calcolo dell'array di prezzi in base al tipo di prezzo specificato - formazione dell'array PriceBuffer[].
  3. La determinazione della barra dell'indice, da cui iniziare/continuare il calcolo del Momentum q-period.
  4. Il calcolo del momentum del periodo q e il suo valore assoluto - il riempimento degli array MtmBuffer[] e AbsMtmBuffer[].
  5. Il primo smoothing con il metodo EMA (periodo r) - il riempimento di EMA_MtmBuffer [] e EMA_AbsMtmBuffer [] array.
  6. Il secondo smoothing con il metodo EMA (periodo s) - il riempimento di DEMA_MtmBuffer [] e DEMA_AbsMtmBuffer [] array.
  7. Il terzo metodo di smoothing con il metodo EMA (periodo u) - il riempimento di TEMA_MtmBuffer [] e TEMA_AbsMtmBuffer [] array.
  8. La determinazione della barra dell'indice, da cui iniziare/continuare il calcolo del true strength index.
  9. Il calcolo del vero indice di resistenza - il riempimento dell'array MainBuffer[] - il calcolo dei valori ​per il plot grafico #0.

L'essenza dei cambiamenti nell'algoritmo (brevemente):

  • a) (vedi paragrafo 4-7) parallelamente al calcolo del momento del periodo q (gruppo di array * MtmtBuffer[]) viene eseguito il calcolo del valore assoluto del Momentum q-period (*AbsMtmBuffer[] gruppo di array);
  • b) (cfr. sezione 8-9) è aggiunto il calcolo della STI.
Calcolo: il q-period Momentum il suo valore assoluto (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);

Calcolo: Il True Strength Index (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) - Ergodic Oscillator

Il codice dell'indicatore Ergodic (price,q,r,s,u,ul) si basa sulle modifiche del codice di "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);
  }
//+------------------------------------------------------------------+

Consideriamo nel dettaglio solo le modifiche e le aggiunte al codice "Blau_TSI.mq5".

1.4.3.1. Configurazioni dell'indicatore Ergodic (prezzo,q,r,s,u,ul) (modifiche e aggiunte al codice "Blau_TSI.mq5")

Impostazioni dell'indicatore (in generale)

Le configurazioni dell'indicatore Ergodic (prezzo,q,r,s,u,ul) differiscono dalle configurazioni della STI indicatore (prezzo,q,r,s,u) (Cfr. fig. 1.9):

  1. Specificare la finestra per la visualizzazione degli indicatori (nessuna modifica)
  2. Specificare il numero di grafici (viene aggiunto un grafico)
  3. Specificare il numero di buffer indicatori (il numero di buffer è aumentato)
  4. Dichiarazione degli array di indicatori (aggiunte all’array)
  5. Impostare una relazione: l’array di indicatori -> indicatore buffer -> plot grafico (ristrutturazione.)
  6. Descrivi le proprietà di ogni plot grafico (proprietà modificate, viene aggiunto un grafico).
  7. Specificare la precisione di visualizzazione dei valori dell'indicatore ​(nessuna modifica.)
  8. Specificare per ogni struttura grafica il numero di barre iniziali senza la visualizzazione al plot grafico (aggiunto un plot grafico.)
  9. Impostare i livelli orizzontali e descrivere le proprietà di ciascun livello orizzontale (nessuna modifica).
  10. Impostare il limite della scala separata della finestra dell'indicatore (nessuna modifica).
  11. Specificare il nome breve dell'indicatore (nome modificato.)

Fig. 1.9. Indicatore ergodico (prezzo,q,r,s,u,ul)

Fig. 1.9. Indicatore ergodico (prezzo,q,r,s,u,ul)


Configurazioni (modifiche)

Il codice "Blau_TSI.mq5" è stato modificato nei seguenti modi.

1. La breve descrizione del programma mql5 è cambiata:

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

2. È stato aggiunto un parametro di input:

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

3. (nella configurazione 11) viene apportata una modifica al nome breve dell'indicatore:

//--- short indicator name
   string shortname=PriceName(AppliedPrice)+","+string(q)+","+string(r)+","+string(s)+","+string(u)+","+string(ul);
   IndicatorSetString(INDICATOR_SHORTNAME,"Blau_Ergodic("+shortname+")");
Configurazioni (modifiche): Plot grafici (2, 6)

1. (nella configurazione 2) Aggiunto un altro grafico (Signal Line):

#property indicator_plots   2              // indicator plots

2. (nella configurazione 6) a) Modificate le proprietà del primo grafico #0 "Ergodic".

In precedenza, come modo per visualizzare la linea, usavamo (l’identificatore DRAW_LINE), ora usiamo un istogramma dalla linea zero (DRAW_HISTOGRAM dell'enumerazione ENUM_DRAW_TYPE)

Modificato il colore per la visualizzazione delle righe e della larghezza delle righe:

//--- 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) Aggiunto un grafico #1 "Signal" (Signal Line):

//--- 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
Configurazioni (modifiche): I buffer dell’indicatore (3-5)

Le modifiche nella configurazione "indicator array -> indicator buffer -> struttura grafica":

1. (nella configurazione 3) Il numero di buffer è aumentato:

#property indicator_buffers 11             // number of buffers

2. (nella configurazione 4) Aggiunto un array di indicatori, necessario per calcolare e rendere i valori della linea di segnale:

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

3. (nella configurazione 5) La relazione "indicator array -> indicator buffer -> graphical structure" viene modificata:

//--- 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)
Impostazioni: Numero di barre iniziali senza il rendering (8)
  • Il numero di barre iniziali senza il rendering della trama grafica #0 "Ergodic" non è cambiato. Il metodo di calcolo è stabilito nella Sezione 1.4.1.1.
  • I metodi di calcolo del numero di barre iniziali senza il rendering del plot grafico #1 "Segnale" sono gli stessi. L'array SignalBuffer[] è il risultato dello smoothing dei dati significativi dell'array MainBuffer[] (il periodo di smoothing ul).

Poiché l'indicizzazione dell'array MainBuffer[] inizia da 0 e i dati significativi nell'array MainBuffer[] iniziano con l'indice (q-1)+(r-1)+(s-1)+(u-1), i dati significativi nell'array SignalBuffer[] iniziano con l'indice (q-1)+(r-1)+(s-1)+(u-1)+(ul-1).

La variabile globale begin5 viene dichiarata:

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

Calcolo (completo, vedere anche paragrafo 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. Il calcolo dell'indicatore ergodico (prezzo,q,r,s,u,ul) (modifiche e aggiunte al codice "Blau_TSI.mq5")

Calcolo: L'algoritmo

L'algoritmo per il calcolo dell'indicatore Ergodic (prezzo,q,r,s,ul):

  1. Controlla se ci sono dati sufficienti per calcolare l'indicatore.
  2. Il calcolo dell'array di prezzi in base al tipo di prezzo specificato - riempimento dell'array PriceBuffer[].
  3. La determinazione della barra dell'indice, da cui iniziare/continuare il calcolo del Momentum q-period.
  4. Il calcolo del momento del periodo q e il suo valore assoluto - il riempimento di array MtmBuffer[] e AbsMtmBuffer[].
  5. Il primo smoothing con il metodo EMA (periodo r) - il riempimento di EMA_MtmBuffer [] e EMA_AbsMtmBuffer [] array.
  6. Il secondo smoothing con il metodo EMA (periodo s) - il riempimento di DEMA_MtmBuffer [] e DEMA_AbsMtmBuffer [] array.
  7. Il terzo metodo di smoothing con il metodo EMA (periodo u) - il riempimento di TEMA_MtmBuffer [] e TEMA_AbsMtmBuffer [] array.
  8. La determinazione della barra dell'indice, da cui iniziare/continuare il calcolo del True Strength Index.
  9. Il calcolo dell'Ergodico (True Strength Index) - il riempimento dell'array MainBuffer[] - il calcolo dei valori ​per il rendering del plot grafico #0.
  10. Il calcolo della linea del segnale - lo smoothing dell'Ergodico con il metodo EMA (periodo ul) - il riempimento dell'array SignalBuffer[] - il calcolo dei valori per il rendering del grafico #1.

L'essenza delle modifiche nell'algoritmo (brevemente) a) (vedi sezione 1) il requisito per la dimensione minima della serie di tempi di input dell'indicatore è cambiato; b) (vedi paragrafo 10) il calcolo della Linea di Segnale è cambiato.

Calcolo (modifica): Verificare se ci sono dati sufficienti per calcolare l'indicatore (1)

Non ci sono cambiamenti nell'algoritmo:

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

I valori della variabile globale rates_total_min è stato calcolato (la dimensione minima della setta di tempi di input dell'indicatore; calcolata nella funzione OnInit() all'evento di inizializzazione):

   rates_total_min=begin5+1; // the minimum size of the input timeseries of the indicator
Calcolo: linea di segnale (10)
//--- calculation of Signal Line (graphic plot #1)
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin4,ul,MainBuffer,SignalBuffer);

2. Momentum Stocastico

Gli indicatori considerati (vedi allegato) sono divisi in due gruppi.

I. Indicatori, basati sullo Stocastico:

  1. Blau_TStoch.mq5 - Stocastico (q-period Stochastic; q-period Stochastic smussato);
  2. Blau_TStochI.mq5 - Indice Stocastico (Stocastico q-periodo normalizzato smussato);
  3. Blau_TS_Stochastic.mq5 - Oscillatore stocastico TS (basato sull'indice dello Stocastico).

II. Indicatori, basati sul Momentum Stocastico:

  1. Blau_SM.mq5 - Momentum Stocastico (Q-period Stochastic Momentum; q-period Stochastic Momentum smussato);
  2. Blau_SMI.mq5 - Stochastic Momentum Index (Momentum q-period normalizzato smussato);
  3. Blau_SM_Stochastic.mq5 - Oscillatore stocastico SM (basato sull'indice Stocastico Momentum).


2.1. Indicatori basati sullo Stocastico

La "Guida per l'utente al terminale client MetaTrader", nella sezione Analysis/Technical Indicators/Oscillators/Stochastic Oscillator" fornisce una descrizione del terminale client integrato MetaTrader 5 degli indicatori tecnici dell'oscillatore stocastico e delle modalità del suo utilizzo nell'analisi tecnica (vedi anche iStochastic.)

 

2.1.1. Oscillatore Stocastico di George Lane

Stocastico, oscilliatore stocastico (Stochastic, Stochastic Oscillator) - è un indicatore, che mostra il prezzo, in relazione alla fluttuazione del prezzo per i precedenti periodi q. L'autore e divulgatore dell'indicatore è George Lane.

Distinguere:

  • Stocastico Veloce, a volte chiamato %K;
  • Stocastico Lento (Linea di Segnale), a volte chiamato %D.

La formula di Stochastic di GeorgeLane:

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

dove:

  • % K - Stocastico Veloce;
  • % D - Stocastico Lento (Linea del Segnale);
  • prezzo - prezzo [chiusura] del periodo corrente;
  • q - il numero di periodi di tempo del grafico dei prezzi utilizzato nel calcolo dello Stocastico;
  • HH (q) - il valore massimo per i precedenti periodi q dei prezzi più alti per il periodo q;
  • LL (q) - il valore minimo per i precedenti periodi q del prezzo più basso per il periodo q;
  • SMA (% K, ul) - la media mobile semplice di ordine ul, applicata allo stocastico veloce (% K).

Secondo l'interpretazione di George Lane, l'idea di base è che durante la tendenza di un aumento dei prezzi (tendenza al rialzo), il prezzo tende a fermarsi, vicino ai massimi precedenti. Con la tendenza alla diminuzione dei prezzi (tendenza al ribasso), il prezzo tende a fermarsi, vicino ai minimi precedenti.

 

2.1.2. L'Oscillatore Stocastico di William Blau


Fig. 2.1. Gli indicatori di William Blau, basati sullo Stocastico

Fig. 2.1. Gli indicatori di William Blau, basati sullo Stocastico

 

2.1.2.1. Stocastico


Stocastico - è la distanza dal prezzo [chiusura] del periodo corrente al punto più basso della gamma di fluttuazioni dei prezzi, per i precedenti periodi q. Il valore dello stocastico q-period mostradi quanto il prezzo viene spostato, rispetto al punto più basso dell'intervallo q-period delle fluttuazioni dei prezzi. I valori ​del periodo q Stocastico sono positivi o uguali a zero.

Fig. 2.2. Definizione dello Stocastico

Fig. 2.2. Definizione dello Stocastico

La formula dello Stocastico del periodo q:

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

dove:

  • prezzo - prezzo [chiusura] del periodo corrente;
  • q - il numero di periodi di tempo del grafico dei prezzi, coinvolti nel calcolo dello stocastico;
  • LL (q) - il valore minimo, per i periodi q precedenti, del prezzo più basso per il periodo q.

La formula dello Stocastico q-period smussato:

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

dove:

  • prezzo - prezzo di [chiusura] - la base di prezzo del grafico dei prezzi;
  • q - le barre numeriche, utilizzate nel calcolo dello Stocastico;
  • stoch(price,q)=price-LL(q) - Stocastico q-period;
  • EMA (stoch (prezzo,q),r) - primo smoothing - EMA del periodo r, applicata allo stocastico del periodo q;
  • EMA (EMA(..., r),s) - il secondo smoothing - EMA del periodo s, applicata al risultato del 1° smoothing;
  • EMA (EMA (EMA (..., r), s), u) - il terzo smoothing - EMA del periodo u, applicato al risultato del 2 ° smoothing.

TStoch(price,q,r,s,u) - Stocastico. Specifiche

  • Nome del File: Blau_TStoch.mq5
  • Nome: Indicatore Stocastico (q-periodo stocastico; q-periodo levigato stocastico), secondo William Blau.
  • Parametri di Input:
    • q - periodo, per il quale viene calcolato lo stocastico (per impostazione predefinita q = 5);
    • r -periodo della 1a EMA, applicata allo Stocastico (di default r = 20);
    • s - periodo del 2 ° EMA, applicato al risultato del 1 ° smoothing (di default s = 5);
    • u - periodo del 3 ° EMA, applicato al risultato del 2 ° smoothing (per impostazione predefinita, u = 3);
    • AppliedPrice - tipo di prezzo (default AppliedPrice=PRICE_CLOSE).
  • Inoltre:
    • visualizzato in una finestra separata;
    • modifiche del rendering del plotting grafico - il colore, lo spessore, lo stile della linea (la scheda "Colori").
  • Limitazioni:
    • q>0;
    • r>0, s>0, u>0. Se r, s o u sono uguali a 1, lo smoothing EMA non viene utilizzato;
    • la dimensione minima dell’array dei prezzi = (q-1 + r + s + u-3 +1).

 

2.1.2.2. L’Indice Stocastico

L'indicatore dell'Indice Stocastico è lo stocastico normalizzato del periodo q smussato.

I valoridello stocastico del q-periodo smussato sono mappati in un formato percentuale (l'intervallo [0, 100]). Ogni valore dello stocastico q-period smussato è normalizzato dal valore della fascia di prezzo q-period. La normalizzazione permette di interpretare il valore dello stocastico q-period normalizzato smussato come il grado degli stati di ipercomprato/ipervenduto del mercato.

La formula dell'Indice Stocastico:

                         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

dove:

  • prezzo - prezzo di [chiusura] - la base di prezzo del grafico dei prezzi;
  • q - le barre numeriche, utilizzate nel calcolo dello Stocastico;
  • LL (q) - il valore minimo del prezzo più basso per il periodo q;
  • HH (q) - il valore massimo del prezzo più alto per il periodo q;
  • stoch(q)=price-LL(q) - q-period Stochastic;
  • TStoch(price,q,r,s,u) - q-period stocastico smussato tre volte;
  • HH(q)-LL(q) - Fascia di Prezzo q-period;
  • EMA (..., r) - il primo smoothing - l'EMA(r), applicato a:
    1. Stocastico del periodo q;
    2. alla Fascia di Prezzo del periodo q;
  • EMA (EMA(..., r),s) - il secondo smoothing- l'EMA(e), applicato al risultato del 1o smoothing;
  • EMA (EMA (EMA (..., r), s), u) - il terzo smoothing - EMA(u), applicato al risultato del 2o smoothing.

TStochI(price,q,r,s,u) - Indice Stocastico. Specifiche

  • Nome del File: Blau_TStochI.mq5
  • Nome: Indice Stocastico (stocastico q-period normalizzato smussato), secondo William Blau.
  • Parametri di Input:
    • q - periodo, per il quale viene calcolato lo stocastico (per impostazione predefinita q = 5);
    • r -periodo della 1a EMA, applicata allo Stocastico (di default r = 20);
    • s - periodo del 2 ° EMA, applicato al risultato del 1 ° smoothing (di default s = 5);
    • u - periodo del 3 ° EMA, applicato al risultato del 2 ° smoothing (per impostazione predefinita, u = 3);
    • AppliedPrice - tipo di prezzo (default AppliedPrice=PRICE_CLOSE).
  • Inoltre:
    • visualizzato in una finestra separata;
    • modificare lo stile di rendering del plot grafico - il colore, lo spessore, lo stile della linea (la scheda "Colori");
    • (opzionale) Due livelli (per impostazione predefinita 40 e 60) - aggiungere/rimuovere un livello; modificare il valore e la descrizione del livello, modificare lo stile del rendering dei livelli (la scheda "Livelli");
    • modificare i limiti inferiore (per impostazione predefinita 0) e superiore (per impostazione predefinita 100) della scala della finestra dell'indicatore separata (la scheda "Scala").
  • Limitazioni:
    • q>0;
    • r>0, s>0, u>0. Se r, s o u sono uguali a 1, nel corrispondente periodo EMA, lo smoothing non verrà eseguito;
    • la dimensione minima dell’array dei prezzi = (q-1 + r + s + u-3 +1).

 

2.1.2.3. Oscillatore Stocastico

La definizione dell'Oscillatore Stocastico:

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)

dove:

  • TS_Stochastic() - Stocastico Veloce, %k - Indice Stocastico TStochI(price,q,r,s,u);
  • SignalLine() - Slow Stochastic (Signal Line),% d - EMA del periodo ul, applicato allo Stocastico Veloce (% k);
  • ul - linea di segnale EMA periodo - secondo William Blau, il valore ul deve essere uguale al periodo dell'ultimo significativo (> 1) EMA veloce stocastico.

TS_Stochastic(price,q,r,s,u,ul) - Oscillatore Stocastico. Specifiche

  • Nome del File: Blau_TS_Stochastic.mq5
  • Nome: Oscillatore Stocastico (basato sull'Indice Stocastico), secondo William Blau.
  • Parametri di Input:
    • plot grafico #0 - Stocastico veloce (indice stocastico),% k:
      • q - periodo, per il quale viene calcolato lo Stocastico (per impostazione predefinita q = 5);
      • r -period del 1° EMA, applicato allo Stocastico (di default r = 20);
      • s - periodo del 2 ° EMA, applicato al risultato del 1 ° smoothing (di default s = 5);
      • u - periodo del 3 ° EMA, applicato al risultato del 2 ° smoothing (per impostazione predefinita, u = 3);
    • plot grafico #1 - Slow Stochastic (Signal Line),% d:
      • ul - periodo EMA Signal Line, applicato allo Stocastico Veloce (di default ul = 3);
    • AppliedPrice - tipo di prezzo (default AppliedPrice=PRICE_CLOSE).
  • Inoltre:
    • visualizzato in una finestra separata;
    • modificare lo stile di rendering di ogni plotting grafico - il colore, lo spessore, lo stile della linea (la scheda "Colori");
    • due livelli (per impostazione predefinita 40 e 60) - aggiungi/rimuovi un livello; modificare il valore e la descrizione del livello; cambiare lo stile del rendering dei livelli (la scheda "Livelli");
    • modificare i limiti inferiore (per impostazione predefinita 0) e superiore (per impostazione predefinita 100) della scala della finestra dell'indicatore separata (la scheda "Scala").
  • Limitazioni:
    • q>0;
    • r>0, s>0, u>0. Se r, s o u sono uguali a 1, lo smoothing EMA non viene utilizzato;
    • ul>0. Se ul = 1, allora le linee Slow Stochastic (Signal line) e Fast Stochastic sono le stesse;
    • la dimensione minima dell'array di prezzi = (q-1 + r + s + u + ul-4 +1).

 

2.1.2.4. Continuità


L'Oscillatore Stocastico di William Blau include l'Oscillatore Stocastico di George Lane. Affinché il TS_Stochastic (William Blau) corrisponda all'Oscillatore Stocastico standard (George Lane), implementato in MetaTrader 5, è necessario specificare quanto segue:

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. William Blau Stochastic Oscillator contiene l'Oscillatore Stocastico di George Lane

Fig. 2.3. William Blau Stochastic Oscillator contiene l'Oscillatore Stocastico di George Lane

 

2.1.2.5. Il codice dell'Oscillatore Stocastico


Sull'esempio dell'indicatore TS_Stochastic (prezzo,q,r,s,u,ul):

1) La relazione tra gli array di indicatori, i buffer di indicatori e i plot grafici:

//--- 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) L'algoritmo di calcolo per lo Stocastico q-period e il q-period Fascia di Prezzo:

   // 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. Indicatori, basati sul Momentum Stocastico

Fig. 2.4. Gli indicatori di William Blau, basati sul Momentum Stocastico

Fig. 2.4. Gli indicatori di William Blau, basati sul Momentum Stocastico

 

2.2.1. Momentum Stocastico

Il Momentum Stocastico (Stochastic Momentum, SM) - è la distanza dal prezzo del periodo corrente alla metà della fascia di prezzo nei precedenti periodi q. Il valore del Momentum Stocastico del periodo q mostra la posizione del prezzo nella fascia di prezzo.

Il segno del momentum stocastico q-period mostra la posizione del prezzo, rispetto alla metà della fascia di prezzo q-period: un Momentum Stocastico positivo - il prezzo è sopra il punto medio, un negativo - il prezzo è al di sotto del punto medio.

Fig. 2.5. La definizione del Momentum Stocastico

Fig. 2.5. La definizione del Momentum Stocastico

La formula del Momentum Stocastico del periodo q:

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

dove:

  • prezzo - prezzo [chiusura] del periodo corrente;
  • q - il numero di barre, utilizzato nel calcolo del Momentum Stocastic;
  • LL (q) - il valore minimo del prezzo più basso per il periodo q;
  • HH (q) - il valore massimo dei prezzi più alti per il periodo q;
  • 1/2* [LL(q)+HH (q)] - la metà della fascia di prezzo del periodo q.

La formula dello Stocastico Momentum q-period smussato:

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

dove:

  • prezzo - prezzo di [chiusura] - la base di prezzo del grafico dei prezzi;
  • q - il numero di barre, utilizzato nel calcolo del Momentum Stocastico;
  • sm(price,q)=price-1/2*[LL(q)+HH(q)] - il q-period Momentum Stocastico;
  • EMA (sm(price,q),r) - il primo smoothing - l'EMA(r), applicato al Momentum Stocastico q-period;
  • EMA (EMA(..., r),s) - il secondo smoothing- l'EMA(e), applicato al risultato del 1° smoothing;
  • EMA(EMA(EMA(sm(q),r),s),u) - il terzo smoothing - l'EMA(u), applicata al risultato del 2° smoothing.


2.2.1.2. SM(price,q,r,s,u) - Momentum Stocastico. Specifiche

  • Nome del File: Blau_SM.mq5
  • Nome: Stochastic Momentum Indicator (q-period stochastic momentum, q-period stochastic momentum smussato), secondo William Blau.
  • Parametri di Input:
    • q - il periodo in base al quale viene calcolato il momentum stocastico (per impostazione predefinita q = 5);
    • r - periodo dell'EMA 1-st, applicato al Momentum Stocastico (di default r = 20);
    • s - periodo del 2 ° EMA, applicato al risultato del 1 ° smoothing (di default s = 5);
    • u - periodo del 3 ° EMA, applicato al risultato del 2 ° smoothing (per impostazione predefinita, u = 3);
    • AppliedPrice - tipo di prezzo (default AppliedPrice=PRICE_CLOSE).
  • Inoltre:
    • visualizzato in una finestra separata;
    • modifiche del rendering del plotting grafico - il colore, lo spessore, lo stile della linea (la scheda "Colori").
  • Limitazioni:
    • q>0;
    • r>0, s>0, u>0. Se r, s o u sono uguali a 1, lo smoothing EMA non viene utilizzato;
    • la dimensione minima dell’array dei prezzi = (q-1 + r + s + u-3 +1).

 

2.2.2. L’Indice del Momentum Stocastico

Lo Stochastic Momentum Index (SMI) - è un indicatore di un tasso stocastico normalizzato (momentum stocastico normalizzato del periodo q smussato). I valoridel momento stocastico levigato del periodo q è dato nel formato percentuale (intervallo di visualizzazione [-100, 100]).

Ogni valore dello Stocastico Momentum q-period smussato è normalizzato dal valore della metà dell'intervallo q-period delle fluttuazioni dei prezzi. La normalizzazione consente di interpretare il valore di SMI come un grado di un livello di ipercomprato (valore positivo) o di un livello di ipervenduto (negativo) del mercato.

La formula dell'Indice di Momentum Stocastico:

                     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

dove:

  • prezzo - prezzo di [chiusura] - la base di prezzo del grafico dei prezzi;
  • LL (q) - il valore minimo del prezzo più basso per il periodo q;
  • HH (q) - il valore massimo dei prezzi più alti per il periodo q;
  • sm(price,q)=price-1/2*[LL(q)+HH(q)] - il q-period Momentum Stocastico;
  • SM(price,q,r,s,u) - q-period Stochastic Momentum smussato tre volte;
  • HH(q)-LL(q) - fascia di prezzo q-period;
  • 1/2* [LL (q)+HH(q)] - la metà della fascia di prezzo del periodo q;
  • 1/2*[HH(q)-LL(q)] - metà del periodo q della fascia di prezzo;
  • EMA (..., r) - il primo smoothing - EMA(r), applicato a:
    1) il Momentum Stocastico del periodo q
    2) metà della Fascia di Prezzo del periodo q;
  • EMA (EMA(..., r),s) - il secondo smoothing - EMA(s), applicata al risultato del 1° smoothing;
  • EMA (EMA (EMA (..., r), s), u) - il terzo smoothing - EMA(u), applicato al risultato del 2o smoothing.


2.2.2.2. SMI(price,q,r,s,u) - Indice Stocastico Momentum. Specifiche

  • Nome del File: Blau_SMI.mq5
  • Nome: Stochastic Momentum Index (q-period Stochastic Momentum smussato) secondo William Blau.
  • Parametri di Input:
    • q - il periodo in base al quale viene calcolato il Momentum Stocastico (per impostazione predefinita q = 5);
    • r - periodo di 1-st EMA, applicato al Momentum Stocastico (di default r = 20);
    • s - periodo della 2a EMA, applicata ai risultati del 1° smoothing (di default s = 5);
    • u - periodo del 3 ° EMA, applicato ai risultati del 2 ° smoothing (per impostazione predefinita, u = 3);
    • AppliedPrice - tipo di prezzo (default AppliedPrice=PRICE_CLOSE).
  • Inoltre:
    • visualizzato in una finestra separata;
    • modificare lo stile di rendering del plotting grafico - il colore, lo spessore, lo stile della linea (la scheda "Colori");
    • (opzionale) Due livelli (per impostazione predefinita -40 e +40) - aggiungere/rimuovere un livello; modificare il valore e la descrizione del livello, modificare lo stile del rendering dei livelli (la scheda "Livelli");
    • modificare i limiti inferiore (per impostazione predefinita -100) e superiore (per impostazione predefinita 100) della scala della finestra del singolo indicatore (la scheda "Scala").
  • Limitazioni:
    • q>0;
    • r>0, s>0, u>0. Se r, s o u sono uguali a 1, nel corrispondente periodo EMA, lo smoothing non verrà eseguito;
    • la dimensione minima dell’array dei prezzi = (q-1 + r + s + u-3 +1).

 

2.2.3. L’Oscillatore Stocastico

La definizione dell'Oscillatore Stocastico:
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)

dove:

  • SM_Stochastic() - Stochastic Momentum Index SMI(price,q,r,s,u);
  • SignalLine() - Signal Line - EMA del periodo, ul, applicato all’Indice del Momentum Stocastico;
  • ul - linea di segnale EMA a periodo - secondo William Blau, il valore ul deve essere uguale al periodo dell'ultimo indice EMA significativo (>1) del tasso stocastico.


2.2.3.1. SM_Stochastic(price,q,r,s,u,ul) - Oscillatore Stocastico. Specifiche

  • Nome del File: Blau_SM_Stochastic.mq5
  • Il nome: Oscillatore Stocastico (basato sul Momentum Stocastico), secondo William Blau.
  • Parametri di Input:
    • grafico #0 - l’Indice Stocastico del Momentum:
      • q - il periodo in base al quale viene calcolato il momentum stocastico (per impostazione predefinita q = 5);
      • r - periodo della 1a EMA, applicato al Momentum stocastico (di default r = 20);
      • s - periodo della 2a EMA, applicato al risultato del 1° smoothing (di default s = 5);
      • u - periodo del 3a EMA, applicato al risultato del 2° smoothing (per impostazione predefinita, u = 3);
    • plot grafico #1 - la linea del segnale:
      • ul - linea di segnale EMA a periodo, per quanto riguarda l'indice del tasso stocastico (di default ul = 3);
    • AppliedPrice - tipo di prezzo (default AppliedPrice=PRICE_CLOSE).
  • Inoltre:
    • visualizzato in una finestra separata;
    • modificare lo stile di rendering di ogni plotting grafico - il colore, lo spessore, lo stile della linea (la scheda "Colori");
    • due livelli (per impostazione predefinita -40 e +40) - aggiungi/rimuovi un livello; modificare il valore e la descrizione del livello, modificare lo stile di rendering dei livelli (la scheda "Livelli");
    • modificare i limiti inferiore (per impostazione predefinita -100) e superiore (per impostazione predefinita 100) della scala della finestra del singolo indicatore (la scheda "Scala").
  • Limitazioni:
    • q>0;
    • r>0, s>0, u>0. Se r, s o u sono uguali a 1, nel corrispondente periodo EMA, lo smoothing non verrà eseguito;
    • ul>0. Se ul = 1, allora la linea del segnale coincide con l'indice del tasso stocastico;
    • la dimensione minima dell'array di prezzi = (q-1 + r + s + u + ul-4 +1).

 

2.2.4. Il codice dell'Oscillatore Stocastico

Il SM_Stochastic (prezzo, q, r, s, u, ul):

1) La relazione tra gli array di indicatori, i buffer di indicatori e i plot grafici:

//--- 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) L'algoritmo di calcolo del Momentum Stocastico q-period e metà della fascia di prezzo q-period:

//--- 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. L'indicatore di deviazione dalla tendenza

Gli indicatori considerati (vedi allegato) sono divisi in due gruppi.

I. Indicatori, basati su una deviazione dalla tendenza del mercato.

  1. Blau_MDI.mq5- Un indicatore di una deviazione media dal trend (deviazione media, deviazione media mobile);
  2. Blau_Ergodic_MDI.mq5- Oscillatore MDI ergodico (basato sulla deviazione media).

II. Indicatori, basati sulle Medie Mobili Convergenza/Divergenza.

  1. Blau_MACD.mq5- Convergenza/Divergenza delle Medie Mobili (MACD; MACD smussato);
  2. Blau_Ergodic_MACD.mq5- Ergodic MACD-Oscillator (basato sull'indicatore MACD).


3.1. Indicatori, basati sulla deviazione dalle tendenze del mercato

Fig. 3.1. Gli indicatori di William Blau si basano su una deviazione dalle tendenze del mercato

Fig. 3.1. Gli indicatori di William Blau si basano su una deviazione dalle tendenze del mercato

 

3.1.1. L'Indicatore di Deviazione Media

La deviazione media dal trend è la distanza tra il prezzo e l'EMA (media mobile esponenziale smussata) del periodo r, applicata al prezzo.

L'andamento dello sviluppo del mercato: l'EMA(r), applicato al prezzo viene utilizzato per determinare la tendenza al rialzo (aumento esponenziale), o la tendenza al ribasso (diminuzione esponenziale) dei prezzi.

La media mobile attenua la curva dei prezzi, ma un leggero aumento del periodo della media mobile porta a un ritardo, che è chiaramente visibile nei punti di inversione dei prezzi (vedi inoltre 1.1.1, Fig. 1.2). Il valore della deviazione media dal trend mostra la distanza dall'EMA(r), applicata al prezzo.

Il segno della deviazione media dal trend mostra la posizione del prezzo, rispetto all'EMA(r) applicata al prezzo: una deviazione positiva dal trend - il prezzo è superiore all'esponente, negativo - il prezzo è inferiore all'esponente.

La formula per la deviazione media dalla tendenza:

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

dove:

  • prezzo - prezzo del periodo corrente;
  • EMA (prezzo,r) - l'andamento del mercato - EMA del periodo r, applicato al prezzo.

Vedere nella "Guida per l'utente al terminale client MetaTrader", nella sezione "Anatyics/Technical Indicators/Trend Indicators":

  1. Doppia Media Mobile Esponenziale, DEMA;
  2. Tripla Media Mobile Esponenziale, TEMA.

Un indice simile è usato da Alexander Elder nei suoi indicatori Bears Power e Bulls Power. Vedere nella "Guida per l'utente al terminale client MetaTrader" nella sezione "Analisi/Indicatori tecnici/Oscillatori":

  1. Forza dell’Orso;
  2. Bulls Power.

L'indicatore della deviazione media dalla tendenza (Mean Deviation Index, MDI) - è una deviazione media smussata dalla tendenza del mercato.

La formula dell'indicatore della deviazione media dalla tendenza:

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

dove:

  • prezzo - prezzo di [chiusura] - la base di prezzo del grafico dei prezzi;
  • EMA (prezzo, r) - l'andamento del mercato - il primo smoothing dell'EMA(r), applicato al prezzo;
  • md (prezzo,r) = prezzo-EMA (prezzo,r) - la deviazione media dalla tendenza - la deviazione del prezzo dall'EMA(r), applicata al prezzo;
  • EMA (md (prezzo, r), s) - il secondo smoothing - l'EMA (s), applicato alla deviazione media dalla tendenza;
  • EMA (EMA (md(price,r),s),u) - il terzo smoothing - l'EMA(u), applicato al risultato del secondo smoothing.


3.1.1.3. MDI(price,r,s,u) - Indice di Deviazione Media. Specifiche

  • Nome del File: Blau_MDI.mq5
  • Nome: L'indicatore della deviazione media dal mercato (deviazione media; una deviazione media smussata), secondo William Blau.
  • Parametri di Input:
    • r - periodo della 1a EMA, applicato al prezzo (di default r=20);
    • s - periodo della 2a EMA, applicato alla deviazione media (per impostazione predefinita, s = 5);
    • u - periodo del 3a EMA, applicato al risultato del 2° smoothing (per impostazione predefinita, u = 3);
    • AppliedPrice - tipo di prezzo (default AppliedPrice=PRICE_CLOSE).
  • Inoltre:
    • visualizzato in una finestra separata;
    • modifiche del rendering del plotting grafico - il colore, lo spessore, lo stile della linea (la scheda "Colori").
  • Limitazioni:
    • r>1;
    • s>0, u>0. Se s o u sono pari a 1, lo smoothing EMA non viene utilizzato;
    • la dimensione minima dell’array dei prezzi = (r+s+u-3+1).

 

3.1.2. Ergodic MDI-oscillator

Definizione dell'oscillatore MDI Ergodic:
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)

dove:

  • Ergodic_MDI() - Ergodic - Indice di Deviazione Media MDI(price,r,s,u);
  • La SignalLine() - una linea di Segnale - EMA del periodo ul, applicata all'Ergodico;
  • ul - un periodo EMA di una linea di segnale - secondo William Blau, il valore ul deve essere uguale al periodo dell'ultimo significativo (>1) dell'EMA ergodica.


3.1.2.2. Ergodic_MDI(price,r,s,u,ul) - oscillatore MDI Ergodico. Specifiche

  • Nome del File: Blau_Ergodic_MDI.mq5
  • Nome: L'oscillatore MDI Ergodico (basato sull'indice di deviazione media), secondo William Blau.
  • Parametri di Input:
    • grafico #0 - Ergodico (l'indicatore della deviazione media dalla tendenza):
      • r - periodo della 1a EMA, applicato al prezzo (per impostazione predefinita r=20);
      • s - periodo del 2a EMA, applicata al risultato del 1° smoothing (per impostazione predefinita, s = 5);
      • u - periodo del 3 ° EMA, applicato al risultato del 2 ° smoothing (per impostazione predefinita, u = 3);
    • plot grafico #1 - Linea di Segnale:
      • ul - linea di segnale EMA periodo, applicata all'Ergodico (di default ul = 3);
    • AppliedPrice - tipo di prezzo (default AppliedPrice=PRICE_CLOSE).
  • Inoltre:
    • visualizzato in una finestra separata;
    • cambia lo stile del rendering di ogni struttura grafica - il colore, la larghezza, lo stile della linea (la scheda "Colori").
  • Limitazioni:
    • r>1;
    • s>0, u>0. Se s o u sono pari a 1, lo smoothing EMA non viene utilizzato;
    • ul>0. Se ul = 1, allora la linea del segnale e le linee ergodiche sono le stesse;
    • la dimensione minima dell’array dei prezzi = (r+s+u+ul-4+1).

 

3.1.3. Il codice dell'oscillatore Ergodico

Ad esempio, consideriamo l'indicatore Ergodic_MDI (prezzo, r, s, u, ul):

1) La relazione tra gli array di indicatori, i buffer di indicatori e i plot grafici:

//--- 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) L'algoritmo per il calcolo della deviazione media:

//--- 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. Indicatori basati sulla Convergenza/Divergenza della Media Mobile

Fig. 3.2. Gli indicatori di William Blau si basano sulla Convergenza/Divergenza delle Medie Mobili

Fig. 3.2. Gli indicatori di William Blau si basano sulla Convergenza/Divergenza delle Medie Mobili

 

3.2.1. L'indicatore della Convergenza/Divergenza delle Medie Mobili

La Convergenza/Divergenza della Media Mobile (Moving Average Convergence/Divergence, MACD) - è la differenza tra due medie mobili esponenzialmente levigate: l'EMA veloce (s) l'EMA lento (r), applicato al prezzo.

Il segno MACD mostra laposizione degli EMA veloci, rispetto all'EMA(r) lenta: un MACD positivo - EMA(s) è sopra l'EMA(r), un MACD negativo - EMA(s) è sotto EMA(r). Variazione del MACD del valore assoluto: un aumento| MACD| indica la discrepanza tra le medie mobili, una diminuzione| MACD| indica una convergenza delle medie mobili.

La formula della Convergenza/Divergenza della Media Mobile:

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

dove:

  • prezzo - prezzo [chiusura] del periodo corrente;
  • EMA(price,r) - EMA(r) Lenta, applicata al prezzo;
  • EMA(price,s) - EMA(s) Veloce(i), applicata al prezzo.

L'indicatore MACD mostra la relazione tra le medie esponenziali veloci e lente (convergenza/divergenza attenuata delle medie mobili).

La formula dell'indicatore MACD:

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

dove:

  • prezzo - prezzo di [chiusura] - il prezzo del grafico dei prezzi;
  • EMA(price,r) - il primo smoothing - la lenta esponenziale dell'EMA(r), applicato al prezzo;
  • EMA (prezzo, s) - il secondo smoothing - la veloce EMA (s), s, applicato al prezzo;
  • macd(r,s)=EMA(price,s)-EMA (price,r) - il MACD;
  • EMA(macd (r,s),u) - il terzo smoothing - l'EMA(u), applicato al MACD: un’EMA veloce (price,s) e un’EMA lenta (price,r).

3.2.1.1. MACD(price,r,s,u) - l'indicatore di Convergenza/Divergenza della Media Mobile. Specifiche

  • Nome del File: Blau_MACD.mq5
  • Nome: L'indicatore MACD (MACD; MACD levigato), secondo William Blau.
  • Parametri di Input:
    • r - periodo del 1 ° EMA (lento), applicata al prezzo (di default r = 20);
    • s - periodo della 2 ° EMA (veloce), applicata al prezzo (di default s = 5)
    • u - periodo della 3° EMA, applicata alle medie mobili convergenza/divergenza (di default u = 3);
    • AppliedPrice - tipo di prezzo (default AppliedPrice=PRICE_CLOSE).
  • Inoltre:
    • visualizzato in una finestra separata;
    • modifiche del rendering del plotting grafico - il colore, lo spessore, lo stile della linea (la scheda "Colori").
  • Limitazioni:
    • r>1, s>1;
    • s <r (limite dai requisiti della teoria, non è controllato a livello di programma);
    • u>0. se u = 1, lo smoothing non viene eseguito;
    • la dimensione minima dell’array dei prezzi = ([max(r,s)]+u-2+1).

 

3.2.2. Oscillatore MACD Ergodico:

La definizione dell'oscillatore MACD Ergodico:
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)

dove:

  • Ergodic_MACD () - Ergodico - è un indicatore di convergenza/divergenza delle medie mobili MACD(price,r,s,u);
  • La SignalLine() - una Linea di Segnale - un’EMA(ul), applicata all'ergodico;
  • ul - un periodo EMA di una linea di segnale - secondo William Blau, il valore ul deve essere uguale al periodo dell'ultimo significativo (>1) dell'ergodico EMA.

La "Guida per l'utente al terminale client MetaTrader", nella sezione "Analytics/Technical Indicators/Oscillators/MACD" di title descrive l'indicatore tecnico Convergenza/Divergenza delle medie mobili (MACD), integrato nel terminale client MetaTrader 5, e come utilizzarlo nell'analisi tecnica (vedi anche iMACD.)

In contrasto con il MACD standard, William Blau utilizza la media mobile esponenzialmente levigata  (nel MACD standard viene utilizzata la media mobile semplice).

3.2.2.1. Ergodic_MACD(price,r,s,u,ul) - Oscillatore MACD Ergodic. Specifiche

  • Nome del File: Blau_Ergodic_MACD.mq5
  • Nome: Oscillatore MACD Ergodico (basato sull'indicatore di convergenza/divergenza delle medie mobili), secondo William Blau.
  • Parametri di Input:
    • grafico #0 - Ergodico (le medie mobili convergenza/divergenza):
      • r - periodo del 1 ° EMA (lento), applicata al prezzo (di default r = 20);
      • s - periodo del 2 ° EMA (veloce) applicata al prezzo (di default s = 5)
      • u - periodo della 3° EMA, applicata alle medie mobili convergenza/divergenza (di default u = 3);
    • plot grafico #1 - la Linea del Segnale:
      • ul - punto linea di segnale EMA, viene applicato all'ergodico (di default ul = 3);
    • AppliedPrice - tipo di prezzo (default AppliedPrice=PRICE_CLOSE).
  • Inoltre:
    • visualizzato in una finestra separata;
    • cambia lo stile del rendering di ogni struttura grafica - il colore, la larghezza, lo stile della linea (la scheda "Colori").
  • Limitazioni:
    • r>1, s>1;
    • s <r (limite dai requisiti della teoria, non è controllato a livello di programma);
    • u>0. se u = 1, lo smoothing non viene eseguito;
    • ul>0. Se ul = 1, allora la linea del segnale coincide con l'ergodico;
    • la dimensione minima dell’array dei prezzi =([max(r,s)]+u+ul-3+1).

 

3.2.3. Il codice dell'Oscillatore MACD Ergodico

Ad esempio, consideriamo l'indicatore Ergodic_MACD (prezzo, r, s, u, ul):

1) Il collegamento tra l’array di indicatori, i buffer di indicatori e i plot grafici:

//--- 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) L'algoritmo di convergenza/divergenza delle medie mobili:

//--- 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. Addizione

Nel calcolare l'oscillatore MDI Ergodico e l'oscillatore MACD, secondo William Blau, la normalizzazione non viene utilizzata (per riferimento vedi pp. 1.2.1, 1.3.1). Pertanto, l'ergodico MDI-Oscillator e il MACD-Oscillator non possono essere utilizzati per interpretare il grado di ipercomprato ipervenduto del mercato.

Ad esempio, le raccomandazioni per l'utilizzo dell'indicatore MACD segnalano dalla "Guida dell'Utente al Terminale Client MetaTrader" della "Analytics/Technical Indicators/Oscillators/MACD":

Il MACD è utile anche come un indicatore di ipercomprato/ipervenduto. Quando la media mobile di breve periodo si allontana notevolmente dalla media mobile più lunga (cioè, il MACD sale), è probabile che il prezzo degli strumenti finanziari usati è sovra-esteso e tornerà presto a livelli più realistici.

in questo caso, dal punto di vista dell'analisi tecnica.


4. Candlestick Momentum

Gli indicatori considerati (vedi allegato) sono divisi in due gruppi.

  1. Blau_CMtm.mq5- è l'indicatore Candlestick Momentum (momentum del q-period candlestick; q-period Candlestick Momentum smussato);
  2. Gli indici (q-period Candlestick Momentum normalizzato e smussato):
    • Blau_CMI.mq5- il Candlestick Momentum Index (normalizzazione per il valore assoluto del q-period Candlestick Momentum);
    • Blau_CSI.mq5- il Candlestick Index (normalizzato dalla lunghezza q-period Candlestick);
  3. L'oscillatore ergodico del modello a candele
    • Blau_Ergodic_CMI.mq5- l'Oscillatore CMI Ergodico (basato sul Candlestick Momentum Index);
    • Blau_Ergodic_CSI.mq5- l'Oscillatore CMI Ergodico (basato sul Candlestick Index).

Fig. 4.1. Indicatori di William Blau, basati sul Candlestick Momentum (normalizzato dal valore assoluto del q-period Candlestick Momentum)

Fig. 4.1. Indicatori di William Blau, basati sul Candlestick Momentum (normalizzato dal valore assoluto del Candlestick Momentum q-period)

 

Fig. 4.2. Indicatori di William Blau, basati sul Candlestick Momentum (normalizzato dalla lunghezza del candlestick q-period)

Fig. 4.2. Indicatori di William Blau, basati sul Candlestick Momentum (normalizzato dalla lunghezza del Candlestick q-period)

 

4.1. Il Momentum Candlestick

4.1.1. La definizione del Candlestick Momentum

Il Momentum (vedi p. 1.1) - è la differenza tra il prezzo corrente (di solito, il prezzo di chiusura di oggi) e il prezzo precedente (di solito il prezzo di chiusura di ieri). Il momentum può riflettere la variazione di prezzo in qualsiasi periodo di tempo del grafico dei prezzi.

Il Candlestick Momentum (secondo William Blau) - è la differenza tra il prezzo di chiusura e il prezzo di apertura, nello stesso periodo (all'interno di una candela). Il segno del Candlestick Momentum mostra la direzione del cambiamento di prezzo: un Candlestick Momentum positivo - il prezzo è aumentato nel periodo, un negativo - il prezzo è diminuito nel corso del periodo.

La formula del Candlestick Momentum:

cmtm = close - open

dove:

  • chiudi - il prezzo di chiusura del periodo [corrente] del (modello a candele);
  • open - il prezzo di apertura del periodo [corrente] del (modello a candele).

Dal punto di vista dell'universalità, estendiamo la definizione del candlestick momentum:

  1. Il Candlestick Momentum può riflettere la variazione di prezzo per qualsiasi periodo di tempo del grafico dei prezzi;
  2. La base di prezzo (il prezzo di chiusura, il prezzo di apertura) può essere arbitraria.

Fig. 4.3. La definizione del Candlestick q-period

Fig. 4.3. La definizione del Candlestick q-period


La formula del q-period Candlestick Momentum:

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

dove:

  • q - è il numero di barre del grafico dei prezzi, utilizzato nel calcolo del Candlestick Momentum;
  • prezzo1 - prezzo [chiusura] alla fine del periodo q;
  • prezzo2[q-1] - prezzo[apertura] all'inizio del periodo q.

La formula del q-period Candlestick Momentum smussato:

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

dove:

  • q - il numero di barre del grafico dei prezzi, utilizzato nel calcolo del periodo q di Candlestick Momentum;
  • prezzo1 - prezzo [chiusura] alla fine del periodo q;
  • prezzo2 - prezzo[apertura] all'inizio del periodo q;
  • cmtm(price1,price2,q)=price1-price2[q-1] - q-period Candlestick Momentum;
  • EMA (cmtm (prezzo1, prezzo2, q), r) - il primo smoothing - EMA(r), applicato al q-period Candlestick Momentum;
  • EMA (EMA(..., r),s) - il secondo smoothing - EMA(s), applicata al risultato del 1° smoothing;
  • EMA (EMA (EMA (..., r), s), u) - il terzo smoothing - EMA(u), applicato al risultato del 2o smoothing.


4.1.2. CMtm(price1,price2,q,r,s,u) - Indicatore Momentum Candlestick. Specifiche
  • Nome del File: Blau_CMtm.mq5
  • Nome: L'indicatore Candlestick Momentum (q-period Candlestick Momentum smussato), secondo William Blau.
  • Parametri di Input:
    • q - il periodo di Candlestick Momentum (di default q = 1);
    • r - periodo del 1° EMA, applicato al q-period Candlestick Momentum (di default r = 20);
    • s - periodo del 2 ° EMA, applicato al risultato del 1 ° smoothing (di default s = 5);
    • u - periodo del 3 ° EMA, applicato al risultato del 2 ° smoothing (per impostazione predefinita, u = 3);
    • AppliedPrice1 - tipo di prezzo [chiusura] (di default AppliedPrice=PRICE_CLOSE);
    • AppliedPrice2 - tipo di prezzo [apertura] (di default AppliedPrice=PRICE_OPEN).
  • Inoltre:
    • visualizzato in una finestra separata;
    • modifiche del rendering del plotting grafico - il colore, lo spessore, lo stile della linea (la scheda "Colori").
  • Limitazioni:
    • q>0;
    • r>0, s>0, u>0. Se r, s o u sono uguali a 1, lo smoothing EMA non viene utilizzato;
    • la dimensione minima dell’array dei prezzi = (q-1 + r + s + u-3 +1).


4.2. Momentum normalizzato del Candlestick

4.2.1. Candlestick Momentum Index

Il Candlestick Momentum Index (CMI) - è il periodo q normalizzato Candlestick Momentum.

I valori del momentum smussato del candlestick del periodo q sono dati in percentuale (intervallo di mappatura [-100, 100]). Ogni valore del momentum smussato del Candlestick q-period è normalizzato dal valore del q-period Candlestick Momentum, preso nel valore assoluto. La normalizzazione consente di interpretare il valore CMI come un grado di ipercomprato (valore positivo) o ipervenduto (valore negativo).

La formula per il Candlestick Momentum Index:

                             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

dove:

  • q - il numero di periodi di tempo del grafico dei prezzi, coinvolti nel calcolo del momento del periodo q della candela;
  • prezzo1 - prezzo [chiusura] alla fine del periodo q;
  • prezzo2 - prezzo[apertura] all'inizio del periodo q;
  • cmtm(price1,pric2,q)=price1-pric2[q-1], - q-period Candlestick Momentum;
  • |cmtm(price1,pric2,q)| - valore assoluto del q-period Candlestick Momentum;
  • CMtm (prezzo,q,r,s,u) - q-period Candlestick Momentum smussato tre volte;
  • EMA (..., r) - primo smoothing - l'EMA(r), applicata a:
    1) il q-period Candlestick Momentum
    2) il valore assoluto del Candlestick Momentum q-period;
  • EMA (EMA(..., r),s) - il secondo smoothing- l'EMA(e), applicato al risultato del 1° smoothing;
  • EMA (EMA (EMA (..., r), s), u) - il terzo smoothing - l'EMA (u), applicata al risultato del 2° smoothing.


4.2.1.1. CMI(price1,price2,q,r,s,u) - Candlestick Momentum Index. Specifiche

  • Nome del File: Blau_CMI.mq5
  • Nome: q-period Candlestick Momentum Index (q-period Candlestick Momentum normalizzato smussato; normalizzazione per il valore assoluto del q-period Candlestick Momentum), secondo William Blau.
  • Parametri di Input:
    • q - il periodo del Candlestick Momentum ( q = 1);
    • r - periodo del 1° EMA, applicato al q-period Candlestick Momentum (di default r = 20);
    • s - periodo del 2 ° EMA, applicato al risultato del 1 ° smoothing (di default s = 5);
    • u - periodo del 3 ° EMA, applicato al risultato del 2 ° smoothing (per impostazione predefinita, u = 3);
    • AppliedPrice1 - tipo di prezzo [chiusura] (di default AppliedPrice=PRICE_CLOSE);
    • AppliedPrice2 - tipo di prezzo [apertura] (di default AppliedPrice=PRICE_OPEN).
  • Inoltre:
    • visualizzato in una finestra separata;
    • modificare lo stile di rendering del plotting grafico - il colore, lo spessore, lo stile della linea (la scheda "Colori");
    • (facoltativo) a due livelli (il valore predefinito è -25 e +25) - aggiungere/rimuovere un livello; modificare il valore, la descrizione del livello, modificare lo stile di rendering dei livelli (la scheda "Livelli");
    • modificare i limiti inferiore (per impostazione predefinita -100) e superiore (per impostazione predefinita 100) della scala della finestra del singolo indicatore (la scheda "Scala").
  • Limitazioni:
    • q>0;
    • r>0, s>0, u>0. Se r, s o u sono uguali a 1, nel corrispondente periodo EMA, lo smoothing non verrà eseguito;
    • la dimensione minima dell’array dei prezzi = (q-1 + r + s + u-3 +1).

 

4.2.2. The Candlestick Index

IlCandlestick index (CSI) - è un indicatore del Candlestick Momentum q-period normalizzato(q-period Candlestick Momentum normalizzato smussato). I valori del momento candlestick del periodo q levigato sono dati come percentuale della scala (intervallo di mappatura [-100, 100]).

Ogni valore del Candlestick Momentum q-period smussato è normalizzato dal valore della fascia di prezzo q-period (o dalla lunghezza della candlestick q-period). La normalizzazione consente di interpretare il valore di CSI come un grado di ipercomprato (valore positivo) o livello di mercato ipervenduto (valore negativo).

La formula del Candlestick Index:

                             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

dove:

  • q - il numero di barre del grafico dei prezzi, utilizzato nel calcolo del q-period Candlestick Momentum;
  • prezzo1 - prezzo [chiusura] alla fine del periodo q;
  • prezzo2 - prezzo[apertura] all'inizio del periodo q;
  • cmtm(price1,pric2,q)=price1-price2[q-1] - q-period Candlestick Momentum;
  • LL (q) - il valore minimo del prezzo più basso per il periodo q;
  • HH(q) - il valore massimo del prezzo più alto per il periodo q
  • HH(q)-LL(q) - fascia di prezzo q-period (la lunghezza della modello a candele q-period);
  • CMtm (price1,pric2,q,r,s,u) - q-period Candlestick Momentum smussato tre volte;
  • EMA (..., r) - il primo smoothing - l'EMA(r), applicato a:
    1) il q-period Candlestick Momentum, 
    2) la fascia di prezzo q-period (o la lunghezza della candela q-period);
  • EMA (EMA(..., r),s) - il secondo smoothing- l'EMA(e), applicato al risultato del 1° smoothing;
  • EMA (EMA (EMA (..., r), s), u) - il terzo smoothing - l'EMA(u), applicato al risultato del 2o smoothing.

4.2.2.1. CSI(price1,price2,q,r,s,u) - Candlestick Index. Specifiche

  • Nome del File: Blau_CSI.mq5
  • Nome: q-period Candlestick Index ( q-period Candlestick Momentum normalizzato smussato; normalizzazione per la lunghezza del q-period candlestick), secondo William Blau.
  • Parametri di Input:
    • q - il periodo per il quale viene calcolato il Momentum Candlestick q-period (di default q = 1);
    • r - periodo della 1a EMA, applicato al momentum della candela q-period (di default r = 20);
    • s - periodo del 2 ° EMA, applicato al risultato del 1 ° smoothing (di default s = 5);
    • u - periodo del 3 ° EMA, applicato al risultato del 2 ° smoothing (per impostazione predefinita, u = 3);
    • AppliedPrice1 - tipo di prezzo [chiusura] (di default AppliedPrice=PRICE_CLOSE);
    • AppliedPrice2 - tipo di prezzo [apertura] (di default AppliedPrice=PRICE_OPEN).
  • Inoltre:
    • visualizzato in una finestra separata;
    • modificare lo stile di rendering del plotting grafico - il colore, lo spessore, lo stile della linea (la scheda "Colori");
    • (facoltativo) a due livelli (il valore predefinito è -25 e +25) - aggiungere/rimuovere un livello; modificare il valore, la descrizione del livello, modificare lo stile di rendering dei livelli (la scheda "Livelli");
    • modificare i limiti inferiore (per impostazione predefinita -100) e superiore (per impostazione predefinita 100) della scala della finestra del singolo indicatore (la scheda "Scala").
  • Limitazioni:
    • q>0;
    • r>0, s>0, u>0. Se r, s o u sono uguali a 1, lo smoothing EMA non viene utilizzato;
    • la dimensione minima dell’array dei prezzi = (q-1 + r + s + u-3 +1).

 

4.3. Gli Oscillatori Ergodici del Modello a Candele

4.3.1. L'oscillatore CMI Ergodico

La definizione dell'oscillatore CMI Ergodico:
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)

dove:

  • Ergodic_CMI() - Ergodic - Candlestick Momentum Index CMI(price1,price2,q,r,s,u);
  • La SignalLine() - una Linea di Segnali - EMA(ul), applicata all'Ergodico;
  • ul - un periodo EMA di una linea di segnale - secondo William Blau, il valore ul deve essere uguale al periodo dell'ultimo significativo (>1) dell'ergodico EMA.

Ergodic_CMI(price1,pric2,q,r,s,u,ul) - oscillatore CMI ergodico. Specifiche

  • Nome del File: Blau_Ergodic_CMI.mq5
  • Nome: Ergodic CMI-Oscillator (basato sul Candlestick Momentum Index), secondo William Blau.
  • Parametri di Input:
    • plot grafico #0 - Ergodico (Candlestick Momentum Index):
      • q - il periodo di Candlestick Momentum (di default q = 1);
      • r - periodo del 1° EMA, applicato al q-period Candlestick Momentum (di default r = 20);
      • s - periodo della 2a EMA, applicato al risultato del 1° smoothing (di default s = 5);
      • u - periodo del 3a EMA, applicato al risultato del 2° smoothing (per impostazione predefinita, u = 3);
    • plot grafico #1 - la Linea del Segnale:
      • ul - periodo di Linea di Segnale, applicato all'Ergodico (di default ul = 3);
    • AppliedPrice1 - tipo di prezzo [chiusura] (di default AppliedPrice=PRICE_CLOSE);
    • AppliedPrice2 - tipo di prezzo [apertura] (di default AppliedPrice=PRICE_OPEN).
  • Inoltre:
    • visualizzato in una finestra separata;
    • modificare lo stile di rendering di ogni plotting grafico - il colore, lo spessore, lo stile della linea (la scheda "Colori");
    • due livelli (per impostazione predefinita -25 e +25) - aggiungi / rimuovi un livello, cambia il valore, la descrizione del livello, cambia lo stile di rendering dei livelli (la scheda "Livelli");
    • modificare i limiti inferiore (per impostazione predefinita -100) e superiore (per impostazione predefinita 100) della scala della finestra del singolo indicatore (la scheda "Scala").
  • Limitazioni:
    • q>0;
    • r>0, s>0, u>0. Se r, s o u sono uguali a 1, nel corrispondente periodo EMA, lo smoothing non verrà eseguito;
    • ul>0. Se ul = 1, allora la linea del segnale coincide con l'ergodico;
    • la dimensione minima dell'array di prezzi = (q-1 + r + s + u + ul-4 +1).


Il codice dell'oscillatore CMI Ergodico


Ad esempio, consideriamo l'indicatore Ergodic_CMI (price1,price2,r,s,u,ul):

1) La relazione tra gli array di indicatori, i buffer di indicatori e i plot grafici:

//--- 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) Algoritmo di calcolo 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. L'oscillatore CSI Ergodico

L'oscillatore CSI Ergodico è definito come 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)

dove:

  • Ergodic_CSI() - Ergodic - Indice Candlestick CSI(price1,price2,q,r,s,u);
  • La SignalLine() - una Linea di Segnale - l'EMA(u)l, applicata all'Ergodico;
  • ul - un periodo EMA di una linea di segnale - secondo William Blau, il valore ul deve essere uguale al periodo dell'ultimo significativo (>1) dell’EMA ergodica.


4.3.2.1. Ergodic_CSI(price1,pric2,q,r,s,u,ul) - oscillatore CSI Ergodico. Specifiche

  • Nome del File: Blau_Ergodic_CSI.mq5
  • Nome: Ergodic CSI-Oscillator (basato sul Candlestick Index), secondo William Blau.
  • Parametri di Input:
    • plot grafico #0 - Ergodico (Candlestick Index):
      • q - il periodo per il quale viene calcolato il Momentum Candlestick q-period (di default q = 1);
      • r - periodo del 1° EMA, applicato al q-period Candlestick Momentum (di default r = 20);
      • s - periodo del 2 ° EMA, applicato al risultato del 1 ° smoothing (di default s = 5);
      • u - periodo del 3 ° EMA, applicato al risultato del 2 ° smoothing (per impostazione predefinita, u = 3);
    • plot grafico #1 - la Linea del Segnale:
      • ul - linea di segnale EMA periodo, viene applicato all'Ergodico (di default ul = 3);
    • AppliedPrice1 - tipo di prezzo [chiusura] (di default AppliedPrice=PRICE_CLOSE);
    • AppliedPrice2 - tipo di prezzo [apertura] (di default AppliedPrice=PRICE_OPEN).
  • Inoltre:
    • visualizzato in una finestra separata;
    • modificare lo stile di rendering di ogni plotting grafico - il colore, lo spessore, lo stile della linea (la scheda "Colori");
    • due livelli (per impostazione predefinita -25 e +25) - aggiungi / rimuovi un livello, cambia il valore, la descrizione del livello, cambia lo stile di rendering dei livelli (la scheda "Livelli");
    • modificare i limiti inferiori (di default -100) e superiori (di default 100) della scala della finestra del singolo indicatore (la scheda "Scala").
  • Limitazioni:
    • q>0;
    • r>0, s>0, u>0. Se r, s o u sono uguali a 1, nel corrispondente periodo EMA, lo smoothing non verrà eseguito;
    • ul>0. Se ul = 1, allora la linea del segnale coincide con l'ergodico;
    • la dimensione minima dell'array di prezzi = (q-1 + r + s + u + ul-4 +1).


4.3.2.2. Il codice dell'oscillatore CSI Ergodico


Sull'esempio dell'indicatore Ergodic_CSI (prezzo1, prezzo2,r,s,u,ul):

1) La relazione tra gli array di indicatori, i buffer di indicatori e i plot grafici:

//--- 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) L'algoritmo di calcolo per il cmtm e la fascia di prezzo q-period: 

//--- 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. Tendenza Direzionale

Gli indicatori considerati (vedi allegato):

  1. Blau_HLM.mq5- è un indicatore del Virtual Close (q-period Composite High-Low Momentum; il q-period Composite High-Low Momentum smussato);
  2. Blau_DTI.mq5 the Directional Trend Index (q-period Composite High-Low Momentum normalizzato smussato);
  3. Blau_Ergodic_DTI.mq5- l'oscillatore Ergodico DTI (basato sull’Indice di Tendenza Direzionale).

Fig. 5.1. Indicatori dell'Indice di Tendenza Direzionale

Fig. 5.1. Indicatori dell'Indice di Tendenza Direzionale

 

5.1. Il Momentum Composito Alto-Basso

5.1.1. Definire lo slancio del trend al rialzo e al ribasso

Una delle definizioni della tendenza. Se i valori ​dell'aumento massimo dei prezzi, quindi c'è una tendenza al rialzo. Se i valori ​dei prezzi minimi sono in diminuzione, quindi c'è una tendenza al ribasso.

Un gruppo di indicatori di Momentum, discussi nella Sezione 1, può essere utilizzato per calcolare il momentum per i massimi dei prezzi:

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

e per i prezzi minimi:

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

Il Momentum up-trend o High Momentum Up (HMU) è la differenza positiva tra il prezzo massimo del periodo corrente e il prezzo massimo all'inizio della fascia di prezzo q-period. Il valore del momentum q-period del trend al rialzo mostra una velocità relativa di crescita del prezzo massimo per il periodo corrente, rispetto al prezzo massimo all'inizio dell'intervallo q-period delle fluttuazioni dei prezzi.

La formula del momentum q-period del trend al rialzo:

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

dove:

  • q - è il numero di periodi di tempo del grafico dei prezzi, coinvolti nel calcolo del momentum di tendenza al rialzo;
  • Alto - il prezzo massimo per il periodo corrente;
  • High[q–1] - prezzo massimo (q-1) periodi fa.

Il momentum di tendenza al ribasso o il Low Momentum Down (LMD) - questa è una differenza positiva tra il prezzo minimo del periodo corrente e il prezzo più basso per l'inizio della gamma di fluttuazioni dei prezzi del periodo q. Il valore del momentum q-period del down-trend mostra la velocità relativa della diminuzione del prezzo minimo del periodo corrente, rispetto al prezzo più basso per l'inizio della fascia di prezzo q-period.

La formula del q-period down-trend Momentum:

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

dove:

  • q - è il numero di periodi di tempo del grafico dei prezzi, utilizzato nel calcolo del momentum di tendenza al ribasso;
  • Basso - il prezzo minimo per il periodo corrente;
  • Low[q-1] - il prezzo minimo (q-1) periodi fa.

Un Composite High-Low Momentum (High-Low Momentum, HLM) - è la differenza tra il Momentum q-period del trend al rialzo e il Momentum q-period del trend al ribasso. Il segno del composito High-Low Momentum indica la tendenza delle variazioni dei prezzi: un HLM positivo - una tendenza all'aumento dei prezzi (tendenza al rialzo) e un negativo - la tendenza alla diminuzione dei prezzi (tendenza al ribasso).

Formula:

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

dove:

  • q - il numero di periodi di tempo del grafico dei prezzi, coinvolti nel calcolo dei momentum del trend al rialzo e al ribasso;
  • HMU(q) - il momentum della tendenza al rialzo per il periodo q;
  • LMD(q) - il momentum del trend al ribasso per il periodo q.

La formula del q-period Composite High-Low Momentum smussato(Virtual Close):

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

dove:

  • q - il numero di periodi di tempo del grafico dei prezzi, coinvolti nel calcolo dei momentum del trend al rialzo e al ribasso;
  • HMU(q) - il momentum della tendenza al rialzo per il periodo q;
  • LMD(q) - il momentum del trend al ribasso per il periodo q;
  • HLM(q) = HMU(q)-LMD(q) - il q-period Composite High-Low Momentum;
  • EMA (HLM (q), r) - il primo smoothing - l'EMA(r), applicato al q-period Composite High-Low Momentum;
  • EMA (EMA(..., r),s) - il secondo smoothing - l'EMA(s), applicata al risultato della 1° smoothing
  • EMA (EMA (EMA (..., r), s), u) - il terzo smoothing- l'EMA (u), applicato al risultato del 2° smoothing.

La curva del grafico della somma accumulata di momenti complessi per i massimi e i minimi è chiamata chiusura virtuale.


5.1.2. HLM(q,r,s,u) - Indicatore di Chiusura Virtuale. Specifiche
  • Nome del File: Blau_HLM.mq5
  • Nome: Indicatore del Close virtuale (q-period Composite High-Low Momentum; un q-period Composite High-Low Momentum smussato), secondo William Blau.
  • Parametri di Input:
    • q - il periodo per il quale viene calcolato l'HLM (di default q = 2);
    • r - periodo della 1a EMA, applicata all'HLM (di default r = 20);
    • s - periodo del 2 ° EMA, applicato al risultato del 1 ° smoothing (di default s = 5);
    • u - periodo del 3° EMA, applicato al risultato del 2° smoothing (di default, u = 3).
  • Inoltre:
    • visualizzato in una finestra separata;
    • modifiche del rendering del plotting grafico - il colore, lo spessore, lo stile della linea (la scheda "Colori").
  • Limitazioni:
    • q>0;
    • r>0, s>0, u>0. Se r, s o u sono uguali a 1, nel corrispondente periodo EMA, lo smoothing non verrà eseguito;
    • la dimensione minima dell’array dei prezzi = (q-1 + r + s + u-3 +1).

 

5.2. Indice di Tendenza Direzionale

5.2.1. La definizione deIl’Indice di Tendenza Direzionale

L’Indice di Tendenza Direzionale (Directional Trend Index, DTI) - è un indicatore di un Q-period Composite High-Low Momentum normalizzato (HLM normalizzato smussato). I valori dell'HLM levigato sono dati come percentuale della scala (intervallo di visualizzazione [-100, 100]).

Ogni valore dell'HLM smussato è normalizzato dal valore di un HLM smussato, preso come valore assoluto. La normalizzazione consente di interpretare il valore DTI come un grado di ipercomprato (valore positivo) o ipervenduto (valore negativo).

La formula dell'indice di Tendenza Direzionale:

               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

dove:

  • q - il numero di periodi di tempo del grafico dei prezzi, coinvolti nel calcolo dei momentum del trend al rialzo e al ribasso;
  • HLM(q) = HMU(q)-LMD(q) - un momento complesso del periodo q per i massimi e i minimi;
  • | HLM(q)| - valore assoluto HLM(q);
  • HLM(q,r,s,u) - HLM(q) smussato tre volte;
  • EMA(..., r) - il primo smoothing - l'EMA(r), applicato a:
    1) all'HLM (q)
    2) al valore assoluto dell'HLM (q);
  • EMA (EMA(..., r),s) - il secondo smoothing- l'EMA(e), applicato al risultato del 1° smoothing;
  • EMA (EMA (EMA (..., r), s), u) - il terzo smoothing - l'EMA(u), applicato al risultato del 2o smoothing.
5.2.2. DTI(q,r,s,u) - Indice di Tendenza Direzionale. Specifiche
  • Nome del File: Blau_DTI.mq5
  • Nome: Indice di Tendenza Direzionale (q-period Composite High-Low Momentum normalizzato smussato), secondo William Blau.
  • Parametri di Input:
    • q - il periodo per il quale viene calcolato l'HLM (di default q = 2);
    • r - periodo della 1a EMA, applicata all'HLM (di default r = 20);
    • s - periodo del 2 ° EMA, applicato al risultato del 1 ° smoothing (di default s = 5);
    • u - periodo del 3° EMA, applicato al risultato del 2° smoothing (di default, u = 3).
  • Inoltre:
    • visualizzato in una finestra separata;
    • modificare lo stile di rendering del plotting grafico - il colore, lo spessore, lo stile della linea (la scheda "Colori");
    • (facoltativo) a due livelli (il valore predefinito è -25 e +25) - aggiungere/rimuovere un livello; modificare il valore, la descrizione del livello, modificare lo stile di rendering dei livelli (la scheda "Livelli");
    • modificare i limiti inferiore (per impostazione predefinita -100) e superiore (per impostazione predefinita 100) della scala della finestra del singolo indicatore (la scheda "Scala").
  • Limitazioni:
    • q>0;
    • r>0, s>0, u>0. Se r, s o u sono uguali a 1, nel corrispondente periodo EMA, lo smoothing non verrà eseguito;
    • la dimensione minima dell’array dei prezzi = (q-1 + r + s + u-3 +1).

 

5.3. L'oscillatore DTI Ergodico

5.3.1. La definizione dell'oscillatore Ergodico DTI

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)

dove:

  • Ergodic_DTI() - Ergodico - Indice di Tendenza Direzionale DTI (q,r,s,u);
  • La SignalLine() - una Linea di Segnale - una media mobile esponenziale del periodo ul, applicata all'Ergodico;
  • ul - un periodo EMA di una linea di segnale - secondo William Blau, il valore ul deve essere uguale al periodo dell'ultimo significativo (>1) dell’EMA ergodica.
5.3.2. Ergodic_DTI(q,r,s,u,ul) - Oscillatore DTI ergodico. Specifiche
  • Nome del File: Blau_Ergodic_DTI.mq5
  • Nome: Ergodic DTI-Oscillator (basato sul Directional Trend Index) di William Blau.
  • Parametri di Input:
    • graphic plot #0 - ergodico (indice del trend direzionale):
      • q - il periodo per il quale viene calcolato l'HLM (di default q = 2);
      • r - periodo della 1a EMA, per quanto riguarda l'HLM (di default r = 20);
      • s - periodo della 2a EMA, rispetto ai risultati del primo smoothing (di default s = 5);
      • u - periodo della 3a EMA, rispetto al risultato del secondo smoothing (di default, u = 3);
    • costruzione grafica # 1 - la linea di segnale:
      • ul - punto linea di segnale EMA, viene applicato all'ergodico (di default ul = 3);
  • Inoltre:
    • visualizzato in una finestra separata;
    • modificare lo stile di rendering di ogni plotting grafico - il colore, lo spessore, lo stile della linea (la scheda "Colori");
    • due livelli (per impostazione predefinita -25 e +25) - aggiungi / rimuovi un livello, cambia il valore, la descrizione del livello, cambia lo stile di rendering dei livelli (la scheda "Livelli");
    • modificare i limiti inferiore (per impostazione predefinita -100) e superiore (per impostazione predefinita 100) della scala della finestra del singolo indicatore (la scheda "Scala").
  • Limitazioni:
    • q>0;
    • r>0, s>0, u>0. Se r, s o u sono uguali a 1, lo smoothing EMA non viene utilizzato;
    • ul>0. Se ul = 1, allora la linea del segnale coincide con l'ergodico;
    • la dimensione minima dell'array di prezzi = (q-1 + r + s + u + ul-4 +1).


5.4. Il codice dell'oscillatore Ergodico DTI

L'indicatore Ergodic_DTI (q,r,s,u,ul):

1) Il collegamento tra l’array di indicatori, i buffer di indicatori e i plot grafici:

//--- 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) Algoritmo di calcolo di HLM e |HML|:

//--- 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]);
     }

Conclusione

La prima parte dell'articolo "indicatori di William Blau Indicators e Sistemi di Trading Systems su MQL5. Parte 1: Indicatori" fornisce una descrizione degli indicatori e degli oscillatori sviluppati in MQL5, dal libro "Momentum, Direction, and Divergence" di William Blau.

L'uso di questi indicatori e oscillatori quando si prendono decisioni di trading sarà descritto nella seconda parte dell'articolo "indicatori di William Blau Indicators e Sistemi di Trading Systems su MQL5. Parte 2: Sistemi di Trading".

 

I contenuto dell'archivio allegato a questo articolo ("Blau_Indicators_MQL5_en.zip"):

File Descrizione
File incluso. Posizione: "terminal_data_folder\MQL5\Include"
 WilliamBlau.mqh  
Indicatori. Posizione: "terminal_data_folder\MQL5\Indicators"
   Indicatori, basati sul Momentum
 Blau_Mtm.mq5  L'indicatore Momentum (momentum q-period, momentum q-period smussato)
 Blau_TSI.mq5  Il True Strength Index (Momentum normalizzato del periodo q smussato)
 Blau_Ergodic.mq5  Oscillatore Ergodico (basato sul true strength index)
   Indicatori, basati sullo Stocastico
 Blau_TStoch.mq5  Stocastico (stocastico q-period, q-period stocastico smussato)
 Blau_TStochI.mq5  Indice stocastico (stocastico q-period normalizzato smussato)
 Blau_TS_Stochastic.mq5  Oscillatore Stocastico TS (basato sull'Indice Stocastico)
   Indicatori, basati sul Momentum Stocastico
 Blau_SM.mq5  Momentum Stocastico (Q-period Stochastic Momentum, q-period Stochastic Momentum smussato)
 Blau_SMI.mq5  Stochastic Momentum Index ( q-stochastic momentum RSI normalizzato smussato)
 Blau_SM_Stochastic.mq5  Oscillatore Stocastico SM (basato sull'indice Momentum Stocastico)
   Indicatori, basati su una deviazione dall'andamento del mercato
 Blau_MDI.mq5  Indicatore di Deviazione Media (Deviazione Media, Deviazione Media Smussata)
 Blau_Ergodic_MDI.mq5  Oscillatore MDI Ergodico (basato sull'Indicatore di Deviazione Media)
   Indicatori basati sulla Convergenza/Divergenza della Media Mobile
 Blau_MACD.mq5  Indicatore della convergenza/divergenza delle medie mobili (MACD;MACD; MACD smussato)
 Blau_Ergodic_MACD.mq5  Oscillatore MACD ergodico (basato sull'indicatore MACD)
   Indicatori, basati sul Candlestick Momentum
 Blau_CMtm.mq5  Candlestick Momentum Indicator (q-period Candlestick Momentum, q-periodCandlestick Momentum)
 Blau_CMI.mq5  Candlestick Momentum Index (Candlestick Momentum q-period normalizzato smussato ; normalizzato dal valore assoluto del Candlestick Momentum q-period)
 Blau_CSI.mq5  Il Candlestick Index (q-period Candlestick normalizzato smussato; normalizzazione per la lunghezza del candlestick q-period)
 Blau_Ergodic_CMI.mq5  Oscillatore CMI ergodico (basato sul Candlestick Momentum Index)
 Blau_Ergodic_CSI.mq5  Oscillatore CSI ergodico (basato sul Candlestick Index)
   Indicatori, basati sul Momentum Composite
 Blau_HLM.mq5  Indicatore di Chiusura Virtuale (q-period Composite High-Low Momentum; ilq-period Composite High-Low Momentum)
 Blau_DTI.mq5  Indice di un trend direzionale (q-period Composite High-Low Momentum normalizzato smussato)
 Blau_Ergodic_DTI.mq5  Oscillatore DTI ergodico (basato sull'Indice di Tendenza Direzionale)

Tradotto dal russo da MetaQuotes Ltd.
Articolo originale: https://www.mql5.com/ru/articles/190

File allegati |
Uso delle Risorse in MQL5 Uso delle Risorse in MQL5
I programmi MQL5 non solo automatizzano i calcoli di routine, ma possono anche creare un ambiente grafico completo. Le funzioni per la creazione di controlli realmente interattivi sono ora virtualmente altrettanto ricche, come quelle nei classici linguaggi di programmazione. Se vuoi scrivere un programma autonomo completo in MQL5, utilizzare le risorse al loro interno. I programmi con risorse sono più facili da mantenere e distribuire.
Costruire un Analizzatore di Spettro Costruire un Analizzatore di Spettro
Questo articolo ha lo scopo di far conoscere ai suoi lettori una possibile variante dell'utilizzo di oggetti grafici del linguaggio MQL5. Analizza un indicatore, che implementa un pannello di gestione di un semplice analizzatore di spettro utilizzando gli oggetti grafici. L'articolo è pensato per i lettori che hanno acquisito le basi di MQL5.
Crea i Tuoi Pannelli Grafici in MQL5 Crea i Tuoi Pannelli Grafici in MQL5
L'usabilità del programma MQL5 è determinata sia dalla sua ricca funzionalità che da un'elaborata interfaccia utente grafica. La percezione visiva a volte è più importante del funzionamento rapido e stabile. Ecco una guida step-by-step per la creazione di pannelli di visualizzazione sulla base delle classi della Libreria Standard.
Media delle Serie di Prezzi per i Calcoli Intermedi Senza Utilizzare Buffer Aggiuntivi Media delle Serie di Prezzi per i Calcoli Intermedi Senza Utilizzare Buffer Aggiuntivi
Questo articolo riguarda gli algoritmi di media tradizionali e insoliti racchiusi in classi più semplici e di singolo tipo. Sono destinati all'uso universale in quasi tutti gli sviluppi degli indicatori. Spero che le lezioni suggerite siano una buona alternativa alle chiamate "ingombranti" di indicatori personalizzati e tecnici.