Strategia di Trading: Segnali basati su Crossover di Prezzo con Media Mobile e ADX

Mike 2011.01.11 01:50 25 0 0
Allegato

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

Segnali di trading basati su crossover di prezzo con Media Mobile, confermati da ADX

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
Un aspetto interessante di questa implementazione è il controllo aggiuntivo della presenza del trend (utilizzando l'Indicatore di Movimento Direzionale). Questo consente di filtrare i falsi segnali e di controllare le condizioni di trading utilizzando i valori della barra corrente (non completata).

1. Apertura di una posizione long

Condizioni per aprire una posizione long:

  1. StateEMA(0) < 0 e StateEMA(1) > 0: la media mobile aumenta nelle barre corrente e precedente;
  2. StateClose(1) > 0: il prezzo di chiusura dell'ultima barra completata è superiore alla media mobile;
  3. MainADX(0) > minimum_ADX: il valore di ADX della barra corrente è maggiore del valore minimo specificato (per verificare la presenza del trend);
  4. 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:

  1. StateEMA(0) < 0 e StateEMA(1) < 0: la media mobile diminuisce nelle barre corrente e precedente;
  2. StateClose(1) < 0: il prezzo di chiusura dell'ultima barra completata è inferiore alla media mobile;
  3. MainADX(0) > minimum_ADX: il valore di ADX della barra corrente è maggiore del valore minimo specificato (per verificare la presenza del trend);
  4. 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:

Scegli

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

Risultati del backtest storico dell'Expert Advisor, basato su crossover di prezzo con MA confermati da ADX

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.


Elenco
Commento 0