Come Creare Rapidamente un Expert Advisor per l’Automated Trading Championship 2010
Introduzione
Al fine di sviluppare un esperto per partecipare all'Automated Trading Championship 2010, usiamo un modello di consulente esperto pronto dall'articolo The Prototype of Trade Robot. Anche il programmatore MQL5 alle prime armi sarà in grado di questo compito, perché per le tue strategie le classi di base, le funzioni, i modelli sono già sviluppati. Basta scrivere una quantità minima di codice per implementare la tua idea di trading.
Cosa dovremo preparare:- Selezione della strategia
- Scrivere un Expert Advisor
- Testing
- Ottimizzazione in Strategy Tester
- Ottimizzazione della strategia
- Test su intervalli diversi
1. Selezione della Strategia
Si ritiene che il trading con tendenza sia più redditizio del trading in un intervallo e il rimbalzo dai livelli intraday si verifica più frequentemente della rottura dei confini del canale.
Sulla base di queste ipotesi, apriremo la posizione verso la tendenza attuale sul rimbalzo dai confini del canale (Envelope). Chiuderemo la posizione su un segnale per chiudere la posizione o quando verranno raggiunti i livelli di Stop Loss o Take Profit.
Come segnale di tendenza useremo la crescita MACD o la diminuzione sul grafico giornaliero e scambieremo sul rimbalzo dai confini del canale nel timeframe delle ore.
Figura 1. Indicatore MACD sul Grafico Giornaliero EURUSD
Se l'indicatore MACD cresce su due barre in successione, questo è il segnale di Acquisto. Se diminuisce su due barre in successione, questo è il segnale di Vendita.
Figura 2. Rimbalzo del Prezzo dai Limiti delle Envelope
2. Scrivere un Expert Advisor
2.1. Moduli Inclusi
L'esperto utilizzerà la classe ExpertAdvisor del modulo ExpertAdvisor.mqh.
#include <ExpertAdvisor.mqh>
2.2. Variabili di Input
input int SL = 50; // Stop Loss distance input int TP = 100; // Take Profit distance input int TS = 50; // Trailing Stop distance input int FastEMA = 15; // Fast EMA input int SlowEMA = 26; // Slow EMA input int MACD_SMA = 1; // MACD signal line input int EnvelPer = 20; // Envelopes period input double EnvelDev = 0.4; // Envelopes deviation input double Risk = 0.1; // Risk
2.3. Creare una Classe Ereditata da CExpertAdvisor
class CMyEA : public CExpertAdvisor { protected: double m_risk; // size of risk int m_sl; // Stop Loss int m_tp; // Take Profit int m_ts; // Trailing Stop int m_pFastEMA; // Fast EMA int m_pSlowEMA; // Slow EMA int m_pMACD_SMA; // MACD signal line int m_EnvelPer; // Envelopes period double m_EnvelDev; // Envelopes deviation int m_hmacd; // MACD indicator handle int m_henvel; // Envelopes indicator handle public: void CMyEA(); void ~CMyEA(); virtual bool Init(string smb,ENUM_TIMEFRAMES tf); // initialization virtual bool Main(); // main function virtual void OpenPosition(long dir); // open position on signal virtual void ClosePosition(long dir); // close position on signal virtual long CheckSignal(bool bEntry); // check signal }; //------------------------------------------------------------------2.4. Eliminare Indicatori
//------------------------------------------------------------------ void CMyEA::~CMyEA() { IndicatorRelease(m_hmacd); // delete MACD indicator IndicatorRelease(m_henvel); // delete Envelopes indicator } //------------------------------------------------------------------2.5. Inizializzare Variabili
//------------------------------------------------------------------ Init bool CMyEA::Init(string smb,ENUM_TIMEFRAMES tf) { if(!CExpertAdvisor::Init(0,smb,tf)) return(false); // initialize parent class // copy parameters m_risk=Risk; m_tp=TP; m_sl=SL; m_ts=TS; m_pFastEMA=FastEMA; m_pSlowEMA=SlowEMA; m_pMACD_SMA=MACD_SMA; m_EnvelPer = EnvelPer; m_EnvelDev = EnvelDev; m_hmacd=iMACD(m_smb,PERIOD_D1,m_pFastEMA,m_pSlowEMA,m_pMACD_SMA,PRICE_CLOSE); // create MACD indicator m_henvel=iEnvelopes(m_smb,PERIOD_H1,m_EnvelPer,0,MODE_SMA,PRICE_CLOSE,m_EnvelDev); // create Envelopes indicator if(m_hmacd==INVALID_HANDLE ||m_henvel==INVALID_HANDLE ) return(false); // if there is an error, then exit m_bInit=true; return(true); // trade allowed }
2.6. Funzione di Trading
//------------------------------------------------------------------ CheckSignal long CMyEA::CheckSignal(bool bEntry) { double macd[4], // Array of MACD indicator values env1[3], // Array of Envelopes' upper border values env2[3]; // Array of Bollinger Bands' lower border values MqlRates rt[3]; // Array of price values of last 3 bars if(CopyRates(m_smb,m_tf,0,3,rt)!=3) // Copy price values of last 3 bars to array { Print("CopyRates ",m_smb," history is not loaded"); return(WRONG_VALUE); } // Copy indicator values to array if(CopyBuffer(m_hmacd,0,0,4,macd)<4 || CopyBuffer(m_henvel,0,0,2,env1)<2 ||CopyBuffer(m_henvel,1,0,2,env2)<2) { Print("CopyBuffer - no data"); return(WRONG_VALUE); } // Buy if MACD is growing and if there is a bounce from the Evelopes' lower border if(rt[1].open<env2[1] && rt[1].close>env2[1] && macd[1]<macd[2] && macd[2]<macd[3]) return(bEntry ? ORDER_TYPE_BUY:ORDER_TYPE_SELL); // condition for buy // Sell if MACD is dwindling and if there is a bounce from the Evelopes' upper border if(rt[1].open>env1[1] && rt[2].close<env1[1]&& macd[1]>macd[2] && macd[2]>macd[3]) return(bEntry ? ORDER_TYPE_SELL:ORDER_TYPE_BUY); // condition for sell return(WRONG_VALUE); // if there is no signal } CMyEA ea; // class instance
E così, dopo aver scritto il codice, invia l'esperto risultante allo Strategy Tester.
3. Testing
Nello Strategy Tester per il periodo "Ultimo anno" su EURUSD otteniamo il seguente grafico:
Figura 3. Risultati del Test del Sistema di Trading con i Parametri Iniziali
I risultati non sono impressionanti, quindi iniziamo a ottimizzare i livelli di Stop Loss e Take Profit.
4. Ottimizzazione in Strategy Tester
Ottimizzeremo i parametri Stop Loss e Take Profit all'intervallo 10-500 con il passaggio 50.
Migliori risultati: Stop Loss = 160, Take Profit = 310. Dopo l'ottimizzazione di Stop Loss e Take Profit abbiamo ricevuto il 67% delle negoziazioni redditizie contro il precedente 36% e un utile netto di $ 1522,97. Pertanto, con semplici manipolazioni, abbiamo aggiornato il nostro sistema al pareggio e persino ottenuto un certo profitto.
Figura 4. Risultati del Test del Sistema di Trading con Stop Loss e Take Profit Ottimizzati
Quindi ottimizziamo il periodo e la deviazione delle Envelope.
Il periodo delle envelope cambierà da 10 a 40 con il passaggio 4 e la deviazione - da 0,1 a 1 con il passaggio 0,1.
I migliori risultati di ottimizzazione sono: Periodo degli envelope = 22, Deviazione degli envelope = 0,3. Anche ora abbiamo un utile netto di $ 14418,92 e il 79% dei trade redditizi.
Figura 5. Risultati del Test del Sistema di Trading con periodi e deviazioni di Envelope ottimizzati
Se aumentiamo il rischio a 0,8, otterremo un utile netto di $ 77330,95.
Figura 6. I Risultati del Test del Sistema di Trading con Rischio Ottimizzato
5. Ottimizzazione della Strategia
L'ottimizzazione della strategia può consistere nei seguenti passaggi:
- Indicatore di tendenza del cambiamento
- Seleziona un altro envelope
- Seleziona un altro timeframe
- Modificare le condizioni di trading
5.1. Indicatore di Tendenza del Cambiamento
Come possiamo vedere dall'articolo Diversi Modi di Trovare una Tendenza in MQL5, i migliori indicatori di tendenza sono la media mobile e un "fan" delle medie mobili.
Sostituiamo l'indicatore MACD con una semplice media mobile. Il codice dell'esperto può essere trovato nel file Macena.mq5 allegato.
5.2. Seleziona un'Altra Envelope
Oltre all’Envelope puoi anche selezionare un altro envelope a nostra disposizione. Ad esempio, Price Channel, Bollinger Bands o un envelope basato su medie mobili.
Un esempio di esperto, che utilizza MA e Bollinger Bands, può essere trovato nel file Maboll.mq5 allegato.
5.3. Seleziona un Altro Timeframe
Cambiamo il timeframe da grande o minore. Come un timeframe più grande - prendi H4, come il minore - M15, quindi testa e ottimizza il tuo sistema.
A tale scopo, sostituire una sola riga nel codice:
m_henvel=iEnvelopes(m_smb,PERIOD_H1,m_EnvelPer,0,MODE_SMA,PRICE_CLOSE,m_EnvelDev); // create Envelopes indicator
Nel caso del timeframe H4:
m_henvel=iEnvelopes(m_smb,PERIOD_H4,m_EnvelPer,0,MODE_SMA,PRICE_CLOSE,m_EnvelDev); // create Envelopes indicator
Per il timeframe M15:
m_henvel=iEnvelopes(m_smb,PERIOD_M15,m_EnvelPer,0,MODE_SMA,PRICE_CLOSE,m_EnvelDev); // create Envelopes indicator
5.4. Modifica delle Condizioni di Trading
Come esperimento, cambiamo anche le condizioni di trading.
- Rendere il sistema in grado di invertire. Compreremo sul rimbalzo dal limite inferiore dell’Envelope e venderemo sul rimbalzo dal limite superiore dell’Envelope.
- Controllare il sistema senza seguire l'andamento del giorno. Questo viene fatto semplicemente inserendo il seguente codice nel blocco di trading:
//------------------------------------------------------------------ CheckSignal long CMyEA::CheckSignal(bool bEntry) { double env1[3], // Array of Envelopes' upper border values env2[3]; // Array of Bollinger Bands' lower border values MqlRates rt[3]; // Array of price values of last 3 bars if(CopyRates(m_smb,m_tf,0,3,rt)!=3) // Copy price values of last 3 bars to array { Print("CopyRates ",m_smb," history is not loaded"); return(WRONG_VALUE); } // Copy indicator values to array if(CopyBuffer(m_henvel,0,0,2,env1)<2 || CopyBuffer(m_henvel,1,0,2,env2)<2) { Print("CopyBuffer - no data"); return(WRONG_VALUE); } // Buy if there is a bounce from the Evelopes' lower border if(rt[1].open<env2[1] && rt[1].close>env2[1]) return(bEntry ? ORDER_TYPE_BUY:ORDER_TYPE_SELL); // condition for buy // Sell if there is a bounce from the Evelopes' upper border if(rt[1].open>env1[1] && rt[2].close<env1[1]) return(bEntry ? ORDER_TYPE_SELL:ORDER_TYPE_BUY); // condition for sell return(WRONG_VALUE); // if there is no signal } CMyEA ea; // class instance //------------------------------------------------------------------ OnInit
3. Chiuderemo la posizione corta quando il prezzo non è sceso, ma si è girato ed è salito.
4. Chiuderemo la posizione lunga quando il prezzo non è salito molto, ma si è trasformato ed è sceso.
Puoi inventare molti altri modi per ottimizzare una strategia di trading, alcuni dei quali sono descritti nella letteratura corrispondente.
Ulteriori ricerche dipendono da te.
6. Test su Intervalli Diversi
Testa il nostro Expert Advisor su intervalli di tempo uguali con un turno di 1 mese. Prendiamo "L'anno scorso" come periodo di prova. Periodo di tempo - 3 mesi.
Intervallo di test | Profitto, USD | Trade vantaggiosi |
---|---|---|
1.01.2010 - 30.03.2010 | 7239.50 | 76.92% |
1.02.2010 - 30.04.2010 | -6577.50 | 0% |
1.03.2010 - 30.05.2010 | -8378.50 | 50% |
1.04.2010 - 30.06.2010 | -6608.00 | 0% |
1.05.2010 - 30.07.2010 | 41599.50 | 80% |
1.06.2010 - 30.08.2010 | 69835.50 | 85% |
Conclusione
Breve conclusione: sulla base di questo modello puoi implementare abbastanza rapidamente la tua idea di trading con il minimo di tempo e sforzo.
Anche l'ottimizzazione dei parametri di sistema e dei criteri di trading non crea problemi.
Per creare un sistema di trading funzionante più stabile, è consigliabile ottimizzare tutti i parametri su intervalli di tempo più lunghi.
Elenco delle fonti utilizzate:- 20 Segnali di trading nell'articolo MQL5.
- L'articoloPrototype of Trade Robot.
- Articolo Diversi modi per rilevare una tendenza in MQL5.
- Articolo Expert Advisors Basati su Sistemi di Trading Popolari e sull'Alchimia dell'Ottimizzazione dei Robot di Trading.
- Articolo Limitazioni e Verifiche negli Expert Advisor.
- Articolo Scrivere un Expert Advisor utilizzando Approccio di Programmazione Orientato agli Oggetti di MQL5.
- Articolo Funzioni per la Gestione del Denaro in un Expert Advisor
Tradotto dal russo da MetaQuotes Ltd.
Articolo originale: https://www.mql5.com/ru/articles/148
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Accetti la politica del sito e le condizioni d’uso