![Indicatori tecnici e filtri digitali](https://c.mql5.com/i/articles/overlay.png)
Indicatori tecnici e filtri digitali
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. 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. 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. La somma di sette onde sinusoidali mostrate in Fig. 2
Le frequenze sono mostrate nel modo seguente:
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. 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. 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. 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. Componenti ad alta frequenza della somma delle onde sinusoidali (periodi di 10, 20 e 30 bar)
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. Linee seno con periodi di 30, 40 e 50 bar
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. Onde sinusoidali con i periodi di 10, 20, 60 e 70 bar
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. 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. 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. Creazione di un indicatore personalizzato in MQL5 Wizard
Specifica "Impulso" come nome:
Fig. 17. Proprietà generali dell'indicatore
Seleziona il gestore dell'evento:
Fig. 18. Gestori di eventi dell'indicatore
Ora, dovremmo aggiungere la linea dell'indicatore e visualizzarla in una finestra separata. tutto è pronto
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.
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. 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. 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. Aprire un nuovo grafico EURUSD
Ora applichiamo l'indicatore necessario, ad esempio MA(16):
Fig. 23. Applicazione dell'indicatore della media mobile al grafico EURUSD
Avvia SpecAnalyzer:
Fig. 24. Avvio di SpecAnalyzer
Viene visualizzata la finestra dei parametri:
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. 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. 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. Generazione dell'indicatore della media mobile utilizzando i dati dell'indicatore di impulso
Si dovrebbe ottenere il seguente risultato:
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. 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. Risposta all'impulso dell'indicatore della media mobile semplice (filtro FIR)
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. Risposta all'impulso dell'indicatore della media mobile esponenziale (filtro IIR)
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. La risposta all'impulso (kernel) del filtro passa basso
Fig. 36. La risposta in frequenza del filtro passa basso
Filtro passa alto
Fig. 37. La risposta all'impulso (kernel) del filtro passa-alto
Fig. 38. La risposta in frequenza del filtro passa-alto
Filtro passa banda
Fig. 39. La risposta all'impulso (kernel) del filtro passa banda
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
![Estensione della MQL5 Standard Library e riutilizzo del codice](https://c.mql5.com/2/0/regular-polyhedra-02.png)
![Aumenta all’ennesima potenza i tuoi sistemi di trading lineare](https://c.mql5.com/2/0/superman.png)
![Manuale MQL5: Salvataggio dei risultati di ottimizzazione di un Expert Advisor in base a criteri specificati](https://c.mql5.com/2/0/avatar__7.png)
![Stupisci i tuoi clienti MQL5 con un cocktail di tecnologie!](https://c.mql5.com/2/0/cocktails.png)
![MQL5 - Linguaggio delle strategie di trading integrato nel client terminal MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Accetti la politica del sito e le condizioni d’uso