
Come creare un indicatore Donchian Channel personalizzato utilizzando MQL5
Introduzione
In questo articolo parleremo di un concetto molto importante nel trading, ovvero l'identificazione del trend, e conosceremo uno strumento tecnico che può essere utile in tal senso, ovvero l'indicatore Donchian Channel. Questo indicatore è un trend following, come vedremo.
Tratteremo tutto questo attraverso i seguenti argomenti:
Definizione del Donchian Channel
In questa parte, identificheremo l'indicatore Donchian Channel e capiremo il concetto principale che vi è dietro per utilizzarlo in modo efficace. Il Donchian Channel è stato sviluppato dal trader Richard Donchian e il suo obiettivo principale è quello di identificare il trend, il che significa che si tratta di un indicatore trend-following e con latenza, in quanto segue le direzioni del trend e i movimenti dei prezzi. Consiste di tre linee, formando un canale che contiene i prezzi. La linea superiore del canale rappresenta il prezzo più alto registrato in un determinato periodo di tempo, la linea inferiore del canale rappresenta il prezzo più basso di un determinato periodo di tempo e la linea centrale rappresenta la metà della distanza tra le linee superiore e inferiore.
Il grafico seguente è un esempio di grafico del Donchian Channel:
Come possiamo vedere nel grafico precedente, c'è una linea al di sopra dei prezzi, un'altra al di sotto e una terza tra di esse. L'indicatore contiene o circonda i prezzi con linee superiori e inferiori, oltre ad un'altra linea centrale che può essere utile. In base a questa forma l'indicatore può essere utile nel trading, utilizzandolo in diverse strategie di identificazione del trend, dei breakout e dei livelli di supporto e resistenza, ad esempio.
Il concetto principale dell'utilizzo di questo indicatore consiste nell'osservare i massimi e i minimi dei prezzi in un determinato periodo di tempo per identificare le tendenze o la direzione per cui essere influenzati. Se il prezzo si trova al di sopra del massimo storico di un determinato periodo di tempo, indica che c'è una forza rialzista e può essere un segnale di acquisto. Se il prezzo è al di sotto del minimo storico di un determinato periodo, questo indica che c'è una forza ribassista e può essere un segnale di vendita. Quindi, una volta specificato un periodo di tempo e determinati i prezzi massimi e minimi, li osserveremo fino a quando i prezzi non si muoveranno in una direzione specifica verso l'alto o verso il basso e il segnale qui è la rottura del massimo o del minimo stabilito.
Questo indicatore può essere utilizzato per determinare i livelli di stop-loss e take-profit, il che è molto importante e utile nel trading in quanto elimina e riduce l'impostazione di livelli errati, in quanto i livelli dell'indicatore sono molto chiari e rappresentano livelli importanti soprattutto se si utilizzano parametri corretti. Quindi, ad esempio, il minimo del canale può essere utilizzato come livello di stop-loss di una posizione buy o come livello di take-profit di una posizione short. Ma il punto più alto del canale può essere utilizzato come stop-loss di una posizione short o come obiettivo di profitto di una posizione buy.
In base a quanto detto, forniremo il modo di calcolare questo indicatore con i semplici passaggi che seguono:
- Channel High (CH)= Il massimo storico degli ultimi N-periodi
- Channel Low (CL)= Il minimo storico degli ultimi N-periodi
- Linea mediana (ML)= (Canale Superiore+Canale Inferiore)/2
Quindi, è necessario determinare il periodo di tempo desiderato per individuare la direzione nel frangente, individuare il prezzo più alto e il prezzo più basso, tracciare una linea accanto ad essi per l'osservazione e ottenere la linea centrale calcolando la distanza dimezzata tra il livello più alto e quello più basso. È bene ricordare anche che esiste una differenza tra i Canali di Donchian e le Bande di Bollinger, perché i Canali di Donchian tracciano il massimo e il minimo storico di un determinato periodo di tempo, come abbiamo detto, mentre le Bande di Bollinger tracciano una media di un periodo di tempo dopo aver aggiunto e sottratto due deviazioni standard. Se avete bisogno di maggiori informazioni, potete leggere il mio precedente articolo sulle Bande di Bollinger per saperne di più a riguardo e su come creare un sistema di trading basato su di esse.
Come abbiamo visto, il concetto di questo indicatore è molto importante soprattutto per i trader che seguono il trend, in quanto aiuta a identificare chiaramente le tendenze e le direzioni, il che lo rende utile per lavorare e testare diverse strategie basate su questo indicatore, in quanto potrebbe essere un ottimo strumento per il nostro sistema di trading. È molto importante notare che sarà meglio utilizzare questo indicatore con altri indicatori tecnici significativi per ottenere approfondimenti e risultati migliori.
Donchian Channel Personalizzato
In questo argomento, condividerò un metodo che può essere utilizzato per creare un indicatore Donchian Channel personalizzato tramite MQL5. Creeremo l'indicatore con la forma di linea superiore, linea inferiore e linea centrale, come si può vedere nei passaggi seguenti.
Creare parametri aggiuntivi con i seguenti valori di identificazione:
- indicator_chart_window: per visualizzare l'indicatore nella finestra del grafico.
- indicator_buffers: per determinare il numero di buffer del calcolo dell'indicatore. Il numero sarà (3).
- indicator_plots: per determinare il numero di serie grafiche nell'indicatore. Il numero sarà (3).
#property indicator_chart_window #property indicator_buffers 3 #property indicator_plots 3
Creare due input, uno per il periodo e l'altro per il colore delle linee dell'indicatore, come di seguito indicato:
- Creare una variabile intera (indPeriod) e assegnare 20 come valore predefinito, ma può essere diverso a seconda dell'input dell'utente.
- Una variabile di tipo colore (indColor) e assegnare il colore blu come valore predefinito, ma può anche essere diverso in base all'input dell'utente.
input int indPeriod=20; //Period input color indColor=clrBlue; //Color
Creare variabili globali come le seguenti:
- array di tipo double per upperBuff, lowerBuff e middleBuff
- variabili di tipo double per upperLine, lowerLine e middleLine
- tipo integer per le variabili start e bar
double upperBuff[]; double lowerBuff[]; double middleBuff[]; double upperLine,lowerLine,middleLine; int start, bar;
Creare una funzione personalizzata dell'indicatore utilizzando void per non restituire nulla e creare una variabile indInit con tre parametri (index, buffer come array dinamico e label come stringa per ogni riga dell'indicatore). Nel corpo della funzione, faremo quanto segue:
- Utilizzando la funzione SetIndexBuffer che collega un indicatore specificato con l'array dinamico monodimensionale. I suoi parametri sono:
- index: per specificare il numero del buffer dell'indicatore. Utilizzeremo la variabile index.
- buffer[]: per determinare l'array dinamico creato che è il buffer[].
- data_type: per determinare il dato da memorizzare, che sarà il valore predefinito (INDICATOR_DATA).
- Utilizzando la funzione PlotIndexSetInteger cinque volte con diversi parametri prop-id e prop_value, come vedremo nel codice, questa funzione imposta il valore della linea dell'indicatore corrispondente. La proprietà dell'indicatore deve essere un numero intero. Tutti i suoi parametri sono uguali ai seguenti:
- plot_index: per determinare l'indice del tracciato grafico. Utilizzeremo la variabile index.
- prop_id: per determinare il valore dell'identificatore della proprietà che può essere uno degli ENUM_PLOT_PROPERT_INTEGER.
- prop_value: per determinare il valore della proprietà determinata nel prop_id.
- Utilizzando la funzione PlotIndexSetString si imposta il valore della proprietà stringa corrispondente dell’indicatore. I suoi parametri sono gli stessi della funzione PlotIndexSetInteger, ma la proprietà dell'indicatore qui, deve essere una stringa.
- Utilizzando la funzione PlotIndexSetDouble impostare il valore della proprietà double corrispondente dell’indicatore. Anche i parametri sono gli stessi, ma la proprietà dell'indicatore deve essere di tipo double.
void indInit(int index, double &buffer[],string label) { SetIndexBuffer(index,buffer,INDICATOR_DATA); PlotIndexSetInteger(index,PLOT_DRAW_TYPE,DRAW_LINE); PlotIndexSetInteger(index,PLOT_LINE_WIDTH,2); PlotIndexSetInteger(index,PLOT_DRAW_BEGIN,indPeriod-1); PlotIndexSetInteger(index,PLOT_SHIFT,1); PlotIndexSetInteger(index,PLOT_LINE_COLOR,indColor); PlotIndexSetString(index,PLOT_LABEL,label); PlotIndexSetDouble(index,PLOT_EMPTY_VALUE,EMPTY_VALUE); }
Successivamente, nel corpo di OnInit(), utilizzeremo la nostra funzione personalizzata dell'indicatore tre volte per le tre linee dell'indicatore e sarà uguale alla seguente:
indInit(0,upperBuff,"Donchian Channel"); indInit(1,lowerBuff,"Donchian Channel"); indInit(2,middleBuff,"Middle Donchian");
Utilizziamo la funzione IndicatorSetString per impostare l'etichetta di testo dell'indicatore.
IndicatorSetString(INDICATOR_SHORTNAME,"Donchian ("+IntegerToString(indPeriod)+")");
Nella parte OnCalculate, verranno eseguiti i seguenti passaggi per calcolare l'indicatore:
Verificare se rates_totals è inferiore al periodo+1 inserito dall'utente; in tal caso, il programma deve restituire zero.
if(rates_total<indPeriod+1) { return 0; }
Assegnare un valore alla variabile start utilizzando l'operatore ternario ?: - se start=prev_calculated==0 è true, l'operatore sarà impostato da indPeriod e se è false l'operatore sarà impostato da prev_calculated-1.
start=prev_calculated==0? indPeriod: prev_calculated-1;
Utilizzando la funzione for per creare un ciclo per calcolare l'indicatore, l'espressione 1 sarà (bar=start), l'espressione 2 sarà (bar < rates_total) e l'espressione 3 sarà (bar ++) per incrementare la barra di uno. L'operatore del ciclo for sarà uguale al seguente:
- Calcolo di upperLine mediante il rilevamento del valore massimo di high utilizzando la funzione ArrayMaximum che cerca il valore più alto nell'array.
- Calcolo di lowerLine individuando il valore minimo di low tramite la funzione ArrayMinimum che cerca il valore più basso nell'array.
- Calcolo della linea mediana mediante la divisione del risultato di upperLine più lowerLine per 2
- Assegnazione del valore di upperBuff[bar], lowerBuff[bar] e middleBuff[bar]
for(bar=start;bar<rates_total;bar++) { upperLine=high[ArrayMaximum(high,bar-indPeriod+1,indPeriod)]; lowerLine=low[ArrayMinimum(low,bar-indPeriod+1,indPeriod)]; middleLine=(upperLine+lowerLine)/2; upperBuff[bar]=upperLine-(upperLine-lowerLine); lowerBuff[bar]=lowerLine+(upperLine-lowerLine); middleBuff[bar]=middleLine; }
Di seguito è riportato il codice completo in un unico blocco:
#property indicator_chart_window #property indicator_buffers 3 #property indicator_plots 3 input int indPeriod=20; //Period input color indColor=clrBlue; //Color double upperBuff[]; double lowerBuff[]; double middleBuff[]; double upperLine,lowerLine,middleLine; int start, bar; void indInit(int index, double &buffer[],string label) { SetIndexBuffer(index,buffer,INDICATOR_DATA); PlotIndexSetInteger(index,PLOT_DRAW_TYPE,DRAW_LINE); PlotIndexSetInteger(index,PLOT_LINE_WIDTH,2); PlotIndexSetInteger(index,PLOT_DRAW_BEGIN,indPeriod-1); PlotIndexSetInteger(index,PLOT_SHIFT,1); PlotIndexSetInteger(index,PLOT_LINE_COLOR,indColor); PlotIndexSetString(index,PLOT_LABEL,label); PlotIndexSetDouble(index,PLOT_EMPTY_VALUE,EMPTY_VALUE); } int OnInit() { indInit(0,upperBuff,"Donchian Channel"); indInit(1,lowerBuff,"Donchian Channel"); indInit(2,middleBuff,"Middle Donchian"); IndicatorSetString(INDICATOR_SHORTNAME,"Donchian ("+IntegerToString(indPeriod)+")"); return(INIT_SUCCEEDED); } int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { if(rates_total<indPeriod+1) { return 0; } start=prev_calculated==0? indPeriod: prev_calculated-1; for(bar=start;bar<rates_total;bar++) { upperLine=high[ArrayMaximum(high,bar-indPeriod+1,indPeriod)]; lowerLine=low[ArrayMinimum(low,bar-indPeriod+1,indPeriod)]; middleLine=(upperLine+lowerLine)/2; upperBuff[bar]=upperLine-(upperLine-lowerLine); lowerBuff[bar]=lowerLine+(upperLine-lowerLine); middleBuff[bar]=middleLine; } return(rates_total); }
Dopo aver compilato questo codice, deve essere compilato senza errori o avvertimenti, quindi troveremo l'indicatore nella finestra Navigatore del terminale di trading nella cartella Indicatori ed eseguendolo, potremo trovare la finestra e inserire gli stessi input come di seguito:
Come si può vedere nell'immagine precedente, abbiamo due input:
- Period: per determinare la durata del tempo da utilizzare nel calcolo dell'indicatore. Il valore predefinito è 20, ma può essere aggiornato dall'utente.
- Color: per determinare il colore delle linee dell'indicatore. Il valore predefinito è blu, ma può anch’esso essere aggiornato.
Dopo aver determinato questi due input secondo le nostre preferenze e aver premuto OK, possiamo trovare l'indicatore allegato al grafico come il seguente
Come possiamo vedere nel grafico precedente, abbiamo tre linee dell'indicatore, due linee che circondano il prezzo dall'alto e dal basso formando un canale e una linea centrale che rappresenta la metà della distanza del canale.
EA Donchian Channel
In questa parte, dobbiamo utilizzare questo indicatore personalizzato Donchian Channel in un sistema di trading creando un Expert Advisor che possa essere usato per generare segnali basati sul movimento o sul comportamento dell'indicatore. Possiamo farlo utilizzando due metodi differenti: il primo consiste nello scrivere il codice del concetto dell’indicatore nell'EA oppure il secondo metodo consiste nell'utilizzare la funzione iCustom per allegare l'indicatore creato all'EA. In questa sede, progetteremo dei sistemi molto semplici solo per capire il concetto e come migliorare questi sistemi in base al secondo metodo, visto che abbiamo imparato a creare l'indicatore.
Di seguito sono riportati i dati relativi a questi EA:
Donchian Channel EA Semplice
Inizieremo a creare il primo sistema che può essere utilizzato che restituisce un commento sul grafico con i valori dell'indicatore (Channel High, Channel Middle e Channel Low). Pertanto, è necessario che il programma controlli e monitorizzi continuamente questi valori e li stampi sul grafico come commento.
Di seguito, i passaggi per creare questo tipo di EA:
Creare una variabile di input per il periodo dell'indicatore con un valore predefinito (20), ma che l'utente può aggiornare dagli input dell'EA.
input int indPeriod=20; //Period
Creare una variabile globale integer per donChianChannel.
int donchianChannel;
Nella parte OnInit(), aggiorneremo donchianChannel assegnandogli la funzione iCustom che restituisce l'handle dell'indicatore personalizzato creato Donchian Channel. I suoi parametri sono:
- symbol: per specificare il nome del simbolo, useremo _Symbol da applicare al simbolo corrente.
- period: per specificare il timeframe, si utilizzerà PERIOD_CURRENT da applicare al timeframe corrente
- name: per specificare il nome della stringa dell'indicatore e il suo percorso.
- Successivamente, specificare gli input dell'indicatore, ovvero il periodo dell'indicatore.
donchianChannel=iCustom(_Symbol,PERIOD_CURRENT,"My Files\\Donchian_Channel\\Donchian_Channel",indPeriod);
Nella parte OnDeinit(), utilizzeremo la funzione Print per restituire un messaggio nell'expert advisor con "Donchian Channel EA Removed" quando viene rimosso l'EA.
Print("Donchian Channel EA Removed");
Nella parte OnTick(), creeremo tre array per channelBuff, channelBuff1, middleBuff
double channelBuff[],channelBuff1[], middleBuff[];
Utilizzo della funzione CopyBuffer per ottenere i dati di ogni buffer dell'indicatore personalizzato Donchian Channel. I suoi parametri:
- indicator_handle: per specificare l'handle dell'indicatore, useremo l'handle creato donchianChannel per tutti e tre i buffer.
- buffer_num: per specificare il numero del buffer, sarà 0 per channelBuff, 1 per channelBuff1 e 2 per middleBuff.
- start_pos: per specificare la posizione del primo elemento da copiare, si usa 0 per tutti e tre i buffer.
- count: per specificare il numero di dati da copiare, useremo 3 per tutti e tre i buffer.
- buffer[]: per specificare l'array di destinazione in cui copiare, specificheremo i tre buffer (channelBuff, channelBuff1 e middleBuff).
CopyBuffer(donchianChannel,0,0,3,channelBuff); CopyBuffer(donchianChannel,1,0,3,channelBuff1); CopyBuffer(donchianChannel,2,0,3,middleBuff);
Definire i valori correnti di ogni linea dopo aver creato una variabile double per tutti.
double channelHigh=channelBuff1[0]; double channelMiddle=middleBuff[0]; double channelLow=channelBuff[0];
Usare la funzione Comment per restituire un commento sul grafico con tre valori e ciascuno in una riga separata.
Comment("Channel High: ",channelHigh,"\nChannel Middle: ",channelMiddle,"\nChannel Low: ",channelLow);
Di seguito è riportato il codice completo in un unico blocco
input int indPeriod=20; //Period int donchianChannel; int OnInit() { donchianChannel=iCustom(_Symbol,PERIOD_CURRENT,"My Files\\Donchian_Channel\\Donchian_Channel",indPeriod); return(INIT_SUCCEEDED); } void OnDeinit(const int reason) { Print("Donchian Channel EA Removed"); } void OnTick() { double channelBuff[],channelBuff1[], middleBuff[]; CopyBuffer(donchianChannel,0,0,3,channelBuff); CopyBuffer(donchianChannel,1,0,3,channelBuff1); CopyBuffer(donchianChannel,2,0,3,middleBuff); double channelHigh=channelBuff1[0]; double channelMiddle=middleBuff[0]; double channelLow=channelBuff[0]; Comment("Channel High: ",channelHigh,"\nChannel Middle: ",channelMiddle,"\nChannel Low: ",channelLow); }
Dopo aver compilato il codice senza errori o avvertimenti, lo si può trovare nella finestra del Navigatore sotto la cartella Expert Advisor. Eseguendolo sul grafico desiderato, possiamo trovare la finestra degli input come quella che segue:
Dopo l'esecuzione possiamo trovare l'EA allegato al grafico oltre ai livelli dell'indicatore Donchian Channel come commento uguale al seguente:
Come possiamo vedere, sul grafico abbiamo il segnale desiderato, che è il commento dei tre valori dell'indicatore (Channel High, Channel Middle e Channel Low), ognuno in una riga separata.
A titolo di conferma, possiamo confrontare i valori dei segnali dell’EA con quelli dell'indicatore; nella figura seguente si può notare che l'indicatore è inserito e i suoi valori nella finestra dei dati sono gli stessi dei segnali dell’EA:
Migliorare questo EA per trovare segnali basati sui movimenti e sui livelli dell'indicatore, è ciò che cercheremo di fare attraverso i seguenti sistemi di trading (EA) provando ad impostare condizioni basate sul concetto dell'indicatore per ricevere segnali di acquisto e di vendita.
Donchian Channel Breakout EA:
In questa versione dell'EA abbiamo bisogno che il programma controlli continuamente tutti e tre i valori dell’indicatore e se il prezzo (ask) rompe il massimo del canale, dobbiamo ricevere un segnale di acquisto come commento sul grafico. Nell'altro scenario, se il prezzo (bid) rompe il minimo del canale, dobbiamo ricevere un segnale di vendita come commento sul grafico. Se c'è qualcos'altro, non dobbiamo ricevere nulla.
Di seguito è riportato il codice completo per creare questo tipo di sistema di trading (EA):
input int indPeriod=20; //Period int donchianChannel; int OnInit() { donchianChannel=iCustom(_Symbol,PERIOD_CURRENT,"My Files\\Donchian_Channel\\Donchian_Channel",indPeriod); return(INIT_SUCCEEDED); } void OnDeinit(const int reason) { Print("Donchian Channel EA Removed"); } void OnTick() { double channelBuff[],channelBuff1[], middleBuff[]; CopyBuffer(donchianChannel,0,0,3,channelBuff); CopyBuffer(donchianChannel,1,0,3,channelBuff1); CopyBuffer(donchianChannel,2,0,3,middleBuff); double channelHigh=channelBuff1[0]; double channelMiddle=middleBuff[0]; double channelLow=channelBuff[0]; double ask=SymbolInfoDouble(_Symbol,SYMBOL_ASK); double bid=SymbolInfoDouble(_Symbol,SYMBOL_BID); if(ask>channelHigh) { Comment("Buy Signal"); } else if(bid<channelLow) { Comment("Sell Signal"); } else Comment(" "); }
Le differenze in questo codice sono le seguenti:
Definizione di ask e bid utilizzando la funzione SymbolInfoDouble che restituisce i valori delle proprietà (ask, bid) dopo aver creato opportune variabili double.
double ask=SymbolInfoDouble(_Symbol,SYMBOL_ASK); double bid=SymbolInfoDouble(_Symbol,SYMBOL_BID);
Condizioni della strategia:
In caso di acquisto
Il programma deve controllare l'ask e il canale superiore per determinare le loro posizioni. Se l’ask è superiore al canale superiore, questa sarà la condizione di acquisto e l'EA dovrà restituire un segnale di acquisto come commento sul grafico una volta soddisfatta questa condizione.
if(ask>channelHigh) { Comment("Buy Signal"); }
In caso di vendita
Il programma deve controllare il bid e il canale inferiore per determinare le loro posizioni. Se il prezzo bid è inferiore al livello del canale inferiore, questa sarà la condizione di vendita e l'EA dovrà restituire un segnale di vendita come commento sul grafico una volta soddisfatta questa condizione.
else if(bid<channelLow) { Comment("Sell Signal"); }
In caso di nulla
Abbiamo bisogno che l'EA non restituisca nulla se non ci sono condizioni di acquisto o di vendita.
else Comment(" ");
Dopo aver compilato questo codice senza errori o avvertimenti, possiamo eseguirlo trascinandolo e rilasciandolo sul grafico desiderato per ottenere segnali basati sulla strategia come negli esempi seguenti:
In caso di segnale di acquisto
Come possiamo vedere nell'angolo in alto a sinistra del grafico precedente, abbiamo un segnale di acquisto dopo la rottura del massimo del canale verso l'alto.
In caso di segnale di vendita
Come possiamo vedere nell'angolo in alto a sinistra del grafico precedente, abbiamo un segnale di vendita dopo la rottura del minimo del canale verso il basso.
In caso di nulla
Come possiamo vedere, non c'è alcun segnale poiché il prezzo si muove all'interno del canale, il che significa che il prezzo è al di sotto del massimo del canale e al di sopra del minimo del canale.
Donchian Channel e Breakout della MA:
Ora, dobbiamo migliorare un po' l'EA filtrando i segnali con l'aggiunta della media mobile alle condizioni della strategia, e questo è ciò che faremo in questo sistema di trading. Quindi, dobbiamo ricevere un segnale di acquisto quando il prezzo (ask) rompe al di sopra del massimo del canale nel caso in cui la EMA (Exponential Moving Average) a 200 periodi si trovi al di sotto dell'ask. Nel caso di un segnale di vendita, dobbiamo assicurarci che il prezzo del bid rompa al di sotto del minimo del canale e che allo stesso tempo l'EMA a 200 periodi sia al di sopra del bid. Per qualsiasi altra cosa non dobbiamo ricevere nulla.
Di seguito è riportato il codice completo per creare questo tipo di sistema di trading:
input int indPeriod=20; //Period input int maPeriod=200; //Moving Average Period int donchianChannel; int EMA; double emaArray[]; int OnInit() { donchianChannel=iCustom(_Symbol,PERIOD_CURRENT,"My Files\\Donchian_Channel\\Donchian_Channel",indPeriod); EMA = iMA(_Symbol,_Period,maPeriod,0,MODE_EMA,PRICE_CLOSE); return(INIT_SUCCEEDED); } void OnDeinit(const int reason) { Print("Donchian Channel EA Removed"); } void OnTick() { double channelBuff[],channelBuff1[], middleBuff[]; CopyBuffer(donchianChannel,0,0,3,channelBuff); CopyBuffer(donchianChannel,1,0,3,channelBuff1); CopyBuffer(donchianChannel,2,0,3,middleBuff); ArraySetAsSeries(emaArray,true); CopyBuffer(EMA,0,0,3,emaArray); double channelHigh=channelBuff1[0]; double channelMiddle=middleBuff[0]; double channelLow=channelBuff[0]; double EMAValue=NormalizeDouble(emaArray[0],_Digits); double ask=SymbolInfoDouble(_Symbol,SYMBOL_ASK); double bid=SymbolInfoDouble(_Symbol,SYMBOL_BID); if(ask>channelHigh&&ask>EMAValue) { Comment("Buy Signal","\nAsk above Channel High","\nAsk above (",maPeriod,") EMA"); } else if(bid<channelLow&&bid<EMAValue) { Comment("Sell Signal","\nBid below Channel Low","\nBid Below (",maPeriod,") EMA"); } else Comment(" "); }
Le differenze in questo codice sono le seguenti:
Creare un altra variabile input intera maPeriod con un valore predefinito (200), ma che l'utente può aggiornare secondo le proprie preferenze.
input int maPeriod=200; //Moving Average Period
Creare una variabile intera globale per EMA
int EMA;
Crea un array emaArray[]
double emaArray[];
Aggiornare la variabile EMA utilizzando la funzione iMA che restituisce l'handle dell'indicatore media mobile e i suoi parametri sono:
- symbol: per specificare il simbolo e useremo (_Symbol) per applicarlo al simbolo corrente.
- period: per specificare il timeframe da utilizzare (_period) da applicare al timeframe corrente.
- ma_period: per specificare il periodo di mediazione, si utilizzerà l'input dell'utente (maPeriod).
- ma_shift: per specificare se c'è uno scostamento, useremo (0) poiché non abbiamo bisogno di scostamenti.
- ma_method: per specificare il tipo di attenuazione della media mobile, useremo (MODE_EMA) poiché abbiamo bisogno della media mobile esponenziale.
- applied_price: per specificare il tipo di prezzo, utilizzeremo (PRICE_CLOSE).
EMA = iMA(_Symbol,_Period,maPeriod,0,MODE_EMA,PRICE_CLOSE);
Utilizzo della funzione ArraySetAsSeries per impostare AS_SERIES, i suoi parametri sono:
- array[]: per specificare l'array, utilizzeremo emaArray.
- flag: per specificare la direzione di indicizzazione dell'array, useremo true.
ArraySetAsSeries(emaArray,true);
Utilizzo della funzione CopyBuffer per ottenere i dati dal buffer della media mobile
CopyBuffer(EMA,0,0,3,emaArray);
Definire il valore EMA e normalizzarlo
double EMAValue=NormalizeDouble(emaArray[0],_Digits);
Condizioni della strategia:
In caso di acquisto
Se il prezzo > del massimo del canale, abbiamo bisogno del seguente commento sul grafico
- Segnale d’acquisto
- Ask al di sopra del Massimo del Canale
- Ask sopra (periodo) EMA
if(ask>channelHigh&&ask>EMAValue) { Comment("Buy Signal","\nAsk above Channel High","\nAsk above (",maPeriod,") EMA"); }
In caso di vendita
Se il prezzo < al minimo del canale, abbiamo bisogno del seguente commento sul grafico
- Segnale di vendita
- Bid al di sotto del Minimo del Canale
- Bid sotto (periodo) EMA
else if(bid<channelLow&&bid<EMAValue) { Comment("Sell Signal","\nBid below Channel Low","\nBid Below (",maPeriod,") EMA"); }
In caso di assenza di segnale
else Comment(" ");
Dopo aver compilato questo codice senza errori o avvertimenti, possiamo trovare i segnali di questo sistema di trading uguali a quelli seguenti
In caso di segnale di acquisto
Come possiamo vedere nell'esempio precedente, abbiamo il segnale di acquisto e le condizioni di questo segnale, ovvero che il prezzo sia al di sopra del massimo del canale e che EMA 200 sia soddisfatta, commento sui grafici come ci serve.
In caso di segnale di vendita
Come possiamo vedere nell'esempio precedente, abbiamo il segnale di vendita e le condizioni di questo segnale, ovvero il prezzo è al di sotto del minimo del canale e EMA 200 è soddisfatta, commento sul grafico come ci serve.
In caso di assenza di segnale
Come possiamo vedere, non c'è alcun segnale sul grafico che indichi che le condizioni non sono soddisfatte perché il prezzo è al di sopra del minimo del canale e al di sotto del massimo del canale, anche se abbiamo un setup di vendita perché il prezzo è al di sotto della EMA 200.
Conclusioni
Come abbiamo imparato attraverso l'argomento citato in questo articolo, abbiamo capito quanto l'indicatore Donchian Channel possa essere uno strumento utile e prezioso, soprattutto dopo averlo creato da soli come indicatore personalizzato, oltre a creare sistemi di trading basati sul concetto dell'indicatore. Si suppone che siate in grado di creare il vostro indicatore Donchian Channel personalizzato in base alle vostre preferenze e a ciò che serve come valido strumento per il vostro trading, inoltre, di essere in grado di creare un sistema di trading utilizzando la funzione iCustom per operare o ottenere segnali basati sull'interpretazione dell'indicatore e non solo, ma si suppone che siate in grado di migliorare questo sistema di trading (EA) in base a ciò che migliora i suoi risultati aggiungendo condizioni specifiche e utilizzando un altro strumento tecnico per ottenere spunti migliori.
Spero che questo articolo vi sia stato utile per il vostro percorso di trading, in termini di risultati e approfondimenti migliori, o almeno che vi sia stato utile e vi abbia dato buoni spunti su qualsiasi altro concetto correlato. Non dimenticherò inoltre di confermare che non dovete utilizzare il contenuto di questo articolo nel vostro conto reale prima di averlo testato per assicurarvi che sia profittevole per voi, poiché non esiste uno strumento adatto a tutte le persone.
Se questo articolo vi è stato utile e volete leggere altri miei articoli, potete leggerli da questo link di pubblicazione, dove troverete una serie di articoli su come creare sistemi di trading basati sugli indicatori tecnici più popolari e altri che spero li troviate utili.
Tradotto dall’inglese da MetaQuotes Ltd.
Articolo originale: https://www.mql5.com/en/articles/12711
Avvertimento: Tutti i diritti su questi materiali sono riservati a MetaQuotes Ltd. La copia o la ristampa di questi materiali in tutto o in parte sono proibite.
Questo articolo è stato scritto da un utente del sito e riflette le sue opinioni personali. MetaQuotes Ltd non è responsabile dell'accuratezza delle informazioni presentate, né di eventuali conseguenze derivanti dall'utilizzo delle soluzioni, strategie o raccomandazioni descritte.





- 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
È stato pubblicato il nuovo articolo Come creare un canale Donchian personalizzato utilizzando MQL5:
Autore: Mohamed Abdelmaaboud
vedi https://www.mql5.com/en/market/product/31082?source=Unknown