MQL5 Wizard è uno strumento fantastico che ti permette di creare il codice degli Expert Advisor in modo automatico. Se vuoi approfondire, dai un'occhiata a Creare Expert Advisors in MQL5 Wizard.
Oggi parliamo di una strategia di trading basata sul crossover di prezzo con l'indicatore Media Mobile, confermato dall'indicatore ADX. Questa strategia viene chiamata "Segnali basati su crossover di prezzo con MA confermati da ADX", ed è una delle opzioni che puoi selezionare quando crei un EA automaticamente in MQL5 Wizard.
Segnali di trading:
- Compra: il prezzo di chiusura dell'ultima barra completata è superiore alla media mobile e la media mobile è in aumento sia nella barra corrente che in quella precedente.
- Vendi: il prezzo di chiusura dell'ultima barra completata è inferiore alla media mobile e la media mobile è in diminuzione sia nella barra corrente che in quella precedente.
- Per filtrare i falsi segnali, si verifica la forza del trend (ADX > ADXmin) e la direzione del trend utilizzando gli Indici di Movimento Direzionale (DI+ e DI-).
Questa strategia è implementata nella classe CSignalADX_MA (devi posizionarla nella cartella terminal_data_folder\MQL5\Include\Expert\Signal\SignalADX-MA.mqh).

Figura 1. Segnali di trading basati su crossover di prezzo con Media Mobile, confermati da ADX
Condizioni per i segnali di trading
La strategia di trading è implementata nella classe CSignalADX_MA, la quale ha alcuni metodi protetti per semplificare l'accesso agli indicatori e ai valori dei prezzi:
double PlusADX(int ind) // restituisce il valore della linea DI+ della barra double MainADX(int ind) // restituisce il valore della linea principale della barra double MinusADX(int ind) // restituisce il valore della linea DI- della barra double EMA(int ind) // restituisce il valore della media mobile della barra double Close(int ind) // restituisce il valore del prezzo di chiusura della barra double StateADX(int ind) // restituisce la differenza tra le linee DI+ e DI- double StateEMA(int ind) // restituisce un valore positivo se la EMA aumenta e negativo se diminuisce double StateClose(int ind) // restituisce la differenza tra il prezzo di chiusura e la media mobile
1. Apertura di una posizione long
Condizioni per aprire una posizione long:
- StateEMA(0) < 0 e StateEMA(1) > 0: la media mobile aumenta nelle barre corrente e precedente;
- StateClose(1) > 0: il prezzo di chiusura dell'ultima barra completata è superiore alla media mobile;
- MainADX(0) > minimum_ADX: il valore di ADX della barra corrente è maggiore del valore minimo specificato (per verificare la presenza del trend);
- StateADX(0) > 0: il DI+ è maggiore del DI- della barra corrente.
//+------------------------------------------------------------------+ //| Controlla le condizioni per aprire una posizione long (compra) | //+------------------------------------------------------------------+ bool CSignalADX_MA::CheckOpenLong(double& price,double& sl,double& tp,datetime& expiration) { //--- condizione 1: la media mobile aumenta nelle barre corrente e precedente bool Buy_Condition_1=(StateEMA(0)>0 && StateEMA(1)>0); //--- condizione 2: il prezzo di chiusura dell'ultima barra completata è superiore alla media mobile bool Buy_Condition_2=(StateClose(1)>0); //--- condizione 3: il valore di ADX della barra corrente è maggiore del valore minimo specificato bool Buy_Condition_3=(MainADX(0)>m_minimum_ADX); //--- condizione 4: il valore di DI+ è maggiore di DI- della barra corrente bool Buy_Condition_4=(StateADX(0)>0); //--- price=0.0; sl =m_symbol.Ask()-m_stop_loss*m_adjusted_point; tp =m_symbol.Ask()+m_take_profit*m_adjusted_point; //--- controllo di tutte le condizioni return(Buy_Condition_1 && Buy_Condition_2 && Buy_Condition_3 && Buy_Condition_4); }
2. Chiusura di una posizione long
Condizioni per chiudere una posizione long:
- StateEMA(0) < 0 e StateEMA(1) < 0: la media mobile diminuisce nelle barre corrente e precedente;
- StateClose(1) < 0: il prezzo di chiusura dell'ultima barra completata è inferiore alla media mobile;
- MainADX(0) > minimum_ADX: il valore di ADX della barra corrente è maggiore del valore minimo specificato (per verificare la presenza del trend);
- StateADX(0) < 0: il DI- è maggiore del DI+ della barra corrente.
//+------------------------------------------------------------------+ //| Controlla le condizioni per chiudere una posizione long | //+------------------------------------------------------------------+ bool CSignalADX_MA::CheckCloseLong(double& price) { //--- condizione 1: la media mobile diminuisce nelle barre corrente e precedente bool Sell_Condition_1=(StateEMA(0)<0 && StateEMA(1)<0); //--- condizione 2: il prezzo di chiusura dell'ultima barra completata è inferiore alla media mobile bool Sell_Condition_2=(StateClose(1)<0); //--- condizione 3: il valore di ADX della barra corrente è maggiore del valore minimo specificato bool Sell_Condition_3=(MainADX(0)>m_minimum_ADX); //--- condizione 4: il valore di DI- è maggiore di DI- della barra corrente bool Sell_Condition_4=(StateADX(0)<0); //--- price=0.0; //--- controllo di tutte le condizioni return(Sell_Condition_1 && Sell_Condition_2 && Sell_Condition_3 && Sell_Condition_4); }
3. Apertura di una posizione short
Le condizioni per aprire una posizione short sono le stesse delle condizioni di chiusura di una posizione long.
//+------------------------------------------------------------------+ //| Controlla le condizioni per aprire una posizione short (vendita) | //+------------------------------------------------------------------+ bool CSignalADX_MA::CheckOpenShort(double& price,double& sl,double& tp,datetime& expiration) { //--- condizione 1: la media mobile diminuisce nelle barre corrente e precedente bool Sell_Condition_1=(StateEMA(0)<0 && StateEMA(1)<0); //--- condizione 2: il prezzo di chiusura dell'ultima barra completata è inferiore alla media mobile bool Sell_Condition_2=(StateClose(1)<0); //--- condizione 3: il valore di ADX della barra corrente è maggiore del valore minimo specificato bool Sell_Condition_3=(MainADX(0)>m_minimum_ADX); //--- condizione 4: il valore di DI- è maggiore di DI- della barra corrente bool Sell_Condition_4=(StateADX(0)<0); //--- price=0.0; sl =m_symbol.Bid()+m_stop_loss*m_adjusted_point; tp =m_symbol.Bid()-m_take_profit*m_adjusted_point; //--- controllo di tutte le condizioni return(Sell_Condition_1 && Sell_Condition_2 && Sell_Condition_3 && Sell_Condition_4); }
4. Chiusura di una posizione short
Le condizioni per chiudere una posizione short sono le stesse delle condizioni per aprire una posizione long.
//+------------------------------------------------------------------+ //| Controlla le condizioni per chiudere una posizione short | //+------------------------------------------------------------------+ bool CSignalADX_MA::CheckCloseShort(double& price) { //--- condizione 1: la media mobile aumenta nelle barre corrente e precedente bool Buy_Condition_1=(StateEMA(0)>0 && StateEMA(1)>0); //--- condizione 2: il prezzo di chiusura dell'ultima barra completata è superiore alla media mobile bool Buy_Condition_2=(StateClose(1)>0); //--- condizione 3: il valore di ADX della barra corrente è maggiore del valore minimo specificato bool Buy_Condition_3=(MainADX(0)>m_minimum_ADX); //--- condizione 4: il valore di DI+ è maggiore di DI- della barra corrente bool Buy_Condition_4=(StateADX(0)>0); //--- price=0.0; //--- controllo di tutte le condizioni return(Buy_Condition_1 && Buy_Condition_2 && Buy_Condition_3 && Buy_Condition_4); }
Creare un Expert Advisor con MQL5 Wizard
Per creare un robot di trading basato su questa strategia, devi scegliere le proprietà del segnale come "Segnali basati su crossover di prezzo con MA confermati da ADX" nell'opzione "Creazione di Expert Advisors pronti" di MQL5 Wizard:

Figura 2. Scegli "Segnali basati su crossover di prezzo con MA confermati da ADX" in MQL5 Wizard
Successivamente, dovrai specificare l'algoritmo di trailing stop necessario e il sistema di gestione del denaro e dei rischi. Il codice dell'Expert Advisor verrà creato automaticamente, potrai compilarlo e testarlo nel Tester Strategico del terminale MetaTrader 5.
Risultati dei Test
Consideriamo un backtest dell'Expert Advisor su dati storici (EURUSD H1, periodo di test: 1.1.2010-05.01.2011, PeriodoADX=33, MinimumADX=22, PeriodoMA=39, StopLoss=400, TakeProfit=900).
Nel creare l'Expert Advisor, abbiamo utilizzato un volume fisso (Trading Fixed Lot, 0.1), e non è stato utilizzato alcun algoritmo di Trailing Stop (Trailing non utilizzato).

Figura 3. Risultati del backtest storico dell'Expert Advisor, basato su crossover di prezzo con MA confermati da ADX
Allegati: Il file SignalADX-MA.mqh con la classe CSignalADX_MA deve essere posizionato nella cartella terminal_data_folder\MQL5\Include\Expert\Signal\.
Il file ma_crossover_adx.mq5 contiene il codice dell'Expert Advisor, creato utilizzando MQL5 Wizard.
Commento 0