MQL5 Wizard è uno strumento fantastico che permette di generare automaticamente il codice per i tuoi Expert Advisor. Se vuoi approfondire, dai un’occhiata a Creazione di Expert Advisor Pronti con MQL5 Wizard.
La strategia di trading che andremo a esaminare si basa sul crossover di due medie mobili esponenziali. Le medie mobili sono molto efficaci quando ci sono trend, ma possono dare diversi segnali falsi in altre situazioni. Uno dei modi per migliorare questa strategia è utilizzare i filtri temporali, ad esempio aprendo nuove posizioni solo durante la sessione europea del FOREX.
Quindi, analizziamo la strategia basata sul crossover di due medie mobili esponenziali (una veloce e una lenta) con un filtro temporale intraday. Questa strategia è conosciuta come "Segnali basati sul crossover di due EMA con filtro temporale intraday", utile quando si crea un EA in modo automatico con MQL5 Wizard.
Segnali di trading:
- Apertura di una posizione long: quando la EMA veloce incrocia quella lenta verso l'alto e le condizioni del filtro temporale intraday non sono soddisfatte.
- Apertura di una posizione short: quando la EMA veloce incrocia quella lenta verso il basso e le condizioni del filtro temporale intraday non sono soddisfatte.
Questa strategia è implementata nella classe CSignal2EMA_ITF.
Il sistema di trading si basa su ordini pendenti, i livelli di prezzo sono calcolati in base ai valori delle medie mobili e si utilizza l'ATR (Average True Range).

Figura 1. Segnali di trading, basati sul crossover di due EMA con filtro temporale intraday
Segnali di trading
La strategia di trading è implementata in CSignal2EMA_ITF, essa include metodi protetti per semplificare l'accesso ai valori degli indicatori:
double FastEMA(int ind) // restituisce il valore della EMA veloce della barra double SlowEMA(int ind) // restituisce il valore della EMA lenta della barra double StateFastEMA(int ind) // restituisce un valore positivo/negativo se la EMA veloce è aumentata/diminuita double StateSlowEMA(int ind) // restituisce un valore positivo/negativo se la EMA lenta è aumentata/diminuita double StateEMA(int ind) // restituisce la differenza tra EMA veloce e lenta double ATR(int ind) // restituisce il valore dell'ATR della barra
- Limit>0. Si entra con un movimento di retrocessione quando si verifica un falso breakout della media mobile ad un prezzo migliore rispetto al prezzo di mercato (ordini Buy Limit e Sell Limit verranno piazzati a seconda del segnale di trading).
- Limit<0. Si entra nella direzione del movimento di prezzo (ordini Buy Stop e Sell Stop verranno piazzati a seconda del segnale di trading).
- Limit=0. In questo caso si traderebbe utilizzando i prezzi di mercato.
1. Apertura di una posizione long
Il sistema verifica le condizioni per aprire una posizione long: se la differenza tra la EMA veloce e lenta sull'ultima barra completata ha cambiato segno da "-" a "+" (StateEMA(1)>0 && StateEMA(2)<0).
Successivamente, controlla le condizioni del filtro temporale intraday chiamando il metodo CheckOpenLong() della classe CSignalITF. Se il trading è consentito, calcola il livello di prezzo base (il valore della media mobile) e il valore dell'intervallo ATR dell'ultima barra completata.
A seconda del segno del parametro di input Limit, piazzerà un ordine pendente di acquisto. Il prezzo dell'ordine, i livelli di Take Profit e Stop Loss sono calcolati rispetto al livello di prezzo base (in unità di ATR). Il tempo di scadenza dell'ordine è definito (in barre) dal parametro di input Expiration.
//+------------------------------------------------------------------+ //| Verifica le condizioni per aprire una posizione long (buy) | //+------------------------------------------------------------------+ bool CSignal2EMA_ITF::CheckOpenLong(double& price,double& sl,double& tp,datetime& expiration) { if(!(StateEMA(1)>0 && StateEMA(2)<0)) return(false); if(!m_time_filter.CheckOpenLong(price,sl,tp,expiration)) return(false); //--- double ema=SlowEMA(1); double atr=ATR(1); double spread=m_symbol.Ask()-m_symbol.Bid(); //--- price=m_symbol.NormalizePrice(ema-m_limit*atr+spread); sl =m_symbol.NormalizePrice(price+m_stop_loss*atr); tp =m_symbol.NormalizePrice(price-m_take_profit*atr); expiration+=m_expiration*PeriodSeconds(m_period); //--- return(true); }
2. Chiusura di una posizione long
Nel nostro caso, la funzione che verifica le condizioni per chiudere una posizione long restituisce sempre false, cioè si assume che la posizione long sarà chiusa da Take Profit o Stop Loss. Se necessario, puoi scrivere il tuo codice per implementare questo metodo.
//+------------------------------------------------------------------+ //| Verifica le condizioni per chiudere una posizione long | //+------------------------------------------------------------------+ bool CSignal2EMA_ITF::CheckCloseLong(double& price) { return(false); }
3. Apertura di una posizione short
Verifica le condizioni per aprire una posizione short: se la differenza tra la EMA veloce e lenta sull'ultima barra completata ha cambiato segno da "+" a "-" (StateEMA(1)<0 && StateEMA(2)>0).
Successivamente, controlla le condizioni del filtro temporale intraday chiamando il metodo CheckOpenLong() della classe CSignalITF. Se il trading è consentito, calcola il livello di prezzo base (il valore della media mobile) e il valore dell'intervallo ATR dell'ultima barra completata.
A seconda del segno del parametro di input Limit, piazzerà un ordine pendente di vendita. Il prezzo dell'ordine, i livelli di Take Profit e Stop Loss sono calcolati rispetto al livello di prezzo base (in unità di ATR). Il tempo di scadenza dell'ordine è definito (in barre) dal parametro di input Expiration.
//+------------------------------------------------------------------+ //| Verifica le condizioni per aprire una posizione short (sell) | //+------------------------------------------------------------------+ bool CSignal2EMA_ITF::CheckOpenShort(double& price,double& sl,double& tp,datetime& expiration) { if(!(StateEMA(1)<0 && StateEMA(2)>0)) return(false); if(!m_time_filter.CheckOpenShort(price,sl,tp,expiration)) return(false); //--- double ema=SlowEMA(1); double atr=ATR(1); //--- price =m_symbol.NormalizePrice(ema+m_limit*atr); sl =m_symbol.NormalizePrice(price+m_stop_loss*atr); tp =m_symbol.NormalizePrice(price-m_take_profit*atr); expiration+=m_expiration*PeriodSeconds(m_period); //--- return(true); }
4. Chiusura di una posizione short
In questo caso, la funzione che verifica le condizioni per chiudere una posizione short restituisce sempre false, quindi si assume che la posizione sarà chiusa da Take Profit o Stop Loss. Se necessario, puoi scrivere il tuo codice per implementare questo metodo.
//+------------------------------------------------------------------+ //| Verifica le condizioni per chiudere una posizione short | //+------------------------------------------------------------------+ bool CSignal2EMA_ITF::CheckCloseShort(double& price) { return(false); }
5. Trailing Stop per Ordine Pendenti Buy
L'Expert Advisor effettuerà un trailing degli ordini pendenti in base al valore attuale della media mobile e dell'ATR.
//+--------------------------------------------------------------------+ //| Verifica le condizioni per modificare l'ordine pendente di acquisto | //+--------------------------------------------------------------------+ bool CSignal2EMA_ITF::CheckTrailingOrderLong(COrderInfo* order,double& price) { //--- check if(order==NULL) return(false); //--- double ema=SlowEMA(1); double atr=ATR(1); double spread=m_symbol.Ask()-m_symbol.Bid(); //--- price=m_symbol.NormalizePrice(ema-m_limit*atr+spread); //--- return(true); }
6. Trailing Stop per Ordine Pendenti Sell
L'Expert Advisor effettuerà un trailing degli ordini pendenti in base al valore attuale della media mobile e dell'ATR.
L'ordine sarà eseguito se il prezzo di mercato raggiunge il prezzo dell'ordine.
//+--------------------------------------------------------------------+ //| Verifica le condizioni per modificare l'ordine pendente di vendita | //+--------------------------------------------------------------------+ bool CSignal2EMA_ITF::CheckTrailingOrderShort(COrderInfo* order,double& price) { //--- check if(order==NULL) return(false); //--- double ema=SlowEMA(1); double atr=ATR(1); //--- price=m_symbol.NormalizePrice(ema+m_limit*atr); //--- return(true); }
Creazione di un Expert Advisor utilizzando MQL5 Wizard
Per creare un robot di trading basato sulla strategia, devi selezionare le proprietà del segnale come "Segnali basati sul crossover di due EMA con filtro temporale intraday" nell'opzione di MQL5 Wizard:

Figura 2. Seleziona "Segnali basati sul crossover di due EMA con filtro temporale intraday" in MQL5 Wizard
Successivamente, dovrai specificare il necessario algoritmo di trailing stop e il sistema di gestione del denaro e rischio. Il codice dell'Expert Advisor verrà creato automaticamente, potrai compilarlo e testarlo nel Strategy Tester del terminale client di MetaTrader 5.
Risultati dei Test
Consideriamo il backtesting dell'Expert Advisor su dati storici (EUR/USD H1, periodo di test: 1.1.2010-05.01.2011, PeriodFastEMA=5, PeriodSlowEMA=30, PeriodATR=7, Limit=1.2, StopLoss=5, TakeProfit=8, Expiration=4, GoodMinuteOfHour=-1, BadMinutesOfHour=0, GoodHourOfDay=-1, BadHoursOfDay=0, GoodDayOfWeek=-1, BadDaysOfWeek=0).
Durante la creazione dell'Expert Advisor abbiamo utilizzato un volume fisso (Trading Fixed Lot, 0.1), l'algoritmo di Trailing Stop non è stato utilizzato (Trailing non utilizzato).

Figura 3. Risultati di Test dell'Expert Advisor con segnali di trading basati sul crossover di due EMA senza utilizzo del filtro ITF
Il filtro intraday non è stato utilizzato, quindi ci sono molti segnali falsi. I segnali di trading possono essere migliorati se analizziamo i risultati delle operazioni in base agli orari di trading.
Nel nostro caso, abbiamo scoperto che il crossover di due EMA fornisce molti segnali falsi a partire dalle 6:00 fino alle 23:59. Possiamo specificare il filtro temporale intraday impostando i parametri del filtro.
Ad esempio, possiamo specificare un filtro temporale che consente di aprire posizioni solo dalle 0:00 fino alle 5:59. Questo può essere fatto impostando il valore di BadHoursOfDay=16777152=111111111111111111000000b. Tutti gli altri orari di trading sono "cattivi", quindi è meglio proibire l'apertura di nuove posizioni dalle 6:00 fino alla fine della giornata.
Se impostiamo il valore di BadHoursOfDay=16777152, filtreremo molti segnali falsi:

Figura 4. Risultati di Test dell'Expert Advisor con segnali di trading basati sul crossover di due EMA con filtro temporale (BadHoursofDay=16777152)
La classe CSignalITF fornisce molte altre funzionalità di filtraggio temporale (basta specificare i minuti "buoni" e "cattivi" all'interno dell'ora, le ore della giornata, i giorni della settimana).
Allegati: Il file Signal2EMA-ITF.mqh con la classe CSignal2EMA_ITF deve essere posizionato nella cartella terminal_data_folder\MQL5\Include\Expert\Signal.
Il file expert_2ema_itf.mq5 contiene il codice dell'Expert Advisor creato utilizzando MQL5 Wizard.
Post correlati
- RRS Impulse: Il Tuo Esperto per MetaTrader 4
- Guida all'Utilizzo del MQL5 Wizard: Trading con Pattern di Candele e Indice CCI
- Guida all'Utilizzo di MQL5 Wizard per i Segnali di Trading: 3 Black Crows/3 White Soldiers + MFI
- MQL5 Wizard: Crea Trading Signals con 3 Corvi Neri/3 Soldati Bianchi e RSI
- MQL5 Wizard: Strategia di Trading con Dark Cloud Cover/Piercing Line e RSI