English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Türkçe
Come Creare Rapidamente un Expert Advisor per l’Automated Trading Championship 2010

Come Creare Rapidamente un Expert Advisor per l’Automated Trading Championship 2010

MetaTrader 5Esempi | 16 dicembre 2021, 11:01
88 0
Andrey Kornishkin
Andrey Kornishkin

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

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

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

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

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

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

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.  

  1. Rendere il sistema in grado di invertire. Compreremo sul rimbalzo dal limite inferiore dell’Envelope e venderemo sul rimbalzo dal limite superiore dell’Envelope.
  2. 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%
Sommario: Non è consigliabile utilizzare l’Expert Advisor con una gestione del denaro così aggressiva. Riduci il rischio.


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:
  1. 20 Segnali di trading nell'articolo MQL5.
  2. L'articoloPrototype of Trade Robot.
  3. Articolo Diversi modi per rilevare una tendenza in MQL5.
  4. Articolo Expert Advisors Basati su Sistemi di Trading Popolari e sull'Alchimia dell'Ottimizzazione dei Robot di Trading.
  5. Articolo Limitazioni e Verifiche negli Expert Advisor.
  6. Articolo Scrivere un Expert Advisor utilizzando Approccio di Programmazione Orientato agli Oggetti di MQL5.
  7. 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

File allegati |
mabol.mq5 (6.65 KB)
macena.mq5 (6.94 KB)
maena.mq5 (6.58 KB)
Ricerca di Errori e Registrazione Ricerca di Errori e Registrazione
MetaEditor 5 ha la funzione di debug. Tuttavia quando scrivi i tuoi programmi MQL5, spesso non vuoi visualizzare solo i singoli valori, ma tutti i messaggi che appaiono durante i test e il lavoro online. Quando il contenuto del file del log è di grandi dimensioni, è ovvio automatizzare il recupero rapido e semplice del messaggio richiesto. In questo articolo considereremo i modi per trovare errori nei programmi MQL5 e i metodi di logging. Inoltre semplificheremo l'accesso ai file e conosceremo un semplice programma LogMon per una comoda visualizzazione dei log.
Controllo dello Slope della Curva di Saldo Durante il Lavoro di un Expert Advisor Controllo dello Slope della Curva di Saldo Durante il Lavoro di un Expert Advisor
Trovare regole per un sistema di trading e programmarle in un Expert Advisor è una metà del lavoro. In qualche modo, è necessario correggere il funzionamento dell'Expert Advisor in quanto accumula i risultati del trading. Questo articolo descrive uno degli approcci che consente di migliorare le prestazioni di un Expert Advisor attraverso la creazione di un feedback che misura la pendenza della curva di bilanciamento.
Simulink: una Guida per gli Sviluppatori di Expert Advisor Simulink: una Guida per gli Sviluppatori di Expert Advisor
Non sono un programmatore professionista. E così, il principio di "passare dal semplice al complesso" è di primaria importanza per me quando lavoro allo sviluppo del sistema di trading. Cosa esattamente è semplice per me? Prima di tutto, è la visualizzazione del processo di creazione del sistema e la logica del suo lavoro. Inoltre, è un minimo di codice scritto a mano. In questo articolo, tenterò di creare e testare il sistema di trading basato su un pacchetto Matlab, e quindi scrivere un Expert Advisor per MetaTrader 5. I dati storici di MetaTrader 5 verranno utilizzati per il processo del test.
L'uso delle Librerie MQL5 Standard Trade Class nella scrittura di un Expert Advisor L'uso delle Librerie MQL5 Standard Trade Class nella scrittura di un Expert Advisor
Questo articolo spiega come utilizzare le principali funzionalità di MQL5 Standard Trade Class nella scrittura di Expert Advisor che implementano la chiusura e la modifica della posizione, l'immissione e l'eliminazione di ordini in sospeso e la verifica del margine prima di piazzare un trade. Abbiamo anche dimostrato come le classi di trading possono essere utilizzate per ottenere dettagli su ordini e transazioni.