Unisciti alla nostra fan page
![Sistemi Esperti](https://c.mql5.com/i/code/expert.png)
MQL5 Wizard - Segnali commerciali basati sul crossover di due EMA con filtro temporale intraday - sistema esperto per MetaTrader 5
- Visualizzazioni:
- 380
- Valutazioni:
- Pubblicato:
- 2021.11.11 16:20
-
Hai bisogno di un robot o indicatore basato su questo codice? Ordinalo su Freelance Vai a Freelance
MQL5 Wizard permette di creare automaticamente il codice di Expert Advisors. Vedi Creazione di Expert Advisors pronti in MQL5 Wizard per i dettagli.
I segnali di trading della strategia, basati su due medie mobili sono considerati in MQL5 Wizard - Trade Signals Based on Crossover of Two Exponentially Smoothed Moving Averages. Le medie mobili sono efficaci in caso di trend, in altri casi forniscono molti falsi segnali. Uno dei modi per migliorare la strategia è l'uso dei filtri temporali (per esempio, aprire nuove posizioni durante la sessione europea del FOREX).
Qui considereremo la strategia basata sul crossover di due medie mobili smussate esponenzialmente (EMA veloce e EMA lento) con filtro temporale intraday. La strategia chiamata "Signals based on crossover of two EMA with intraday time filter" (quando si crea automaticamente l'EA in MQL5 Wizard).
Segnali di trading:
- Aprire una posizione long: il crossover della EMA veloce verso l'alto della EMA lenta e le condizioni del filtro temporale intraday non sono soddisfatte.
- Aprire una posizione short: il crossover della EMA veloce verso il basso della EMA lenta 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 della media mobile, vengono utilizzate le unità 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, ha alcuni metodi protetti per semplificare l'accesso ai valori dell'indicatore:
double FastEMA(int ind) // restituisce il valore dell'EMA veloce della barra double SlowEMA(int ind) // restituisce il valore dell'EMA lento della barra double StateFastEMA(int ind) // restituisce il valore positivo/negativo se l'EMA veloce è aumentato/diminuito double StateSlowEMA(int ind) // restituisce il valore positivo/negativo se l'EMA lento è aumentato/diminuito double StateEMA(int ind) // restituisce la differenza tra EMA veloce e lento double ATR(int ind) // restituisce il valore di ATR della barra
- Limit>0. Apre un operazione di trading su un ritiro del prezzo nel caso di falsa rottura della media mobile sul prezzo migliore del prezzo di mercato (gli ordini Buy Limit e Sell Limit saranno piazzati a seconda del segnale di trading)
- Limit<0. Entrerà nella direzione del movimento del prezzo (gli ordini Buy Stop e Sell Stop saranno piazzati a seconda del segnale di trading).
- Limit=0. In questo caso aprirà posizioni utilizzando i prezzi di mercato.
1. Aprire una posizione long
Controlla le condizioni per aprire una posizione lunga: se la differenza tra l'EMA veloce e l'EMA lento sull'ultima barra completata ha cambiato il suo segno da "-" a "+" (StateEMA(1)>0 && StateEMA(2)<0).
Successivamente, controlla le condizioni del filtro orario intraday chiamando il metodo CheckOpenLong() della classe CSignalITF. Se il trading è permesso, calcolerà il livello di prezzo base (il valore della media mobile) e il valore ATR range dell'ultima barra completata.
A seconda del segno del parametro di input Limit, posizionerà l'ordine di acquisto pendente. Il prezzo dell'ordine, i livelli Take Profit e Stop Loss sono calcolati rispetto al livello del prezzo base (in unità ATR). Il tempo di scadenza dell'ordine è definito (in barre) dal parametro di input Expiration.
//+------------------------------------------------------------------+ //| Checks conditions to open long position (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. Chiude posizione long
Nel nostro caso la funzione che controlla le condizioni per chiudere la posizione long restituisce sempre false, cioè si presume che la posizione long sarà chiusa da Take Profit o Stop Loss. Se necessario, potete scrivere il vostro codice con l'implementazione di questo metodo.
//+------------------------------------------------------------------+ //| Checks conditions to close long position | //+------------------------------------------------------------------+ bool CSignal2EMA_ITF::CheckCloseLong(double& price) { return(false); }
3. Apre posizione short
Controlla le condizioni per aprire una posizione short: se la differenza tra l'EMA veloce e l'EMA lento sull'ultima barra completata ha cambiato il suo segno da "+" a "-" (StateEMA(1)<0 && StateEMA(2)>0).
Successivamente, controlla le condizioni del filtro orario intraday chiamando il metodo CheckOpenLong() della classe CSignalITF. Se il trading è permesso, calcolerà il livello di prezzo base (il valore della media mobile) e il valore ATR range dell'ultima barra completata.
A seconda del segno del parametro di input Limit, posizionerà l'ordine di vendita pendente. Il prezzo dell'ordine, i livelli Take Profit e Stop Loss sono calcolati rispetto al livello del prezzo base (in unità ATR). Il tempo di scadenza dell'ordine è definito (in barre) dal parametro di input Expiration.
//+------------------------------------------------------------------+ //| Checks conditions to open short position (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. Chiude posizione short
Nel nostro caso la funzione che controlla le condizioni per chiudere la posizione short restituisce sempre false, cioè si presume che la posizione sarà chiusa da Take Profit o Stop Loss. Se necessario, potete scrivere il vostro codice con l'implementazione di questo metodo.
//+------------------------------------------------------------------+ //| Checks conditions to close short position | //+------------------------------------------------------------------+ bool CSignal2EMA_ITF::CheckCloseShort(double& price) { return(false); }
5. Trailing Stop dell'ordine di acquisto pendente
L'Expert Advisor seguirà gli ordini pendenti a seconda del valore corrente della media mobile e dell'ATR.
//+--------------------------------------------------------------------+ //| Checks conditions to modify pending buy order | //+--------------------------------------------------------------------+ 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 di un ordine di vendita pendente
L'Expert Advisor seguirà gli ordini pendenti a seconda del valore corrente della media mobile e dell'ATR.
L'ordine sarà eseguito se il prezzo di mercato raggiungerà il prezzo dell'ordine.
//+--------------------------------------------------------------------+ //| Checks conditions to modify pending buy order | //+--------------------------------------------------------------------+ 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 Expert Advisor con MQL5 Wizard
Per creare un robot di trading basato sulla strategia è necessario selezionare le proprietà del segnale come "Signals based on crossover of two EMA with intraday time filter" nell'opzione "Creating Ready-Made Expert Advisors" di MQL5 Wizard:
Figura 2. Seleziona "Signals based on crossover of two EMA with intraday time filter" nel MQL5 Wizard
Successivamente dovrete specificare l'algoritmo di trailing stop necessario ed il sistema di money and risk management . Il codice di Expert Advisor sarà creato automaticamente, puoi compilarlo e testarlo in Strategy Tester del terminale MetaTrader 5.
Risultati dei test
Consideriamo il backtesting dell'Expert Advisor su dati storici (EUenSD 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).
Nella creazione di Expert Advisor abbiamo usato il lotto fisso (Trading Fixed Lot, 0.1), l'algoritmo Trailing Stop non viene usato (Trailing not used).
Figura 3. Risultati dei test dell'Expert Advisor con segnali di trading, basati sul crossover di due EMA senza l'uso del filtro ITF
Il filtro intraday non viene utilizzato, quindi ci sono molti falsi segnali. I segnali di trading possono essere migliorati se si esegue l'analisi dei risultati delle transazioni a seconda delle ore di trading.
Nel nostro caso abbiamo trovato che l'incrocio di due EMA fornisce molti falsi segnali a partire dalle 6:00 fino alle 23:59. Possiamo specificare il filtro temporale intraday impostando i parametri del filtro.
Per esempio, possiamo specificare un filtro temporale che permette di aprire posizioni solo dalle 0:00 alle 5:59. Può essere fatto impostando il valore di BadHoursOfDay=16777152=11111111111111111111000000b. Tutte le altre ore di trading sono "cattive", quindi è meglio vietare l'apertura di nuove posizioni dalle 6:00 alla fine della giornata.
Se impostiamo il valore di BadHoursOfDay=16777152, filtreremo molti falsi segnali:
Figura 4. Risultati dei test dell'Expert Advisor con segnali di trading, basati sul crossover di due EMA con filtro temporale (BadHoursofDay=16777152)
Il CSignalITF fornisce molte altre funzioni di filtraggio del tempo (basta specificare i minuti "buoni" e "cattivi" nell'ora, le ore nel giorno, i giorni nella settimana).
Allegati: The Signal2EMA-ITF.mqh con la classe CSignal2EMA_ITF devono essere collocate nella cartella terminal_data_folder\MQL5\Include\Expert\Signal.
Il file expert_2ema_itf.mq5 contiene il codice dell'Expert Advisor, creato con MQL5 Wizard.
Tradotto dal russo da MetaQuotes Ltd.
Codice originale https://www.mql5.com/ru/code/264
![MQL5 Wizard - Segnali di trading basati sul crossover delle linee principali e di segnale dell'indicatore MACD](https://c.mql5.com/i/code/expert.png)
Si considerano i segnali di trading basati sull'incrocio delle linee principali e di segnale dell'indicatore MACD (CSignalMACD da MQL5 Standard Library). Il codice dell'Expert Advisor basato su questa strategia può essere generato automaticamente utilizzando il Wizard MQL5.
![MQL5 Wizard - Segnali di trading basati sul crossover di due medie mobili smussate esponenzialmente](https://c.mql5.com/i/code/expert.png)
Si considerano i segnali di trading basati sull'incrocio dei prezzi di due medie mobili smussate esponenzialmente. Il codice dell'Expert Advisor basato su questa strategia può essere generato automaticamente utilizzando il Wizard MQL5.
![MQL5 Wizard - Segnali di trading basati sul crossover delle linee dell'indicatore Alligator](https://c.mql5.com/i/code/expert.png)
Vengono considerati i segnali di trading basati sul crossover delle linee dell'indicatore tecnico Alligator. Il codice dell'Expert Advisor basato su questa strategia può essere generato automaticamente utilizzando il Wizard MQL5.
![Procedura guidata MQL5 - Segnali di trading basati su modelli di candele di inversione](https://c.mql5.com/i/code/expert.png)
Vengono presi in considerazione i segnali di trading basati su modelli di candele di inversione. Il codice dell'Expert Advisor basato su questa strategia può essere generato automaticamente utilizzando il Wizard MQL5.