English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Türkçe
Guida al Test all'Ottimizzazione degli Expert Advisor in MQL5

Guida al Test all'Ottimizzazione degli Expert Advisor in MQL5

MetaTrader 5Tester | 9 dicembre 2021, 14:00
933 0
Samuel Olowoyo
Samuel Olowoyo

Introduzione

La maggior parte delle volte in cui uno sviluppatore ha scritto un Expert Advisor, assicurarsi che l'Expert Advisor raggiunga il suo obiettivo di buona redditività è sempre un processo molto impegnativo. In questo articolo, esamineremo alcuni dei principali passaggi necessari per testare e ottimizzare un Expert Advisor in modo da essere in grado di raggiungere l'obiettivo desiderato di scrivere l'Expert Advisor.


1. Identificazione e Correzione degli Errori di Codice

Inizieremo questo articolo esaminando alcuni errori di codice comuni normalmente riscontrati nel processo di scrittura di un codice Expert Advisor. La maggior parte delle volte, i principianti trovano difficoltà nell’identificare e correggere gli errori di codice quando scrivono i loro codici o quando modificano un codice scritto da un altro sviluppatore. In questa sezione, vedremo quanto è facile utilizzare l'editor MQL5 per identificare e correggere alcuni di questi errori.

Hai appena finito di scrivere il codice e sembra che tutto dovrebbe funzionare solo perché sei quasi certo che il codice sia privo di errori. Oppure, era un codice che è stato scritto da qualcun altro e hai apportato alcune modifiche e, ahimè! quando si preme il pulsante Compila (o si preme F7), vengono visualizzati una serie di errori nel codice, come mostrato nel tab Error della finestra MetaEditor Toolbox.

Errori di compilazione in un codice di Expert Advisor

Figura 1. Errori di compilazione in un codice di Expert Advisor

Wow! 38 errori e 1 avviso, il tuo codice potrebbe non avere tanti errori come mostrato qui; tutto ciò che vogliamo guardare sono i vari tipi di errori che potrebbero apparire durante la compilazione del nostro codice e come possiamo risolverli. Descriviamo il diagramma sopra.

  • La Sezione contrassegnata con 1 mostra la descrizione dell'errore nel codice. Questo è ciò che ci dà l'idea di come appare l'errore.
  • La sezione contrassegnata con2 ci mostra in quale file abbiamo l'errore. Questo è molto importante se abbiamo incluso file che presentano errori. Con questo, saremo in grado di sapere quale file dobbiamo controllare per l'errore descritto.
  • La sezione contrassegnata con3 ci mostra quale riga e colonna (sulla riga) nel nostro codice si trova l'errore. Questo ci consente di sapere quale particolare riga controllare per l'errore descritto.
  • La sezione contrassegnata con 4 mostra il riepilogo degli errori e di compilazione e degli avvisi.

Cominciamo ora a risolvere gli errori uno dopo l'altro. Scorriamo fino alla prima riga nel tab Error in modo da poter cominciare dall'inizio.

 Identificare e risolvere gli errori di codice-1

Figura 2. Identificare e risolvere gli errori di codice

Il primo problema viene descritto come: "troncamento del valore costante"e viene scoperto sulla riga 16 colonna 20, per individuare la riga esatta nel nostro codice, dal menu Editdel MetaEditor, selezionare Vai alla linea o premere CTRL G sulla tastiera.

Figura 3. Individuazione del numero di linea del codice di errore

Figura 3. Individuare il numero di linea del codice di errore

Verrà visualizzata una finestra di dialogo.

Figura 4.Individuare la finestra di dialogo del numero di linea dell'errore

Figura 4. Individuazione della finestra di dialogo del numero di linea dell’errore

L'intervallo di numero visualizzato nella finestra di dialogo è il numero totale di righe nel codice. In questo caso (1-354) mostra che il nostro codice contiene 354 righe di codice.

Digitare il numero di riga che si desidera selezionare nella casella e cliccare sul pulsante OK. Verrai portato direttamente al numero di riga nel codice. Vedrai il cursore del mouse lampeggiare su quella particolare linea.

Figura 5. Cursore che mostra il numero della linea dell’errore .

Figura 5. Cursore che mostra il numero della linea dell’ errore

Il problema qui è che dichiariamo Lot come una variabile intera (int) ma la inizializzamo con un doppio valore (0.1). Per correggere questo errore cambieremo l' int in double, salveremo il file e, quindi, faremo nuovamente click sul pulsante COMPILE per vedere se è stato corretto.

Figura 6. Compilare e salvare il codice dopo la correzione

Figura 6. Compilare e salvare il codice dopo la correzione 

Compilando nuovamente, il primo problema è stato risolto, ma abbiamo ancora altri problemi come mostrato di seguito:

Più errori nel codice da risolvere

Figura 7. Altri errori vengono visualizzati nel codice dopo la compilazione

Ora, seguiremo la stessa procedura di cui sopra e andremo alla riga 31. Tuttavia, questa volta faremo clic con il pulsante destro del mouse sull'errorenel tab Errors e selezioneremo Vai alla riga

 Un altro modo di individuare la riga di errore del codice

Figura 8. Un altro modo per individuare la riga di errore del codice 

O semplicemente seleziona l'errore e premi il pulsante Invio sulla tastiera. Immediatamente, verrai portato alla riga di codice numero 31.

Vedrai il cursore del mouse lampeggiare e anche un piccolo pulsante rosso rotondo (icona di errore) su quella particolare riga di codice 31.

Individuazione della riga di errore del codice

Figura 9a. Individuazione della riga di errore del codice

Tuttavia, se si tratta di un messaggio di avviso come il primo sulla riga 16 che abbiamo corretto in precedenza, mostrerà un pulsante giallo triangolare (icona di avviso):

Segnale di avvertimento

Figura 9b. Individuazione della riga di errore del codice

È molto ovvio che non abbiamo alcun problema sulla riga 31, ma la descrizione dell'errore dice: "'STP' -token inaspettato" .

Dobbiamo quindi controllare la riga di codice precedente (che è la riga 30) per vedere cosa potrebbe essere sbagliato. Ad un attento esame, manca il punto e virgola dopo " double ccminb = -95.0000" sulla riga 30, ecco perché abbiamo quell'errore sulla riga 31. Ora correggeremo questo errore digitando il punto e virgola dopo -95.0000 e compileremo nuovamente il codice.

Ora gli errori della riga 31 sono spariti. La prossima è la riga 100 come mostrato di seguito:

Esistono più errori nel codice

Figura 10. Esistono ancora altri errori nel codice

Ehi Olowsam, dobbiamo compilare dopo ogni correzione, perché non passiamo attraverso tutte le righe allo stesso tempo e dopo aver fatto tutte le correzioni, compiliamo il codice una volta invece di compilare dopo ogni correzione?

Hai appena fatto questa domanda?

Potresti avere ragione in un certo senso, ma non lo consiglierò. I problemi vengono sempre risolti uno dopo l'altro – Passo dopo passo. Qualsiasi tentativo di raggruppare i problemi insieme e risolverli in una sola volta può comportare non pochi mal di testa. Capirai presto perché... sii paziente con me.

Tornando al nostro problema, dobbiamo controllare la riga 100 per il prossimo errore. L'errore afferma: "'if' - le espressioni non sono consentite su un ambito globale" E sono sicuro che l'espressione if nella riga 100 non è su un ambito globale, ma perché stiamo avendo questo errore. Per favore, andiamo alla linea 100.

Figura 11.  Individuazione dell'errore nel codice

Figura 11.  Individuazione dell'errore nel codice

Non riusciamo a trovare alcun problema sulla riga 100 e poiché abbiamo appena finito la correzione della riga 31, siamo sicuri che il problema ora è tra la linea 32 e la linea 99. Quindi spostiamoci verso l'alto fino alla riga 99 (abbiamo un commento, quindi non può essere l'errore). Se guardiamo anche verso l'alto le dichiarazioni (MqlTick, MqlTradeRequest e MqlTradeResult), sono correttamente dichiarate e punteggiate.

Quindi esaminiamo il codice per l'espressione if prima di queste righe di codice di dichiarazione e vediamo se l'espressione è corretta.  A uno studio molto attento, scopriamo che l'espressione if ha una parentesi di chiusura, ma nessuna parentesi di apertura.

Figura 12. Guardare sopra il numero della riga di errore per identificare l'errore

Figura 12. Guardare sopra il numero della riga di errore per identificare l'errore

Aggiungere la parentesi graffa di apertura e compilare nuovamente il codice.

//--- Do we have enough bars to work with
   int Mybars=Bars(_Symbol,_Period);
   if(Mybars<60) // if total bars is less than 60 bars
    {
      Alert("We have less than 60 bars, EA will now exit!!");
      return;
     }

Una volta compilato il codice; gli errori sulla riga 100, 107, 121, 126, 129, ecc. sono stati completamente cancellati e ne vengono visualizzati di nuovi. Vedi perché è bene seguire passo dopo passo? 

Più errori compaiono nel codice

Figura 13. Esistono ancora altri errori nel codice

Successivamente passiamo alla riga 56 con due errori: "'cciVal1' - la conversione dei parametri non è consentita" e "'cciVal1' - l'array è richiesto"

A uno sguardo più attento alla linea 56, si suppone checciVal1 sia stato dichiarato come array. Potrebbe essere che non l'abbiamo dichiarato come array ma ora stiamo cercando di usarlo come array? Controlliamo la sezione della dichiarazione per confermarlo prima di poter sapere cosa fare dopo.

//--- Other parameters
int maHandle;               // handle for our Moving Average indicator
int cciHandle1,cciHandle2;  // handle for our CCI indicator
double maVal[];             // Dynamic array to hold the values of Moving Average for each bars
double cciVal1,cciVal2[];   // Dynamic array to hold the values of CCI for each bars
double p1_close,p2_close;   // Variable to store the close value of Bar 1 and Bar 2 respectively

Da, qui, possiamo vedere che dichiariamo erroneamente cciVal1 come un doppio piuttosto che come un array dinamico perché abbiamo omesso le parentesi quadre ([]). Aggiungiamo le parentesi quadre (proprio come abbiamo per cciVal2[]) e poi compiliamo il codice.

//--- Other parameters
int maHandle;               // handle for our Moving Average indicator
int cciHandle1,cciHandle2;  // handle for our CCI indicator
double maVal[];             // Dynamic array to hold the values of Moving Average for each bars
double cciVal1[],cciVal2[]; // Dynamic array to hold the values of CCI for each bars
double p1_close,p2_close;   // Variable to store the close value of Bar 1 and Bar 2 respectively

Gli errori nel codice si sono ridotti considerevolmente

Figura 14. Gli errori nel codice sono stati ridotti considerevolmente

Che cosa! Tanti errori sono scomparsi. Abbiamo solo corretto l'errore segnalato sulla riga 56 e alcuni altri errori sono stati risolti automaticamente. Questo perché l'errore segnalato sulla riga 56 era responsabile di quegli altri errori. Questo è il motivo per cui è bene seguire un processo passo dopo passo per risolvere gli errori nel codice.

Passiamo ora al prossimo errore segnalato sulla riga 103: "'GetLastError' - undeclared identifier"  Attendi un minuto, GetLastError dovrebbe essere una funzione ... Vai alla riga 103 per vedere qual è il problema.

//--- Get the last price quote using the MQL5 MqlTick Structure
   if(!SymbolInfoTick(_Symbol,latest_price))
     {
      Alert("Error getting the latest price quote - error:",GetLastError,"!!");    // line 103
      return;
     }

Il problema è in realtà sulla linea 103. GetLastError è una funzione e ogni funzione richiede una coppia di parentesi per i parametri di input. Digitiamo una coppia vuota di parentesi e quindi compiliamo il codice. La coppia di parentesi vuota indica che la funzione non accetta argomenti o parametri.

//--- Get the last price quote using the MQL5 MqlTick Structure
   if(!SymbolInfoTick(_Symbol,latest_price))
     {
      Alert("Error getting the latest price quote - error:",GetLastError(),"!!");  // line 103
      return;
     }

Successivamente, passiamo alla riga 159 : "'=' - l-value required " e   un avviso: "l'espressione non è booleana" Andiamo alla riga 159 e vediamo cosa significa questo errore. 

      else if(PositionGetInteger(POSITION_TYPE) = POSITION_TYPE_SELL) // line 159
       {
            Sell_opened = true; // It is a Sell

Si può vedere qui che abbiamo assegnato il valore di POSITION_TYPE_SELL a  PositionGetInteger (POSITION_TYPE) nella dichiarazione if e questo non è ciò che intendiamo fare. Invece volevamo fare un confronto. Ora cambieremo l'espressione per usare l'operatore equal piuttosto che usare un operatore di assegnazione. (cioè '==' invece di '='). Effettuare la correzione e compilare il codice.

      else if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL) // line 159
       {
            Sell_opened = true; // It is a Sell

Buono! Ora ne abbiamo un'altra da fare. Andiamo alla riga 292 per vedere perché dice "'PositionsTotal'- identificatore non dichiarato" . Aspetta un attimo, ti ricordi che abbiamo già visto un errore come questo? ‘GetlastError’ linea 103. Forse, dimentichiamo di aggiungere la coppia di parentesi anche per PositionsTotal,  poiché è una funzione. Andiamo alla riga 292 per confermare.

bool CheckTrade(string otyp)
{
   bool marker = false;
   for (int i=1; i<=PositionsTotal;i++)  // line 292
   {

Proprio come sospettavamo, è perché abbiamo dimenticato di aggiungere la coppia di parentesi per la funzione PositionsTotal. Ora, aggiungi la coppia di parentesi (PositionsTotal()) e compila il codice. Permettetemi anche di affermare che, è possibile ottenere questo errore se usiamo effettivamente una variabile che non abbiamo dichiarato in nessuna parte del codice.

Figura 15. Tutti gli errori di compilazione sono stati completamente risolti

Figura 15. Tutti gli Errori di compilazione sono stati completamente risolti

Meraviglioso! Ora siamo stati in grado di correggere tutti gli errori di compilazione. Ora è il momento di eseguire il debug del nostro codice e vedere se ci sono errori di runtime.  Qui, non entreremo nei dettagli di come eseguire il debug del nostro codice come è già stato spiegato in questo articolo.

All'inizio della sessione di debug, notiamo un altro errore:

Figura 16. Errore di runtime osservato durante il debug del codice

Figura 16. Errore di runtime osservato durante il debug del codice

Fai click sul pulsante OK e verrai indirizzato alla riga di codice che genera l'errore.

Identificazione della riga di codice che genera l'errore di runtime

Figura 17. Identificazione della riga di codice che genera l'errore di runtime

L'errore è generato da questo codice sulla riga 172 come si può vedere dalla figura sopra. Poiché l'errore è un errore "Array out of range", significa che il valore che intendiamo ottenere dall'array è fuori dall'intervallo dei valori dell'array disponibili. Quindi, ora andremo alla linea in cui copiamo i buffer dell'indicatore in array per vedere qual è il problema.

//--- Copy the new values of our indicators to buffers (arrays) using the handle
   if(CopyBuffer(maHandle,0,0,3,maVal)<0)
     {
      Alert("Error copying MA indicator Buffers - error:",GetLastError(),"!!");
      return;
     }
   if(CopyBuffer(cciHandle1,0,0,3,cciVal1)<0 || CopyBuffer(cciHandle2,0,0,3,cciVal2)<0)
     {
      Alert("Error copying CCI indicator buffer - error:",GetLastError());
      return;
     }

Possiamo osservare dalle funzioni CopyBuffer che abbiamo copiato solo tre valori (Bar 0, 1 e 2), il che significa che possiamo accedere solo ai valori di matrice di maVal[0], maVal[1],   emaVal[2] e anche cciVal1[0] , cciVal1[1]  e cciVal1[2], ecc. Ma nel nostro codice sulla riga 172, stavamo cercando di ottenere il valore dell'array per cciVal1[3]. Questo è il motivo per cui è stato generato l'errore.  Ora, interrompi il debugger in modo che possiamo correggere l'errore:

Figura 18. Arrestare il debugger per correggere l'errore nel codice

Figura 18. Arrestare il debugger per correggere l'errore nel codice

Per risolvere questo problema, dobbiamo aumentare il numero di record da copiare dai buffer degli indicatori a 5 in modo da poter ottenere i valori di matrice di cciVal1[0], cciVal1[1], cciVal1[2], cciVal1[3] e cciVal1[4] se necessario.

//--- Copy the new values of our indicators to buffers (arrays) using the handle
   if(CopyBuffer(maHandle,0,0,5,maVal)<0)
     {
      Alert("Error copying MA indicator Buffers - error:",GetLastError(),"!!");
      return;
     }
   if(CopyBuffer(cciHandle1,0,0,5,cciVal1)<0 || CopyBuffer(cciHandle2,0,0,5,cciVal2)<0)
     {
      Alert("Error copying CCI indicator buffer - error:",GetLastError());
      return;
     }

Correggere il codice come illustrato di seguito, quindi avviare nuovamente il debugger. Questa volta, niente più errori quando notiamo che il nostro Expert Advisor esegue azioni di trading

Figura 19. Tutti gli errori corretti, Expert Advisor esegue operazioni durante il debug

Figura 19. Tutti gli errori corretti, l’Expert Advisor esegue operazioni durante il debug

 

2. Test dell'Expert Advisor

Una volta che siamo sicuri che il nostro codice sia privo di errori, è ora il momento di testare l'Expert Advisor per essere in grado di ottenere le migliori impostazioni che ci daranno i migliori risultati. Per eseguire il test, utilizzeremo lo Strategy Tester, un programma integrato nel terminale  MetaTrader. Per avviare lo Strategy Tester, Vai al menu Visualizza sul Terminale e seleziona Strategy Tester.

Figura 20. Avvio dello Strategy Tester

Figura 20. Avvio dello Strategy Tester

2.1. Test Preliminari del nostro Expert Advisor

A questo punto, vogliamo testare il nostro esperto utilizzando i simboli disponibili nella Finestra di Mercato. Con questo risultato saremo in grado di indovinare per quali coppie di valute possiamo ottimizzare meglio il nostro Expert. Assicurati che la finestra di mercato contenga la maggior parte delle valute che stai prendendo di mira per l'esperto.

Seleziona l'Expert nel tabSettings dello Strategy Tester, seleziona il periodo/intervallo che hai in mente (e ovviamente puoi anche testarlo per diversi intervalli) e quindi seleziona 'Tutti i simboli selezionati in MARKET Watch' nel campo dell'ottimizzazione. Direttamente davanti c'è il parametro dei risultati dell'Ottimizzazione, seleziona Saldo + Fattore di Profitto Massimo.

Figura 34. Test preliminare dell’Expert Advisor con tutti i simboli nella finestra Market Watch

Figura 21. Test preliminare dell’Expert Advisor con tutti i simboli nella finestra Market Watch 

1. Seleziona la modalità di generazione del tick –(Ogni Tick)

2. Seleziona il Tipo di Ottimizzazione –(Tutti i simboli selezionati in MARKET Watch)

3. Seleziona il tipo di Risultato previsto dall'ottimizzazione

È possibile ottenere i dettagli dei vari tipi di ottimizzazione dalla documentazione di aiuto del terminale. Non stiamo testando in avanti, quindi lascia Forward come No.

Per questo test, verranno utilizzati i valori/parametri principali (evidenziati in verde) nel tab Input.

Figura 35. Parametri di input del test preliminare

Figura 22. Parametri di input del test preliminare

Al termine, passa al tabSettings e fai click sul pulsante Start. Al termine del test, verrà visualizzato un messaggio nel tab Journal simile al seguente:

Figura 36. Test preliminare completato

Figura 23. Test preliminare completato

Una volta completato il test, vai al tab Risultati dell’Ottimizzazione per vedere i risultati.

Figura 37. Risultati preliminari dell'ottimizzazione dei test

Figura 24. Risultati preliminari dell'ottimizzazione dei test

Il nostro interesse è nel simbolo che dà il risultato più alto in base alla nostra impostazione – (Saldo + Fattore di Profitto Massimo). Per ottenere ciò, ordiniamo il risultato facendo click sul titolo Result in modo tale che il simbolo con il risultato più alto venga elencato in alto.

Figura 38. Analisi preliminare dei risultati dell’ottimizzazione

Figura 25. Analisi preliminare dei risultati dell’ottimizzazione

Da questo risultato, possiamo vedere che il nostro Expert Advisor può essere redditizio per i seguenti simboli (EURUSD, EURJPY, AUDUSD) nell’intervallo che abbiamo selezionato.  Puoi eseguire ulteriormente questo test per un altro intervallo, ad esempio, 30 minuti e vedere cosa ottieni. Questo dovrebbe essere preso come un compito e ti preghiamo di condividere il risultato in modo che anche noi possiamo imparare.

Dal risultato del nostro test preliminare, decideremo ora per quali simboli e intervalli ottimizzeremo il nostro Expert Advisor.

In questo esempio, ottimizzeremo il nostro Expert Advisor per l’EURUSD e l'intervallo di 1 Ora.   Quali sono le cose che motivano la scelta che abbiamo appena fatto:

  • Fattore di Profitto:

Il fattore di Profitto è il rapporto tra il profitto totale e la perdita totale per quel test. Più alto è il fattore di Profitto, più redditizia è la tua strategia di trading.

  • Drawdown %:

Questo si riferisce al drawdown relativo del capitale o alla perdita maggiore (in percentuale) dal valore massimo del capitale. Più basso è il Drawdown (in percentuale), migliore è la strategia.

  • Fattore di Recupero:

Questo è il rapporto tra il profitto e il drawdown massimo. Riflette la rischiosità della strategia di trading.

Dopo aver deciso il simbolo e l’intervallo da utilizzare, è giunto il momento di ottimizzare il nostro Expert Advisor.

2.2. Ottimizzazione dell'Expert Advisor

L'ottimizzazione è semplicemente un processo di messa a punto delle prestazioni del nostro EA testando con vari fattori (parametri) che determinano l'efficacia o la redditività della nostra strategia codificata nell'EA. È una procedura simile al test, ma invece di testare l'EA solo una volta, verrà testato molte volte a seconda dei parametri selezionati nel tab Input.

Per iniziare, andiamo al tab delle impostazioni e abilitiamo l'ottimizzazione, quindi selezioniamo il tipo di risultato che vogliamo dalla nostra ottimizzazione.

Figura 39. Impostazioni dell’ottimizzazione per l’Expert Advisor

Figura 26. Impostazioni dell’ottimizzazione per l’Expert Advisor

1. Seleziona la modalità di generazione del tick –(Ogni Tick)

2. Seleziona il Tipo di Ottimizzazione –(Algoritmo Rapido Basato sulla Genetica)

3. Seleziona il tipo di Risultato atteso dall'ottimizzazione (qui selezioniamo Saldo + Fattore di Profitto Massimo)

È possibile ottenere i dettagli dei vari tipi di ottimizzazione dalla documentazione di aiuto del terminale. Non stiamo facendo forward testing, quindi lascia Forward come No. Dopo aver impostato le proprietà di ottimizzazione, impostiamo i parametri da utilizzare per l'ottimizzazione nel tab Input.

Figura 40. Ottimizzazione Parametri di Input

Figura 27. Ottimizzazione Parametri di Input

Dal momento che stiamo ottimizzando, ci concentreremo solo sulle aree evidenziate in giallo. Prima di tutto, qualsiasi parametro che non vogliamo utilizzare nell'ottimizzazione deve essere deselezionato. In altre parole, controlleremo solo i parametri che vogliamo utilizzare nell'ottimizzazione dell'EA. Qui, ho controllato cinque parametri, ma puoi decidere di controllarne solo uno o due a seconda dei parametri su cui si basa l'efficacia della tua strategia. Ad esempio, puoi controllare solo i periodi di Media Mobile e CCI in modo tale che il risultato dell'ottimizzazione ti faccia conoscere il valore migliore per ciascuno degli indicatori che danno al tuo EA le migliori prestazioni. Questa è l'essenza principale dell'ottimizzazione.

Inoltre, il numero di parametri controllati determinerà il numero totale di test ai quali il tuo EA sarà sottoposto. Vedrete presto di cosa sto parlando.

Impostazione dei Valori

Start:

Questo è il valore iniziale da utilizzare per la variabile selezionata per l'ottimizzazione.  Usiamo la variabile Stop Loss per spiegare come impostare i valori. Per lo Stop Loss, abbiamo chiesto al tester di iniziare con un valore di 30. Questo sarà il valore minimo che verrà utilizzato per lo Stop Loss durante l'ottimizzazione.

Step:

Questo è il valore incrementale per lo Stop Loss. Se impostiamo un incremento di 2 significa che, se nel primo test, usa 30 per lo Stop Loss userà 32, 36, 34 ecc. nel secondo... Ciò non significa che utilizzerà 30, quindi seguito da 32, 34 ecc. No, seleziona i valori a caso, ma saranno sempre multipli di due (2) tra il valore Start e il valore Stop.

Stop:

Questo è il valore massimo o più alto che verrà utilizzato per l'ottimizzazione. Qui abbiamo specificato 38. Ciò significa che i valori che verranno utilizzati per il test saranno compresi tra 30 e 38 ma saranno valori multipli di 2. Non utilizzerà 40 o qualsiasi valore maggiore.

Il numero totale di test che verranno eseguiti dipende dalle impostazioni di queste tre sezioni. Nel nostro esempio, il tester combinerà un totale di 5 possibilità da solo per lo Stop Loss come mostrato nella colonna Steps nel tab Input, combinerà un totale di 8 possibilità per il Take Profit, ecc. Nel momento in cui consideri tutte le altre variabili, si otterranno centinaia o migliaia di possibilità (test/pass). Se non vuoi aspettare anni per ottimizzare un singolo EA, assicurati di non includere o controllare troppe variabili; forse solo due o tre da cui dipendono davvero le prestazioni del tuo EA (in particolare, i periodi indicatore, se li usi nel tuo codice). Inoltre è necessario assicurarsi che il valore del tuo step non si traduca in troppe possibilità (test). Ad esempio, se usiamo 1 come valore dello step, abbiamo aumentato il numero di tentativi per il solo Stop Loss a 10. Bene, come detto in precedenza, il tempo totale necessario per completare una sessione di ottimizzazione dipende dal numero totale di agenti disponibili che hai configurato sul tuo sistema.

Credo che la spiegazione sia sufficiente.

Una volta terminata l'impostazione degli input, ora torniamo al tab Setting e clicchiamo sul Pulsante Start.

Una volta completata l'ottimizzazione, possiamo vedere i dettagli nel tab Journal.

Figura 43. Ottimizzazione completata come illustrato nel tab Journal

Figura 28. Ottimizzazione completata come mostrato nel tab Journal

Per visualizzare i risultati man mano che ogni test viene superato o completato, andiamo al tab Risultati dell’Ottimizzazione. Ed è sempre bene ordinare l'output in base ai risultati in modo da poter identificare facilmente le impostazioni che ci danno il miglior risultato in base alla nostra impostazione di ottimizzazione. Facendo click sull'intestazione Result all'interno del tab Risultati dell’ottimizzazione disporranno i risultati in ordine crescente o decrescente

Figura 44. Report di Ottimizzazione

Figura 29. Report di ottimizzazione

Passare al tab Grafico di Ottimizzazione per visualizzare l'aspetto del grafico.

Figura 45. Grafico di ottimizzazione

Figura 30. Grafico dell'ottimizzazione

Non capisci ciò che vedi? Non preoccuparti; i punti che vedi sono un grafico del numero di test che il tuo EA ha superato rispetto al risultato dell'ottimizzazione in base al tipo di risultato di ottimizzazione selezionato. Nel nostro caso, abbiamo selezionato Saldo + Fattore di Profitto Massimo.

2.3. Interpretazione dei risultati

Per interpretare correttamente il report di ottimizzazione, passare al tab Risultati dell’Ottimizzazione. Scoprirai che non puoi vedere alcuni campi come Fattore di profitto, Payoff previsto, Drawdown %, ecc . Per visualizzarli, fare click con il pulsante destro del mouse in un punto qualsiasi del tab Risultati dell’Ottimizzazione e selezionare le informazioni aggiuntive che desideri visualizzare come mostrato di seguito:

Figura 46. Selezionare il Drawdown%nel risultato dell'ottimizzazione

Figura 31. Selezionare il Drawdown% nel risultato dell'ottimizzazione

  Figura 47. Selezionare il Fattore di Profitto nel risultato dell'ottimizzazione

Figura 32. Selezionare il Fattore di Profitto nel risultato dell'ottimizzazione

Dopo aver aggiunto questi record aggiuntivi, analizzeremo ora il risultato dell'ottimizzazione per decidere le migliori impostazioni per il nostro Expert Advisor.

Analisi del report dell'ottimizzazione

Figura 33. Analisi del risultato dell'ottimizzazione

Dalla figura sopra, le sezioni evidenziate etichettate A e B indicano i migliori risultati per il nostro Expert Advisor.  Ora la scelta che fai è completamente tua, tutto dipende da ciò che stai cercando. Tuttavia, qui siamo interessati non solo alle impostazioni che danno il massimo profitto, ma hanno anche un drawdown % inferiore.

Come puoi vedere, la sezione A (evidenziata in giallo) ha il miglior risultato(Saldo + massimo Fattore di Profitto )di 22.381,71 con un profitto di 924,10 mentre la sezione B (evidenziata in verde) ha il secondo miglior risultato di 22.159,25 ma con un profitto maggiore di 936,55. La sezione A ha avuto un Drawdown% inferiore di 1,78 mentre B ha un drawdown più alto di 1,95.

Lo Strategy Tester salva i risultati dell'ottimizzazione nella cartella "<Client terminal data folder>\Tester\cache". Nel tuo caso, tutti i dati di ottimizzazione verranno salvati nel cci_ma_ea. EURUSD. H1.0.xml file,

Il nome del file ha il seguente formato: ExpertName.SYMBOL.PERIOD.GenerationMode.xml, dove:

  • ExpertName - Nome Expert Advisor;
  • Symbol - symbol;
  • Periodo - intervallo (M1,H1,...)
  • GenerationMode — la modalità di generazione del tick (0 — "Ogni tick", 1 — "2 minuto OHLC", 2 — "Solo prezzi Open").

I file XML possono essere aperti da MS Excel.

2.4. Scegliere il Miglior Risultato

Per ottenere finalmente il miglior risultato, dobbiamo guardare di nuovo il grafico di Ottimizzazione. Tornare al grafico Ottimizzazione.  Fare click con il pulsante destro del mouse in un punto qualsiasi del grafico e selezionare  Grafico 1D.

Seleziona il grafico 1-D dal grafico di ottimizzazione

Figura 34. Seleziona il grafico 1-dimensionale (1 D) per l'analisi dei risultati

Con questo possiamo facilmente vedere i valori di ciascuno dei parametri di input che danno il miglior risultato.  Ora puoi iniziare a scegliere ogni parametro per poter vedere il valore migliore. Fare click con il pulsante destro del mouse sul grafico e selezionare Asse X, quindi selezionare il parametro che desideri controllare. Apparirà come mostrato sotto (per Stop loss)

Figura 50. Ottenere il miglior valore StopLoss dal risultato dell'ottimizzazione

Figura 35. Ottenere il miglior valore StopLoss dal risultato dell'ottimizzazione

In realtà, dal risultato dell'ottimizzazione, è molto chiaro che il miglior Stoploss è 34, il miglior TakeProfit è 78 e il miglior CCI_Period1 è 62. Per ottenere i valori migliori per il MAPeriod e CCI_Period2, selezionare ciascuno di essi come sopra

Figura 51. Ottenere il miglior valore del Periodo di Media Mobile dal risultato dell'ottimizzazione

Figura 36. Ottenere il miglior valore del Periodo di Media Mobile dal risultato dell'ottimizzazione

Questo grafico mostra un valore di 26 come MA_Period con il miglior risultato.

Figura 52. Ottenere il miglior valore CCI_Period1 dal risultato dell'ottimizzazione

Figura 37. Ottenere il miglior valore CCI_Period1 dal risultato dell'ottimizzazione

Questo grafico mostra un valore di 62 come CCI_Period1 con il miglior risultato.

Figura 53. Ottenere il miglior valore CCI_Period2 dal risultato dell'ottimizzazione

Figura 38. Ottenere il miglior valore CCI_Period2 dal risultato dell'ottimizzazione

Questo grafico mostra valori di 28 o 30 come CCI_Period2 con i migliori risultati.

Ottenuti i migliori valori per ogni parametro, è giunto il momento del collaudo finale del nostro Expert Advisor.

2.5. Il Test Finale

Il test finale mette insieme i migliori parametri per il test dell'Expert Advisor. In questo caso, utilizzeremo i migliori valori che abbiamo scoperto nella sezione INPUT dello Strategy Tester come mostrato di seguito.

Valori di input per il test finale

Figura 39. I parametri di input del test finale

Nel tab IMPOSTAZIONI dello Strategy Tester, disabiliteremo l'Ottimizzazione come mostrato di seguito

Le impostazioni per il test finale

Figura 40. Le impostazioni del test finale

Ora faremo click sul pulsante START per iniziare il test. Una volta completato il test, abbiamo i risultati nel tab RISULTATI come mostrato di seguito

Figura 56. Risultati del test finale

Figura 41. I risultati finali del test

E allo stesso modo, abbiamo il grafico per il test nel tabGRAPH

Figura 57. Il risultato del grafico del test finale

Figura 42. Il risultato del grafico finale del test

Conclusione

In questo articolo, abbiamo discusso i modi per identificare e correggere gli errori del codice e abbiamo anche discusso di come testare e ottimizzare un Expert Advisor per il miglior simbolo dell'orologio di mercato.

Con questo articolo, credo che il controllo del codice per gli errori utilizzando l'editor e l'ottimizzazione e il test degli Expert Advisor utilizzando lo Strategy Tester renda possibile la scrittura di un Expert Advisor migliore e redditizio.

Tradotto dall’inglese da MetaQuotes Ltd.
Articolo originale: https://www.mql5.com/en/articles/156

File allegati |
cci_ma_ea.mq5 (14.23 KB)
Ordini, Posizioni e Deal in MetaTrader 5 Ordini, Posizioni e Deal in MetaTrader 5
La creazione di un solido robot di trading non può essere eseguita senza una comprensione dei meccanismi del sistema di trading MetaTrader 5. Il client terminal riceve le informazioni su posizioni, ordini e deal dal server di trading. Per gestire correttamente questi dati utilizzando l'MQL5, è necessario avere una buona comprensione dell'interazione tra il programma MQL5 e il client terminal.
Sistemi di Trading Adattivi e loro utilizzo nel Client MetaTrader 5 Sistemi di Trading Adattivi e loro utilizzo nel Client MetaTrader 5
Questo articolo suggerisce una variante di un sistema adattivo che consiste in molte strategie, ognuna delle quali esegue le proprie operazioni di trading "virtuali". Il trading reale viene eseguito in conformità con i segnali di una strategia più redditizia al momento. Grazie all'utilizzo dell'approccio orientato agli oggetti, le classi per lavorare con i dati e le classi di trading della libreria Standard, l'architettura del sistema è apparsa semplice e scalabile; ora puoi facilmente creare e analizzare i sistemi adattivi che includono centinaia di strategie di trading.
Eventi di Trade in MetaTrader 5 Eventi di Trade in MetaTrader 5
Un monitoraggio dello stato corrente di un account di trading implica il controllo delle posizioni e degli ordini aperti. Prima che un segnale di trading diventi un deal, deve essere inviato dal client terminal come richiesta al server di trading, dove verrà inserito nella coda degli ordini in attesa di essere elaborato. Accettando una richiesta dal server di trading, cancellandola mentre scade o conducendo un deal sulla sua base - tutte queste azioni vengono seguite da eventi di trading, e il server di trading informa il terminale su di essi.
Expert Advisor basato sulle "New Trading Dimensions" di Bill Williams Expert Advisor basato sulle "New Trading Dimensions" di Bill Williams
In questo articolo, parlerò dello sviluppo dell’Expert Advisor basato sul libro "New Trading Dimensions: Come Trarre Profitto dal Caos in Azioni, Bond e Materie Prime" di Bill Williams. La strategia stessa è ben nota ed il suo utilizzo è ancora piuttosto controverso tra i trader. L'articolo considera i segnali di trading del sistema, le specifiche della sua implementazione e i risultati dei test sui dati storici.