Home Trading Sistematico Post

Strategia di Trading con EMA e Filtri Temporali per MetaTrader 5

Allegato
264.zip (3.83 KB, Scarica 0 volte)

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.

La filtrazione dei segnali, basata su periodi di tempo specificati, è implementata nella classe CSignalITF. Come esempio di utilizzo, consideriamo la classe CSignal2EMA_ITF (che contiene un oggetto della classe CSignalITF).

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

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


La caratteristica di questo sistema è la seguente: il trading dipende dal parametro di input Limit. A seconda del suo segno, ci sono diversi casi:

  1. 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).
  2. Limit<0. Si entra nella direzione del movimento di prezzo (ordini Buy Stop e Sell Stop verranno piazzati a seconda del segnale di trading).
  3. 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.

Il sistema di trading piazzerà ordini pendenti in base ai segnali di trading. Se l'ordine è stato piazzato con successo, effettuerà un trailing dell'ordine pendente lungo la media mobile. L'ordine sarà eseguito se il prezzo di mercato raggiunge il prezzo dell'ordine.
//+--------------------------------------------------------------------+
//| 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 i segnali basati sul crossover di due EMA con filtro temporale intraday in 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

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)

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).

L'uso dei filtri temporali consente di migliorare i segnali di trading e di tenere conto della dinamica del mercato (ad esempio, le caratteristiche delle sessioni di trading).

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

Commento (0)