English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Türkçe
Indicatori tecnici e filtri digitali

Indicatori tecnici e filtri digitali

MetaTrader 5Integrazione | 11 gennaio 2022, 17:08
118 0
GT788
[Eliminato]

Introduzione

Per diversi anni, Code Base ha accumulato un gran numero di indicatori. Molti di loro sono copie l'uno dell'altro con solo lievi modifiche. Dopo molte ore di confronto visivo degli indicatori sul grafico, non potevamo fare a meno di chiederci: "È possibile trovare un modo di confronto più oggettivo ed efficiente?" È possibile, infatti. Dovremmo ammettere che un indicatore è un filtro digitale. Passiamo a Wikipedia.

Filter (chimica), un dispositivo (di solito una membrana o uno strato) progettato per bloccare fisicamente determinati oggetti o sostanze lasciandone passare altri.

Sei d'accordo che gli indicatori consentono di bloccare alcuni oggetti "non necessari" e si concentrano su quelli critici? Vediamo ora cos'è un filtro digitale.

In elettronica, informatica e matematica, un filtro digitale è un sistema che esegue operazioni matematiche su un segnale campionato a tempo discreto per ridurre o migliorare determinati aspetti di quel segnale.

In altre parole, un filtro digitale è un filtro che elabora segnali discreti. I prezzi che vediamo nel terminale possono essere trattati come segnali discreti, in quanto i loro valori vengono registrati non continuamente ma per un certo periodo di tempo. Ad esempio, il valore del prezzo viene registrato ogni ora sul grafico H1, mentre viene fatto una volta ogni 5 minuti su M5. Molti indicatori possono essere trattati come filtri lineari. Questo è esattamente il tipo di indicatori discussi nel presente articolo. 

Ora, quando abbiamo scoperto che si tratta di filtri digitali, esaminiamo la teoria per definire quali parametri dovrebbero essere confrontati.


1. Frequenze e periodi

Prima di tutto, devo ricordare che qualsiasi curva può essere rappresentata come una somma di onde sinusoidali.

Periodo di vibrazione è l'intervallo di tempo tra due passaggi successivi di un corpo attraverso la stessa posizione e nella stessa direzione. Questo valore è reciproco alla frequenza.

Questa definizione può essere più facilmente compresa utilizzando un'onda sinusoidale. Consideriamo un periodo pari a 10 conteggi. Eseguiremo il calcolo in barre per semplicità.

Fig. 1 

 Fig. 1. Segnale periodico campione

Come si vede, la linea completa l'intero ciclo entro 10 conteggi, mentre l'undicesima battuta è il primo punto del nuovo ciclo.

Qual è la frequenza dell'onda sinusoidale? La definizione afferma che il periodo è un valore reciproco alla frequenza. Quindi, se il periodo è uguale a 10 (barre), la frequenza sarà 1/10=0.1 (1/bar).

In fisica, i periodi (T) sono misurati in secondi (s), mentre le frequenze (f) - in Hertz (Hz). Se abbiamo a che fare con un lasso di tempo minuto, allora T=60*10=600 secondi, mentre f=1/Т=1/600=0,001667 Hz. Herz e secondi sono usati principalmente nei filtri analogici. In quelli digitali, di solito vengono utilizzati i conteggi (nel modo in cui abbiamo usato le barre). Se necessario, vengono moltiplicati per la quantità necessaria di secondi.

Potresti chiederti, cosa ha a che fare con le onde sinusoidali? Le onde sinusoidali sono necessarie per spiegare il significato fisico dei filtri e il passaggio alle frequenze, poiché questo concetto viene utilizzato nelle opere appropriate. Ora, prendiamo 7 onde sinusoidali invece di una con periodi da 10 a 70 e un passo di 10 battute. Le barre nella sottofinestra superiore in Fig. 2 servono come guida per stimare visivamente il numero di conteggi.

Fig. 2 

 Fig. 2. Sette onde sinusoidali della stessa ampiezza con periodi di 10, 20, ... 70 barre

La scala è abbastanza grande ma è ancora possibile confondersi. Ed è molto più facile confondersi, se abbiamo molte più onde sinusoidali.

La somma delle onde sinusoidali è visualizzata di seguito:

Fig. 3  

Fig. 3. La somma di sette onde sinusoidali mostrate in Fig. 2

Le frequenze sono mostrate nel modo seguente:

 Fig. 4 

Fig. 4. Lo spettro della somma delle onde sinusoidali (in frequenze)

7 conteggi sono sufficienti per visualizzare 7 onde sinusoidali. Attenzione ai colori, corrispondono alla figura precedente. Le onde sinusoidali lente sono seguite da quelle veloci. La frequenza più bassa possibile è 0 (componente costante), mentre quella più alta è 0,5 (1/bar). Il caso sarà il contrario per i periodi.

 Fig. 5

 Fig. 5. Lo spettro della somma delle onde sinusoidali (in periodi)

Ricordiamo che la frequenza è pari a 1/periodo. Pertanto, il periodo dovrebbe essere compreso tra 2 e infinito. Perché 0,5 e 2? Un'onda sinusoidale può essere descritta da almeno due conteggi (vedi Teorema di campionamento di Nyquist-Shannon). Per ripristinare il segnale analogico (continuo), abbiamo bisogno di due o più conteggi per un'onda sinusoidale (0,5 viene ricevuto da 1/2).

Consideriamo la seguente tabella per evitare confusione con periodi e frequenze:

Periodo
  
 100     50
   16
  10
   4
   2
Frequenza
0
 0.01 
 0.02 
0.0625
  0.1 
 0.25 
  0.5 

 

Abbiamo esaminato i concetti di periodo e frequenza, poiché queste sono le cose fondamentali. Tutte le ulteriori informazioni sono associate a questi termini.

 

2. Filtri digitali

Quindi, siamo finalmente pronti per discutere dei filtri. Supponiamo di dover rimuovere le onde sinusoidali aventi un periodo inferiore a 50.

Fig. 6 

 Fig. 6. Componenti lente (bassa frequenza) della somma delle onde sinusoidali (periodi di 50, 60 e 70 barre)

È tutto relativamente facile quando conosciamo i componenti iniziali. Ma se conoscessimo solo la somma? In questo caso, abbiamo bisogno di un filtro passa basso (LPF) con una frequenza di taglio di 1/45 (1/bar).

Il risultato della filtrazione sarà il seguente:

Fig. 7 

 Fig. 7. Risultato della filtrazione della somma delle onde sinusoidali (linea blu) utilizzando LPF

Ora, lasciamo che solo le mogli seno abbiano i periodi di 10, 20 e 30. Per fare ciò, dovremmo usare un filtro passa-alto (HPF) con una frequenza di taglio di 1/35 (1/bar). 

Fig. 8 

 Fig. 8. Componenti ad alta frequenza della somma delle onde sinusoidali (periodi di 10, 20 e 30 bar)

Fig. 9 

Fig. 9. Risultato della filtrazione della somma delle onde sinusoidali (linea blu) utilizzando HPF

Per lasciare i periodi di 30, 40 e 50, abbiamo bisogno di un filtro di larghezza di banda (BF) con frequenze di taglio di 1/25 e 1/55 (1/bar). 

Fig. 10 

 Fig. 10. Linee seno con periodi di 30, 40 e 50 bar

 

Fig. 11 

Fig. 11. Risultato della filtrazione della larghezza di banda della somma delle onde sinusoidali (30-50 bar)

Se vogliamo rimuovere i periodi di 30, 40 e 50, abbiamo bisogno di un filtro band-stop (rifiuto) con le stesse frequenze di taglio 1/25 e 1/55 (1/bar). 

Fig. 12 

Fig. 12. Onde sinusoidali con i periodi di 10, 20, 60 e 70 bar

 

Fig. 13 

Fig. 13. Il risultato dell'operazione del filtro di reiezione (30-50 bar) a seconda della somma delle onde sinusoidali

Riassumiamo i risultati intermedi nell'immagine sottostante: 

Fig. 14
 

Fig. 14. Parametri di frequenza dei filtri ideali: frequenze inferiori (LPF), frequenze superiori (HPF), larghezza di banda (BF) e reiezione (RF)

I filtri esaminati sopra sono idealizzati. La realtà è molto più diversa.

 Fig. 15 

Fig. 15. Banda di transizione nei filtri

Esiste una banda di transizione tra le bande di accettazione e quelle di attenuazione. La sua pendenza è misurata in dB/ottava o dB/decade. L'ottava è un segmento tra il valore casuale della frequenza e il suo valore doppio. Decennio è un segmento tra il valore casuale della frequenza e il suo valore di dieci volte. Formalmente, la banda di transizione si trova tra la frequenza di taglio e la banda di attenuazione. Guardando al futuro, dovrei dire che la frequenza di taglio dello spettro è più spesso definita dal livello di 3 dB.

La reiezione fuori banda è la soppressione delle frequenze nella banda di attenuazione misurata in decibel.

I battiti vengono rilevati nella banda di accettazione. Trattandosi di filtri reali, cioè distorsioni alla banda di accettazione, alcune frequenze sono maggiori per la loro ampiezza, mentre altre sono più basse. Il valore è misurato in decibel.

La tabella seguente può aiutarti a rendere il valore in dB:

dB
Rapporto di ampiezza
0.5    
1.06
1
1.12
3
1.41
6 2
10
3.16
20 10
30 31.6
40
100
60  1000

 

Ad esempio, se vogliamo ricevere il risultato per 60 dB, possiamo trovare i valori per 20 e 40 dB e moltiplicarli.

Ora che conosciamo i parametri base del filtro, passiamo alla parte pratica dell'articolo.


3. Alla ricerca del kernel

Possiamo dire che il filtro digitale è completamente descritto dalla sua risposta all'impulso (kernel). La risposta all'impulso è la risposta di un filtro a un singolo impulso. I filtri possono essere di IIR (risposta all'impulso infinita, ad esempio Exponential Moving Average, EMA) e FIR (risposta all'impulso finita, ad esempio, Simple Moving Average, SMA). 

Ora possiamo concentrare la nostra attenzione su MetaEditor. Per prima cosa, creiamo un singolo impulso. Sarà un indicatore molto semplice che mostrerà un solo conteggio uguale a uno. In MetaEditor, fai clic su Nuovo, seleziona "Indicatore personalizzato" e fai clic su Avanti:

Fig. 16
 

Fig. 16. Creazione di un indicatore personalizzato in MQL5 Wizard

Specifica "Impulso" come nome:

Fig. 17
 

Fig. 17. Proprietà generali dell'indicatore

Seleziona il gestore dell'evento:

Fig. 18
 

 Fig. 18. Gestori di eventi dell'indicatore

Ora, dovremmo aggiungere la linea dell'indicatore e visualizzarla in una finestra separata. tutto è pronto

 Fig. 19

 Fig. 19. Proprietà del disegno dell'indicatore

Il codice dell'indicatore ha il seguente aspetto:

//+------------------------------------------------------------------+
//|                                                      Impulse.mq5 |
//|                        Copyright 2012, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters

//--- indicator buffers
double         Label1Buffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,Label1Buffer,INDICATOR_DATA);
   ArraySetAsSeries(Label1Buffer,true);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
              const int prev_calculated,
              const int begin,
              const double &price[])
  {
//---
   ArrayInitialize(Label1Buffer,0.0);
   Label1Buffer[1023]=1.;
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Aggiungi quanto segue alla funzione OnInit():

ArraySetAsSeries(Label1Buffer,true);

in modo che l'indicizzazione venga eseguita dalla fine dell'array.

In OnCalculate()

ArrayInitialize(Label1Buffer,0.0);
Label1Buffer[1023]=1.;

Azzera tutti i valori e aggiungiamo da 1 a 1023a cella dell'array dell'indicatore.

Compila (F7) e ricevi il seguente risultato: 

Fig. 20 

 Fig. 20. Indicatore di impulso

Ora, se applichiamo qualche indicatore, siamo in grado di vedere la sua risposta all'impulso fino a 1024 conteggi (vedi esempi).

Naturalmente, è fantastico visualizzare il kernel del filtro, ma è possibile ottenere più dati solo dalla rappresentazione nel dominio della frequenza. Per fare ciò, dobbiamo creare un analizzatore di spettro o utilizzare una soluzione già pronta senza troppi sforzi. Selezioniamo la seconda opzione e utilizziamo l'indicatore SpecAnalyzer descritto nell'articolo "Costruire un analizzatore di spettro".

L'indicatore viene visualizzato di seguito:

Fig. 21 

Fig. 21. SpecAnalyzer

Alcuni lavori preparatori sono necessari prima di utilizzarlo. Tutti i passaggi necessari sono descritti di seguito.


4. Adattamento per analizzatore di spettro

Il pulsante "Dati esterni" consente di utilizzare i dati dall'indicatore SAInpData.

L'originale contiene l'array che rappresenta il kernel del filtro. Stiamo per rifare il file, in modo che sia possibile passare qualsiasi indicatore grafico all'analizzatore di spettro. Le modalità automatica e manuale devono essere fornite nell'indicatore modificato. Nella modalità automatica, viene utilizzato il primo indicatore grafico da trovare. Nella modalità manuale, gli utenti possono impostare una sottofinestra e un indice dell'indicatore nell'elenco. In questo caso, l'indicatore di impulso deve essere aggiunto manualmente al grafico. Successivamente, viene applicato l'indicatore necessario per ricevere il kernel.

Iniziamo. Dovremmo creare un nuovo indicatore seguendo lo stesso algoritmo, come con Impulse. Aggiungi i parametri di input:

input bool Automatic=true; // Autosearch
input int  Window=0;       // Subwindow index
input int  Indicator=0;    // Indicator index

Se Automatic=true, viene utilizzata la modalità automatica, mentre gli altri parametri di input vengono ignorati. Se Automatic=false, viene utilizzata la modalità manuale con sottofinestra e indice dell'indicatore.

Successivamente, dovremmo aggiungere variabili di tipo intero a livello globale per memorizzare gli handle.

int Impulse=0; // single impulse's handle
int Handle=0;  // required indicator's handle
int Kernel=0;  // filter kernel's handle

L'impugnatura dell'indicatore di impulso deve essere conservata in Impulse. L'handle dell'indicatore, il cui kernel vogliamo visualizzare nell'analizzatore di spettro, deve essere memorizzato in Handle. L'handle dell'indicatore di destinazione, che è costruito sulla base dell'indicatore Impulse, o, in altre parole, il kernel dell'indicatore di destinazione deve essere memorizzato nel kernel.

OnInit() funzione:

int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,DataBuffer,INDICATOR_DATA);

   Impulse=iCustom(NULL,0,"SpecAnalyzer\\Impulse");//get the single impulse handle
   if(Impulse==INVALID_HANDLE)
     {
      Alert("Impulse initialization failed"); 
       return(INIT_FAILED);
     }
//---
   return(0);
  }

Poiché l'indicatore Impulse non viene modificato durante l'operazione del programma, l'handle dell'indicatore dovrebbe essere ricevuto nella funzione OnInit(). Inoltre, è necessario controllare l'errore di ricezione dell'handle. In caso di errore, viene visualizzato il messaggio "Inizializzazione impulso fallita" e il funzionamento dell'indicatore viene interrotto con il tasto INIT_FAILED.

OnDeinit() funzione:

void OnDeinit(const int reason)
  {
//--- delete the indicators
   IndicatorRelease(Impulse);
   IndicatorRelease(Handle);
   IndicatorRelease(Kernel);
  }

Gli indicatori utilizzati vengono eliminati nella funzione OnDeinit().

funzione OnCalculate():

static bool Flag=false;        //error flag
if(Flag) return(rates_total); //exit in case of the flag

La variabile statica flag viene aggiunta all'inizio della funzione. Se si verificano errori durante l'esecuzione del programma, Flag è uguale a true e tutte le ulteriori iterazioni delle funzioni OnCalculate() vengono interrotte dall'inizio.

Di seguito il blocco di codice associato alla modalità manuale:

   string Name;  //short name of the required indicator
   if(!Automatic)//in case of the manual mode
     {
      if(ChartIndicatorsTotal(0,Window)>0)//if an indicator is present
        {
         Name=ChartIndicatorName(0,Window,Indicator);//search for its name
         Handle=ChartIndicatorGet(0,Window,Name);//search for the handle
        }
      else//otherwise
        {
         Alert("No indicator");
         Flag=true;
         return(rates_total);
        }

      if(Handle==INVALID_HANDLE)//in case of a handle receiving error
        {
         Alert("No indicator");
         Flag=true;
         return(rates_total);
        }

      CopyBuffer(Handle,0,0,1024,DataBuffer);//display the kernel on the chart
      return(rates_total);
     }

Se Automatic=false, viene avviata la modalità manuale. Viene verificata la presenza dell'indicatore. In caso di successo, iniziamo a cercare un nome e un handle, controllando l'handle per errori, copiando i dati nel buffer dell'indicatore. In caso di errore, viene visualizzato il messaggio "Nessun indicatore", Flag viene impostato su true, l'esecuzione della funzione OnCalculate() viene interrotta.

Il blocco della modalità automatica è molto più interessante. Consiste nella ricerca di un indicatore sul grafico e nella creazione di un kernel.

Quindi, consideriamo la ricerca di un indicatore. L'obiettivo principale è ricevere una maniglia.

   if(ChartIndicatorsTotal(0,0)>0)//if the indicator is in the main window
     {
      Name=ChartIndicatorName(0,0,0);//search for its name
      if(Name!="SpecAnalyzer")//if it is not SpecAnalyzer
         Handle=ChartIndicatorGet(0,0,Name);//look for a handle
      else
        {
         Alert("Indicator not found");
         Flag=true;
         return(rates_total);
        }
     }
   else//otherwise
   if(ChartIndicatorsTotal(0,1)>0)//if the indicator is in the first subwindow
     {
      Name=ChartIndicatorName(0,1,0);//search for its name
      if(Name!="SAInpData")//if it is not SAInpData
         Handle=ChartIndicatorGet(0,1,Name);//look for a handle
      else//otherwise
        {
         Alert("Indicator not found");
         Flag=true;
         return(rates_total);
        }
     }

   if(Handle==INVALID_HANDLE)//in case of a handle receiving error
     {
      Alert("No indicator");
      Flag=true;
      return(rates_total);
     }

Innanzitutto, cerchiamo un indicatore nella finestra secondaria principale del grafico e ci assicuriamo che non sia SpecAnalyzer. Se non viene trovato alcun indicatore nella finestra principale, lo cerchiamo nella sottofinestra successiva (considerando che qui potrebbe esserci SAInpData). Tutte le altre azioni sono simili alla modalità manuale.

Creiamo un indicatore. Dovremmo ricevere i parametri dell'indicatore ottenuto e creare un indicatore simile basato su Impulse:

   ENUM_INDICATOR indicator_type;//obtained indicator's type
   MqlParam parameters[];      //parameters
   int parameters_cnt=0;      //number of parameters

//--- receive the indicator's type, parameter values and amount
   parameters_cnt=IndicatorParameters(Handle,indicator_type,parameters);
//--- define that a single impulse is to be sent to the indicator's input
   parameters[parameters_cnt-1].integer_value=Impulse;
//--- receive the indicator's handle from the single impulse - filter's kernel
   Kernel=IndicatorCreate(NULL,0,indicator_type,parameters_cnt,parameters);

   if(Kernel==INVALID_HANDLE)//in case of a handle receiving error
     {
      Alert("Kernel initialization failed");
      Flag=true;
      return(rates_total);
     }

   CopyBuffer(Kernel,0,0,1024,DataBuffer);//display the kernel on the chart

tipo_indicatore - la variabile del tipo speciale ENUM_INDICATOR enumerato. La variabile è progettata per ricevere il tipo di indicatore.

parametri[] - l'array di tipo MqlParam, struttura speciale per l'archiviazione e il trasferimento dei parametri dell'indicatore.

La funzione IndicatorParameters consente di ricevere dati sull'indicatore grafico. Quindi, implementiamo lievi modifiche all'array dei parametri. L'handle dell'indicatore di impulso è incluso nell'ultima cella in cui il nome della serie temporale (chiuso, basso, handle e così via) è memorizzato nel campo integer_value. Quindi, usiamo la funzione IndicatorCreate per creare un nuovo indicatore che è anche un kernel. Ora, dovremmo controllare l'handle e visualizzare il kernel sul grafico.

Anche l'indicatore SpecAnalyzer è stato leggermente modificato. Sono stati aggiunti i seguenti parametri di input:

input bool Automatic=true; //Autosearch
input int Window=0;        //Subwindow index
input int Indicator=0;    //Indicator index

Anche la chiamata SAInpData è stata modificata:

ExtHandle=iCustom(NULL,0,"SpecAnalyzer\\SAInpData",Automatoc,Window,Indicator);

SAInpData può essere utilizzato da solo per visualizzare la risposta all'impulso.

 

5. Esempi

Per far funzionare le cose, incolla la cartella SpecAnalyzer in MetaTrader 5\MQL5\Indicators. Avvia MetaTrader 5, apri un nuovo grafico EURUSD:

Fig. 22

Fig. 22. Aprire un nuovo grafico EURUSD

Ora applichiamo l'indicatore necessario, ad esempio MA(16):

Fig. 23

Fig. 23. Applicazione dell'indicatore della media mobile al grafico EURUSD

Avvia SpecAnalyzer:

Fig. 24

Fig. 24. Avvio di SpecAnalyzer

Viene visualizzata la finestra dei parametri:

Fig. 25

Fig. 25. Parametri dell'indicatore SpecAnalyzer

Per la modalità automatica, fai clic su OK. In modalità manuale, true dovrebbe essere sostituito con false e dovrebbe essere specificata la posizione di un indicatore necessario.

Quindi, abbiamo fatto clic su OK. Fare clic su "Dati esterni" nella finestra Analizzatore di spettro appena apparsa:

Fig. 26

Fig. 26. Selezione dei dati di input per l'indicatore SpecAnalyzer

Ora, pensiamo a lavorare in modalità manuale. Innanzitutto, dovremmo aggiungere l'indicatore Impulse al grafico:

Fig. 27

Fig. 27. Aggiunta dell'indicatore di impulso

Quindi, dovremmo usare questo indicatore per generare quello target. Per fare ciò, dovremmo trascinare l'indicatore con il mouse nella finestra Impulse e selezionare i dati dell'indicatore precedente nel campo "Applica a" dei parametri:

Fig. 28

Fig. 28. Generazione dell'indicatore della media mobile utilizzando i dati dell'indicatore di impulso

Si dovrebbe ottenere il seguente risultato:

Fig. 29 

Fig. 29. Risultato del calcolo dell'indicatore della media mobile su un singolo impulso

Ora, fai clic con il pulsante destro del mouse per visualizzare l'elenco degli indicatori:

Fig. 30

Fig. 30. Indicatori nella lista

Il nostro indicatore si trova nella sottofinestra 1 e ha il numero di serie 1 (non dimenticare che l'indicizzazione parte da zero, non da uno). Ora lanciamo SpecAnalyzer. Imposta false, 1, 1. Fare clic su "Dati esterni".

Le proprietà dell'indicatore possono essere modificate al volo. Prova a modificare il periodo utilizzando l'elenco degli indicatori e osserva come risponde l'analizzatore di spettro. 

Prima di passare agli esempi, è necessario menzionare una caratteristica dell'indicatore SpecAnalyzer. Le letture sulla sua scala non sono periodi ma segni della griglia di frequenza. L'analizzatore di spettro funziona con il kernel che ha una lunghezza fino a 1024 letture. Significa che il passo della frequenza di rete è pari a 1/1024=0,0009765625. Pertanto, il valore di 128 sulla scala corrisponde alla frequenza di 0,125 o al periodo di 8.

Scale
Periodo
16   64
32   32
64   16
128
8
256
4
384
2.67
512
2

SMA (16)

 Fig. 31

Fig. 31. Risposta all'impulso dell'indicatore della media mobile semplice (filtro FIR)

Fig. 32 

Fig. 32. Risposta in frequenza dell'indicatore della media mobile semplice

Possiamo vedere che questo è un filtro passa-basso, poiché prevalgono le basse frequenze. La soppressione nella banda di attenuazione è scarsa.

  

EMA (16)

Fig. 33

Fig. 33. Risposta all'impulso dell'indicatore della media mobile esponenziale (filtro IIR)

Fig. 34 

Fig. 34. Risposta in frequenza dell'indicatore della media mobile esponenziale

L'indicatore della media mobile esponenziale è anche un filtro passa basso. La linea è abbastanza liscia ma, a differenza dell'indicatore precedente, la banda di transizione è più ampia. La soppressione è approssimativamente la stessa.

Esaminiamo ora i risultati del filtro digitale universale.

Filtro passa basso

Fig. 35

Fig. 35. La risposta all'impulso (kernel) del filtro passa basso

Fig. 36

Fig. 36. La risposta in frequenza del filtro passa basso

Filtro passa alto

 Fig. 37 

Fig. 37. La risposta all'impulso (kernel) del filtro passa-alto

 

 Fig. 38 

Fig. 38. La risposta in frequenza del filtro passa-alto

 

Filtro passa banda

 Fig. 39 

Fig. 39. La risposta all'impulso (kernel) del filtro passa banda

 

Fig. 40 

  Fig. 40. La risposta in frequenza del filtro passa banda


Conclusione

In conclusione, va notato che i parametri del filtro sono fortemente interconnessi. Migliorare alcuni di essi implica il deterioramento degli altri. Pertanto, i parametri dovrebbero essere selezionati in base all'attività da svolgere.

Ad esempio, se si desidera una maggiore soppressione delle frequenze nella banda di attenuazione, è necessario sacrificare la pendenza della curva verso il basso. Se entrambi i parametri dovrebbero essere buoni, allora dobbiamo aumentare la lunghezza del kernel, che a sua volta influenzerà il divario tra l'indicatore e il prezzo o aumenterà le distorsioni nella banda di accettazione.


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

File allegati |
specanalyzer.zip (9.68 KB)
Estensione della MQL5 Standard Library e riutilizzo del codice Estensione della MQL5 Standard Library e riutilizzo del codice
MQL5 Standard Library semplifica la tua vita come sviluppatore. Tuttavia, non implementa tutte le esigenze di tutti gli sviluppatori del mondo, quindi se ritieni di aver bisogno di altre personalizzazioni puoi fare un ulteriore passo avanti ed estendere. Questo articolo illustra l'integrazione dell'indicatore tecnico Zig-Zag di MetaQuotes nella Libreria standard. Ci ispiriamo alla filosofia di design di MetaQuotes per raggiungere il nostro obiettivo.
Aumenta all’ennesima potenza i tuoi sistemi di trading lineare Aumenta all’ennesima potenza i tuoi sistemi di trading lineare
L'articolo di oggi mostra ai programmatori MQL5 di livello intermedio come possono ottenere maggiori profitti dai loro sistemi di trading lineare (Fixed Lot) implementando facilmente la cosiddetta tecnica di esponenziazione. Questo perché la crescita della curva azionaria risultante è quindi geometrica, o esponenziale, assumendo la forma di una parabola. Nello specifico, implementeremo una pratica variante MQL5 del dimensionamento a posizione frazionaria fissa sviluppato da Ralph Vince.
Manuale MQL5: Salvataggio dei risultati di ottimizzazione di un Expert Advisor in base a criteri specificati Manuale MQL5: Salvataggio dei risultati di ottimizzazione di un Expert Advisor in base a criteri specificati
Continuiamo la serie di articoli sulla programmazione MQL5. Questa volta vedremo come ottenere i risultati di ogni passaggio di ottimizzazione proprio durante l'ottimizzazione dei parametri di Expert Advisor. L'implementazione sarà eseguita in modo da garantire che se le condizioni specificate nei parametri esterni sono soddisfatte, i valori di passaggio corrispondenti verranno scritti in un file. Oltre ai valori di test, salveremo anche i parametri che hanno portato a tali risultati.
Stupisci i tuoi clienti MQL5 con un cocktail di tecnologie! Stupisci i tuoi clienti MQL5 con un cocktail di tecnologie!
MQL5 fornisce ai programmatori un set molto completo di funzioni e API orientate agli oggetti grazie alle quali possono fare tutto ciò che vogliono all'interno dell'ambiente MetaTrader. Tuttavia, la tecnologia Web è uno strumento estremamente versatile al giorno d'oggi. Essa può venire in soccorso in alcune situazioni in cui è necessario fare qualcosa di molto specifico, oppure quando vuoi stupire i tuoi clienti con qualcosa di diverso o semplicemente quando non si ha abbastanza tempo per padroneggiare una parte specifica della libreria standard MT5. L'esercizio di oggi ti guida attraverso un esempio pratico su come puoi gestire il tuo tempo di sviluppo allo stesso tempo in cui crei anche un fantastico cocktail tecnologico.