English Русский 中文 Español Deutsch 日本語 Português 한국어 Français
preview
Comprendere e Utilizzare Efficacemente il Tester di Strategie MQL5

Comprendere e Utilizzare Efficacemente il Tester di Strategie MQL5

MetaTrader 5Tester | 7 aprile 2025, 12:57
180 0
Mohamed Abdelmaaboud
Mohamed Abdelmaaboud

Introduzione

In qualità di programmatori o sviluppatori di MQL5, dobbiamo comprendere e utilizzare bene il tester di strategia per ottenere risultati efficaci. Utilizzando questo prezioso strumento possiamo ottenere informazioni preziose in termini di prestazioni dei nostri programmi MQL5 creati e ciò influirà sull'ottenimento di risultati di trading migliori. Per questo motivo, prima di eseguire i nostri test, dobbiamo comprendere bene alcuni argomenti importanti, come la gestione di tutti i tipi di errore, poiché è normale che gli sviluppatori commettano degli sbagli che si traducono in errori. Un altro argomento che dobbiamo comprendere bene è il debug, che ci permette di eseguire i programmi creati in maniera interattiva. Poi, arriviamo allo strumento più importante e prezioso che è il tester di strategie per provare e valutare i nostri programmi creati con caratteristiche più interessanti della MetaTrader 4. Questo articolo, quindi, sarà un incredibile viaggio di apprendimento per comprendere gli aspetti più importanti dell'utilizzo del Tester di Strategie MQL5, che tratteremo attraverso i seguenti argomenti:

Cercheremo di trattare i punti più comuni di questi argomenti precedenti per capire bene cosa dobbiamo affrontare come programmatori o sviluppatori. Ciò che devo dire è che quando si affronta questo argomento, è normale che tutti i lettori conoscano già il linguaggio di programmazione MQL5 e sappiano come codificare i loro programmi, poiché si tratta di un argomento che è necessario comprendere per ottenere il massimo beneficio dalla lettura di questo articolo. Se avete bisogno di imparare prima il linguaggio, potete reperire la documentazione di MQL5. Inoltre, potete leggere gli altri miei articoli sull'apprendimento delle basi della programmazione mql5 e su come creare sistemi di trading basati sugli indicatori tecnici più diffusi e spero che li troviate utili.

Errori

In questo argomento, impareremo a conoscere gli errori che possiamo trovare durante la creazione, l'esecuzione e il funzionamento dei programmi MQL5. Ciò che rende questo argomento molto importante da comprendere è che MQL5 segnalerà questi errori correttamente, ma se non sappiamo cosa significano o in quale fase del nostro programma avvengono, impiegheremo molto più tempo per gestirli o risolverli rispetto a quando sappiamo già il loro significato.

Presenteremo questo argomento in base alla fase del nostro lavoro sul programma MQL5, mentre scriviamo il nostro codice ci sono errori e avvertimenti che possono essere affrontati: errori di compilazione e avvertimenti. Si possono verificare anche errori durante l'esecuzione del programma MQL5, che sono gli errori di runtime, e si possono verificare anche altri tipi di errori quando il nostro programma MQL5 cerca di operare, che sono gli errori del server di trade. Pertanto, tratteremo i seguenti tipi di errori:

  • Errori di Compilazione e Avvertimenti
  • Errori di Runtime
  • Errori del Server di Trade

Prima di trattare questi errori è importante conoscere il luogo dove gli errori compaiono. Nell'IDE MQL5, c'è una finestra del pannello degli strumenti nella parte più bassa, la trovate di default o potete visualizzarla con uno dei seguenti metodi:

1- Fare clic su Visualizza ==> Scegliere Strumenti

Strumenti

2- Premendo Ctrl+T dalla tastiera

3- Facendo clic sul pulsante Strumenti dal pannello degli strumenti principale

Strumenti2

Dopo di che, possiamo trovarlo come nell’immagine che segue

Strumenti3

Errori di Compilazione e Avvertimenti:

Quando scriviamo il nostro codice per un programma specifico, possiamo commettere degli errori, ed è normale, ad esempio scrivere una sintassi sbagliata o avere degli errori di battitura che portano a degli errori durante la compilazione del codice. In questa parte, condivideremo gli errori più diffusi e comunemente affrontati. La cosa più importante da sapere è che il programma non può essere compilato finché gli errori non vengono eliminati o risolti. Vi presenterò gli errori più comuni che possiamo incontrare:

Errore previsto per il punto e virgola:

Questo errore si verifica quando si dimentica di scrivere un punto e virgola alla fine della riga, oppure se saltiamo un punto e virgola o ancora se si dimentica una parentesi sinistra. Per evitare questo tipo di errore è necessario utilizzare correttamente questi tipi di simboli. Il codice seguente è un esempio di questo errore.

Codice errato con errore:

int a=(2+1)

L'errore sarà il seguente:

atteso punto e virgola

Codice corretto senza errori:

Dopo aver corretto il codice aggiungendo il punto e virgola alla fine della riga di codice, possiamo trovare il codice corretto come il seguente:

int a=(2+1);

Dopo aver compilato il codice, si scopre che l'errore è stato eliminato e che il codice viene compilato senza errori, come nel caso seguente:

Previsto punto e virgola risolto

Errore di token inatteso:

Questo è un altro tipo di codice errato che si presenta comunemente e il motivo è la dimenticanza di una parentesi destra nell'ultima riga di codice o l'aggiunta di una parentesi sinistra in più nella riga di codice attuale. Possiamo vedere un esempio di questo tipo di errore come segue:

Codice errato con errore:

int a=(2+1;

L'errore è visibile nella scheda Errori del pannello degli strumenti, come di seguito riportato:

Token inatteso

Codice corretto senza errori:

int a=(2+1);

Possiamo vedere la scheda Errori con gli eventuali errori dopo aver corretto il codice aggiungendo la parentesi destra come di seguito:

Token inatteso risolto

Errore di identificativo non dichiarato:

Questo tipo di errore si verifica quando si utilizza una variabile senza averla prima dichiarata, poiché è necessario dichiarare qualsiasi nuova variabile prima di utilizzarla o assegnarle un valore. La si dichiara scegliendo il tipo di dato giusto e adatto da restituire a questa variabile, ad esempio un numero intero o una stringa. Di seguito è riportato un esempio di questo tipo di errore, che consiste nell'utilizzare una nuova variabile senza dichiararla.

Codice errato con errore:

a=5;

Nel codice precedente, abbiamo utilizzato la variabile (a) assegnandole 5 senza dichiararla. Quindi, troveremo l'errore di identificativo non dichiarato quando compiliamo questo codice come il seguente:

Identificativo non dichiarato

Come si può notare, l'accuratezza della descrizione dell'errore può essere molto utile, in quanto non solo riporta l'errore, ma specifica anche la variabile "a" che è la causa dell'errore.

Codice corretto senza errori:

int a=5;

Dopo la compilazione di questo codice corretto, non troveremo alcun errore nella stessa immagine che abbiamo menzionato prima nella scheda Errori del pannello strumenti.

Errore di sbilanciamento della parentesi sinistra:

Questo tipo di errore si verifica quando manca la parentesi destra o se ne usa una destra in più. Possiamo trovare questo errore attraverso il seguente esempio.

Codice errato con errore:

   bool a=7;
   if (a=5
   a=5;

Nel codice precedente, dimenticando la parentesi destra, si riscontra l'errore di "parentesi sinistra sbilanciata" oltre all'errore di "operatore atteso", come nella figura seguente

Parentesi sinistra sbilanciata

Codice corretto senza errori:

   bool a=7;
   if (a=5)
   a=5;
Dopo aver corretto il codice, scopriremo che è stato compilato senza errori.


Errore imprevisto di fine programma:

A volte manca una parentesi di chiusura nel nostro codice e si verifica un errore inatteso di fine programma. Per risolvere questo errore, dobbiamo controllare il nostro codice per vedere cosa è necessario aggiungere o assicurarci che ogni parentesi di apertura ne abbia una di chiusura. Di seguito è riportato un esempio di questo codice.

Codice errato con errore:

void OnStart()
  {
   bool a=7;
   if (a=5)
   a=5;

Scrivendo il codice allo stesso modo del blocco precedente, dimenticando la parentesi di chiusura dopo l'ultima riga (a=5), si può riscontrare l'errore di "fine inattesa del programma", oltre a un altro errore di "parentesi sbilanciate" uguale a quello della seguente immagine

fine inaspettata del programma

Codice corretto senza errori:

void OnStart()
  {
   bool a=7;
   if (a=5)
   a=5;
   }

Dopo aver corretto il codice aggiungendo la parentesi di chiusura, il codice viene compilato senza errori.

Le espressioni non sono consentite su un errore di livello globale:

Questo errore si verifica quando manca una parentesi sinistra in un operatore composto o quando si scrive un'istruzione o un'espressione al di fuori dell'ambito di una funzione specifica, dato che si devono usare solo espressioni all'interno dell'ambito della funzione. L'esempio seguente riguarda questo tipo di errore.

Codice errato con errore:

   int a=(7+5);
   if (a<7)
   
   a=7;
   }

Nel codice precedente, abbiamo saltato l'apertura (}) che cambiava l'ambito e si è verificato l'errore "Le espressioni non sono consentite in un ambito globale". Di seguito viene riportato l'errore dalla scheda Errori.

Le espressioni non sono consentite in un ambito globale


Codice corretto senza errori:

   int a=(7+5);
   if (a<7)
   {
   a=7;
   }

Dopo aver corretto il codice allo stesso modo del blocco di codice precedente, scopriremo che il codice è stato compilato senza errori.

Errore, conteggio errato dei parametri:

Questo tipo di errore si verifica quando si utilizza una funzione specifica con parametri specifici e non si specificano correttamente questi parametri, specificandone troppi o non abbastanza. Questo errore viene visualizzato se si utilizza la funzione predefinita o le funzioni create. Di seguito è riportato un esempio di questo errore.

Codice con errore:

Se abbiamo creato una funzione "myVal" che restituisce un valore intero del risultato della somma di due valori interi, significa che abbiamo due parametri in questa funzione? Quindi, quando chiamiamo questa funzione utilizzando parametri diversi da questi due, otterremo questo tipo di errore, come nel caso del seguente codice

void OnStart()
  {
   int example=myVal(10);
  }
//+------------------------------------------------------------------+
int myVal(int a, int b)
  {
   return a+b;
  }

Compilando il codice sbagliato precedente si ottiene un errore simile al seguente:

Conteggio dei parametri errati

Codice senza errori:

Per scrivere correttamente questo codice è necessario utilizzare i parametri specifici di questa funzione creata come segue

void OnStart()
  {
   int example=myVal(10,20);
  }
//+------------------------------------------------------------------+
int myVal(int a, int b)
  {
   return a+b;
  }

Dopo aver compilato questo codice corretto, non troveremo alcun errore.

Errore, atteso qualche operatore:

Questo tipo di errore si verifica quando manca un operatore in una posizione specifica, mancandolo completamente o posizionandolo in modo errato. Di seguito viene riportato un esempio di questo tipo di errore.

Codice con errore:

int a= 7 10;

Nel codice precedente manca un operatore tra i due numeri e questo è il motivo per cui si otterrà un errore di "atteso qualche operatore", come nell'immagine seguente:

Atteso qualche operatore

Codice senza errori:

int a= 7+10;

Dopo aver corretto il codice aggiungendo il (+), il codice verrà compilato senza errori.

Gli errori citati sono i più diffusi in questo tipo di errori di compilazione, ma abbiamo detto che ci sono anche gli avvertimenti di compilazione e dobbiamo imparare cosa sono, sono mostrati a scopo informativo e non sono errori. Di seguito è riportato un esempio di codice che ci permette di ottenere un avvertimento nella scheda Errori

int a;

Compilando il codice precedente otterremo un avviso di variabile 'a' non utilizzata, poiché abbiamo dichiarato una nuova variabile 'a' ma non l'abbiamo utilizzata né le abbiamo assegnato un valore. Di seguito è riportato l'avviso sotto forma di immagine

 avviso

Per ulteriori informazioni su MQL5, è possibile consultare il seguente link alla documentazione:

Alcuni suggerimenti che possono essere molto utili e di aiuto per gestire questi errori quando si verificano:

  • Correggeteli a partire dall'inizio degli errori, perché potrebbe risolvere tutti gli errori in base al motivo dell'errore.
  • Facendo doppio clic sulla riga dell'errore nella scheda Errori del Pannello Strumenti si accede alla riga di codice che presenta il problema.

Ora abbiamo imparato a conoscere gli errori che si possono verificare nella prima fase di scrittura del codice del programma MQL5. Passiamo alla seconda fase: gli errori che si verificano durante l'esecuzione del programma, ovvero gli errori di Runtime.

Errori di Runtime:

Come abbiamo detto prima, gli errori di Runtime sono tipi di errori che si verificano durante l'esecuzione di un programma MQL5. Questi errori non impediranno al codice di essere compilato senza errori, ma non sarà eseguito o funzionante come ci aspettiamo. Possiamo trovare questi errori nel log come messaggi stampati con il motivo dell'errore e anche la riga che presenta l'errore nel codice sorgente.

Esempi di questi errori:

Codice errore Motivo errore
4007
  Memoria insufficiente per il trasferimento di un array o un tentativo di modificare la dimensione di un array statico
4101   ID del Grafico errato
4301   Simbolo sconosciuto come informazione di mercato
4754   Ordine non trovato
5120   Errore interno al database

Se avete notato avremo un codice di errore, poiché MQL5 ha definito tutti gli errori di runtime con dei codici per essere facilmente identificabili e potete trovare questi codici utilizzando la funzione GetLastError() per aggiungere un metodo di gestione degli errori al vostro programma, possiamo vedere questi errori nella scheda Journal durante i test o nella scheda Expert mentre si allega il programma al grafico da eseguire nel tempo corrente e potete vedere tutti gli Errori di Runtime con tutti i codici nella documentazione di MQL5 attraverso il seguente link:

https://www.mql5.com/it/docs/constants/errorswarnings/errorcodes

È necessario ricordare che il programma non terminerà l'esecuzione dopo l'errore di runtime, ad eccezione di alcuni errori critici che termineranno l'esecuzione, come ad esempio l'errore di un array fuori intervallo.

Errori del Server di Trade:

Questi tipi di errori si verificano nella fase di esecuzione di un trade come struttura di una richiesta di trade MqlTradeRequest utilizzando la funzione OrderSend(); possiamo vedere anche questi errori segnalati nella scheda Journal durante il test o nella scheda expert mentre alleghiamo il programma al grafico da eseguire in tempo reale. Se avete bisogno di vedere degli esempi di questi errori, i seguenti sono a questo scopo:

Codice errore
Motivo errore
10006
  Richiesta rigettata
10032
  Il funzionamento è consentito solo per i conti live
10033
  Il numero di ordini pendenti ha raggiunto il limite
10034
  Il volume degli ordini e delle posizioni per il simbolo ha raggiunto il limite
10041
  La richiesta di attivazione dell'ordine pendente è stata respinta, l'ordine viene annullato.

Tutti i codici di questo tipo di errore sono disponibili nella documentazione di MQL5 al seguente link:

https://www.mql5.com/it/docs/constants/errorswarnings/enum_trade_return_codes

Il Debug

In questo argomento, impareremo come il Debug può essere utilizzato attraverso lo strumento debugger di MQL5, per eseguire il nostro programma creato, attraverso i dati storici o dal vivo e possiamo farlo facendo clic sul pulsante di avvio/ripresa del debug sui dati reali o storici, come nell’immagine seguente tramite i pulsanti del debugger dal pannello degli strumenti

 Pulsanti del debugger

1- Avviare/Riprendere il debug sui dati storici

2- Avviare/Riprendere il debug su dati reali

3- Sospendere il debug

4- Interrompere il debug

Una volta premuto il pulsante di avvio per eseguire il debug sui dati storici, il programma verrà eseguito sui dati storici aprendo un grafico, se si sceglie il debug sui dati reali, il programma verrà allegato al grafico sui dati reali e accanto al programma si troverà la dicitura (Debug).

Il Tester di Strategie

In questa parte o argomento, impariamo a conoscere lo strumento più importante e prezioso di MetaTrader 5, ovvero lo Strategy Tester, con nuove funzionalità, migliori rispetto al tester di MetaTrader 4, come ad esempio il test multivaluta e altri. Per ottenere questo Strategy Tester è possibile utilizzare uno dei seguenti metodi:

1- All'apertura del terminale di trading MetaTrader 5, premere Ctrl+R dalla tastiera.

2- Dal menu Visualizza ==> scegliere Strategy Tester.

Tester

Dopo di che, troveremo il Tester di Strategia uguale al seguente della scheda Panoramica per scegliere ciò di cui si ha bisogno o il tipo di test

Tester1

Semplicemente, attraverso la scheda Panoramica, sceglieremo ciò che dobbiamo testare e una volta fatto, la scheda passerà alla scheda Impostazioni con impostazioni predefinite in base a ciò che si è scelto di testare.

  • Singolo: per testare gli Expert advisor con segnali senza modalità di visualizzazione.
  • Indicatore: per testare un indicatore.
  • Visualizza: per i test con modalità di visualizzazione sul grafico per vedere come il programma reagirà ai dati in base alle sue istruzioni.
  • Stress & Delays: per testare lo stress e i ritardi, come si evince dal nome.
  • Opzioni di ottimizzazione (Completa, Genetica, Avanti).
  • Scanner di mercato: per testare la scansione del mercato.
  • Calcoli matematici: per verificare anche i calcoli matematici.

È inoltre possibile vedere i risultati dei test precedenti attraverso l'ultima opzione Visualizza risultati precedenti. È anche possibile cercare un test specifico precedente attraverso la ricerca sotto le opzioni del test.

Se ci spostiamo nella scheda delle impostazioni, la scheda sarà uguale alla seguente:

 Tester2

  •   1- Expert: scegliere il file del programma che dobbiamo testare.
  •   2- IDE: per aprire il codice sorgente del programma selezionato.
  •   3- per salvare o caricare impostazioni specifiche.
  •   4- Simbolo: scegliere il simbolo o i simboli da testare.
  •   5- scegliere il timeframe del simbolo selezionato da testare.
  •   6- per le specifiche del simbolo selezionato.
  •   7- Data: scegliere il periodo da testare.
  •   8- scegliere il periodo di inizio del test.
  •   9- Scegliere il periodo finale del test.
  •  10- Forward: è la selezione della frazione necessaria del periodo di ottimizzazione che sarà messo da parte per il test in avanti.
  •  11- selezionare tra quelli proposti o la data di inizio del test in avanti.
  •  12- Ritardi, regolare per ottenere dati vicini a quelli reali.
  •  13- per cercare di avvicinarsi ai dati reali e alle esecuzioni reali.
  •  13/2- Modellazione: Per selezionare il modello da testare, è necessario utilizzare ogni tick o qualcos'altro?
  •  14- spuntare se avete bisogno di profitti in pip.
  •  15- scegliere l'importo del deposito di cui abbiamo bisogno per iniziare il test.
  •  16- scegliere la valuta del deposito.
  •  17- scegliere la leva.
  •  18- per scegliere se vogliamo un'ottimizzazione o meno, ne parleremo più avanti.
  •  19- spuntare se abbiamo bisogno di visualizzare i trade o le esecuzioni durante il test.


Abbiamo anche la scheda Input per verificare se il programma testato dispone di input che possono essere inseriti o modificati dall'utente.

Dopo aver determinato le nostre impostazioni e aver premuto il pulsante Inizio, il programma verrà testato e potremo monitorare il test attraverso il grafico che comparirà se effettuiamo il test visuale e le schede in questo grafico, come Trade per vedere le operazioni eseguite se il nostro programma lo fa, Storico per monitorare gli ordini chiusi o cancellati, Operazioni per vedere tutte le operazioni e Registro per controllare i messaggi stampati del programma e altro. Possiamo anche monitorarlo attraverso la scheda Grafico della finestra del Tester di Strategia per controllare le prestazioni del programma.

Al termine del test si può controllare anche la scheda Backtest che apparirà con tutte le statistiche e gli approfondimenti del test, come nell'esempio seguente.

Tester3

Tester4

In base al programma da testare, i dati della scheda Backtest appariranno simili o diversi da quelli visti nell'esempio precedente.

C'è un'altra cosa da menzionare, perché è molto importante nel processo di test, ovvero l'Ottimizzazione, che comprende la selezione di un'ampia gamma di parametri e input diversi e la verifica di ogni possibile combinazione di questi input o parametri per controllare e testare quali parametri genereranno i risultati migliori. Sceglieremo uno dei modelli di Ottimizzazione dalla scheda Panoramica e selezioneremo l'impostazione adatta di Ottimizzazione, come nelle immagini seguenti.

Tester5

Tester6

Gli elementi più importanti da controllare e valutare dopo il test:

  • Utile Netto: Si calcola sottraendo la perdita lorda dal profitto lordo.
  • Draw Down: è la perdita massima che il conto subisce durante le operazioni.
  • Fattore di Profitto È il rapporto tra profitto lordo e perdita lorda.
  • Guadagno Atteso: è il profitto o la perdita media di un'operazione.
  • Fattore di Recupero: misura la capacità di recupero della strategia testata dopo aver subito perdite.  


Conclusioni

Abbiamo appreso alcuni argomenti essenziali su uno degli strumenti più importanti e preziosi che tutti noi dobbiamo padroneggiare quando sviluppiamo un programma MQL5, ovvero il processo di test attraverso il Tester di Strategia del terminale di trading MetaTrader 5 e abbiamo appreso alcuni argomenti correlati che ci aiuteranno a comprendere e utilizzare questo strumento in modo efficace. Abbiamo imparato a conoscere gli errori che si verificano durante lo sviluppo di programmi MQL5 in base ai tipi di errori, che sono:

  • Errori di Compilazione e Avvisi.
  • Errori di Runtime.
  • Errori del Server di Trade.

Poi abbiamo imparato a conoscere il Debug attraverso l'apprendimento dell'uso del debugger dell'IDE MQL5 e abbiamo imparato a utilizzare il Tester di Strategia di MetaTrader 5 attraverso l'apprendimento dei suoi diversi modelli, possiamo impostare le impostazioni del test in base al modello, possiamo monitorare il processo di test attraverso una scheda differente che riporta tutto quando si testa qualsiasi programma MQL5 e dopo il test come possiamo leggere il rapporto del test e identificare gli elementi più importanti che dobbiamo controllare e valutare e come possiamo ottimizzare la nostra strategia attraverso il test per ottenere il miglior risultato dal programma MQL5 in prova.

Spero che questo articolo e le sue informazioni vi siano utili per aiutare a migliorare i vostri risultati attraverso test efficaci e la creazione di programmi MQL5. Se l'articolo vi è stato utile e avete necessità di leggerne altri, potete consultare gli altri miei articoli, come la condivisione di come creare sistemi di trading basati sugli indicatori tecnici più popolari.

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

Algoritmi di ottimizzazione della popolazione: Semina e Crescita degli Alberelli (Saplings Sowing and Growing up - SSG) Algoritmi di ottimizzazione della popolazione: Semina e Crescita degli Alberelli (Saplings Sowing and Growing up - SSG)
L'algoritmo Saplings Sowing and Growing up (SSG) si ispira a uno degli organismi più resistenti del pianeta, che dimostra un'eccezionale capacità di sopravvivenza in un'ampia varietà di condizioni.
Come creare un indicatore True Strength Index personalizzato utilizzando MQL5 Come creare un indicatore True Strength Index personalizzato utilizzando MQL5
Ecco un nuovo articolo su come creare un indicatore personalizzato. Questa volta lavoreremo con il True Strength Index (TSI) e creeremo un Expert Advisor basato su di esso.
Algoritmi di ottimizzazione della popolazione: Algoritmo come-l’Elettromagnetismo (ЕМ) Algoritmi di ottimizzazione della popolazione: Algoritmo come-l’Elettromagnetismo (ЕМ)
L'articolo descrive i principi, i metodi e le possibilità di utilizzo dell'Algoritmo Elettromagnetico in vari problemi di ottimizzazione. L'algoritmo EM è un efficiente strumento di ottimizzazione in grado di lavorare con grandi quantità di dati e funzioni multidimensionali.
Approccio brute force per la ricerca di pattern (Parte V): Una nuova prospettiva Approccio brute force per la ricerca di pattern (Parte V): Una nuova prospettiva
In questo articolo mostrerò un approccio completamente diverso al trading algoritmico che ho adottato dopo molto tempo. Naturalmente, tutto questo ha a che fare con il mio programma di brute force, che ha subito una serie di modifiche che consentono di risolvere diversi problemi contemporaneamente. Tuttavia, l'articolo è risultato essere più generale e semplice possibile, motivo per cui è adatto anche a chi non sa nulla di brute force.