English Русский 中文 Español Deutsch 日本語 Português 한국어 Italiano Türkçe
Guide de test et d'optimisation des Expert Advisors en MQL5

Guide de test et d'optimisation des Expert Advisors en MQL5

MetaTrader 5Tester | 22 décembre 2021, 16:46
641 0
Samuel Olowoyo
Samuel Olowoyo

Introduction

La plupart du temps, lorsqu'un développeur écrit un Expert Advisor, s'assurer que l'Expert Advisor atteint son objectif de bonne rentabilité est toujours un processus très imposant. Dans cet article, nous examinerons certaines des principales étapes nécessaires au test et à l'optimisation d'un Expert Advisor afin que nous puissions atteindre l'objectif souhaité pour la rédaction de l'Expert Advisor.


1. Identification et correction des erreurs de code

Nous commencerons cet article en examinant quelques erreurs de code courantes normalement rencontrées lors du processus de rédaction d'un code d’Expert Advisor. La plupart du temps, les débutants ont du mal à identifier et à corriger les erreurs de code lors de la rédaction de leurs codes ou lors de la modification d'un code écrit par un autre développeur. Dans cette section, nous verrons à quel point il est facile d'utiliser l'éditeur MQL5 pour identifier et corriger certaines de ces erreurs.

Vous venez de terminer la rédaction du code et tout a l’air de bien fonctionner parce que vous êtes presque certain que le code est sans erreur. Ou, c'était un code qui a été écrit par quelqu'un d'autre et vous avez fait quelques modifications mais, hélas ! lorsque vous appuyez sur le bouton Compile (ou appuyez sur F7), il se présente une série d'erreurs dans le code, comme indiqué dans l'onglet Erreur de la fenêtre MetaEditor Toolbox.

Erreurs de compilation dans un code Expert Advisor

Figure 1. Erreurs de compilation dans un code Expert Advisor

Oh ! 38 erreurs et 1 avertissement, votre code peut ne pas contenir autant d'erreurs qu'indiqué ici, tout ce que nous voulons examiner sont les différents types d'erreurs susceptibles d'apparaître lors de la compilation de notre code et comment nous pouvons les résoudre. Décrivons le diagramme ci-dessus.

  • La section marquée 1 révèle la description de l'erreur dans le code. Cela nous donne une idée de ce à quoi ressemble l'erreur.
  • La section marquée 2 nous révèle l’emplacement du fichier contenant l’erreur. Cela est de grande importance si nous avons inclus des fichiers contenant des erreurs. Avec cela, nous pourrons savoir quel fichier nous devons vérifier pour l'erreur décrite.
  • La section marquée 3 nous révèle la ligne et la colonne (sur la ligne) dans notre code contenant l'erreur. Cela nous permet de savoir sur quelle ligne particulière vérifier l'erreur décrite.
  • La section marquée 4 révèle le résumé des erreurs de compilation et des avertissements.

Commençons maintenant à résoudre les erreurs les unes après les autres. Faisons défiler jusqu'à la première ligne de l'onglet Erreur afin de pouvoir recommencer depuis le début.

Identification et résolution des erreurs de code-1

Figure 2. Identification et résolution des erreurs de code

Le premier problème est décrit comme : « troncation de valeur constante » et se découvre à la ligne 16 colonne 20, pour localiser la ligne exacte dans notre code, depuis le menu Edition du MetaEditor, sélectionnez Aller à la ligne ou appuyez sur CTRL G sur votre clavier .

Figure 3. Localisation du numéro de ligne du code d'erreur

Figure 3. Localisation du numéro de ligne du code d'erreur

Une boîte de dialogue s'affichera.

Figure 4. Boîte de dialogue de localisation du numéro de la ligne d'erreur

Figure 4. Boîte de dialogue de localisation du numéro de la ligne d'erreur

La plage de nombres indiquée dans la boîte de dialogue correspond au nombre total de lignes du code. Dans ce cas (1-354) montre que notre code contient 354 lignes de code.

Tapez le numéro de ligne que vous souhaitez vérifier dans la case et cliquez sur le bouton OK. Vous serez directement orienté vers le numéro de la ligne dans le code. Vous verrez le curseur de la souris clignoter sur cette ligne particulière.

Figure 5. Curseur affichant le numéro de la ligne d'erreur

Figure 5. Curseur affichant le numéro de la ligne d'erreur

Le problème ici est que nous déclarons Lot comme une variable de nombre entier (int), mais l'initialisons avec une valeur double (0,1). Pour corriger cette erreur, nous allons changer l' int et le remplacer par double, ensuite enregistrer le fichier, puis cliquer à nouveau sur le bouton COMPILER pour voir si cela a été corrigé.

Figure 6. Compilation et enregistrement du code une fois la correction effectuée

Figure 6. Compilation et enregistrement du code après sa correction 

Lors de la nouvelle compilation, le premier problème a été résolu, mais nous avons encore d'autres problèmes comme indiqué ci-dessous :

Plus d'erreurs dans le code à résoudre

Figure 7. Plus d'erreurs apparaissent dans le code après la compilation

Nous allons maintenant suivre la même procédure que ci-dessus et passer à la ligne 31. Cependant, cette fois, nous allons faire un clic droit sur l'erreur dans l'onglet Erreurs et sélectionner Aller à la ligne

Une autre façon de localiser la ligne d'erreur de code

Figure 8. Une autre façon de localiser la ligne d'erreur de code 

Ou simplement sélectionner l'erreur et appuyer sur le bouton Entrée de votre clavier. Immédiatement, vous serez orienté vers la ligne de code numéro 31.

Vous verrez le curseur de la souris clignoter ainsi qu'un petit bouton rouge rond (icône d'erreur) sur cette ligne particulière du code 31.

Localisation de la ligne d'erreur de code

Figure 9a. Localisation de la ligne d'erreur de code

Cependant, s'il s'agit d'un message d'avertissement comme le premier de la ligne 16 que nous avons corrigé précédemment, il affichera un bouton jaune triangulaire (icône d'avertissement) :

Signal d'avertissement

Figure 9b. Localisation de la ligne d'erreur de code

Il est bien évident que nous n'avons aucun problème à la ligne 31, mais la description de l'erreur dit : « 'STP' - signe inattendu ».

Nous devons ensuite vérifier la ligne de code précédente (c'est-à-dire la ligne 30) pour voir ce qui ne va pas. En y regardant de plus près, le point-virgule manque après « double ccminb = -95.0000 » à la ligne 30, c'est pourquoi nous avons cette erreur à la ligne 31. Nous allons maintenant corriger cette erreur en tapant le point-virgule après -95.0000 et compiler à nouveau le code.

Maintenant, les erreurs de la ligne 31 ont disparu. Vient ensuite la ligne 100 comme indiqué ci-dessous :

Plus d'erreurs existent toujours dans le code

Figure 10. Plus d'erreurs existent toujours dans le code

Hé Olowsam, devons-nous compiler après chaque correction, pourquoi ne pas parcourir toutes les lignes en même temps et après avoir effectué toutes les corrections, nous compilons le code une fois au lieu de compiler après chaque correction ?

Venez-vous de poser cette question ?

Vous avez peut-être raison dans un sens, mais je vous déconseillerai. Les problèmes sont toujours résolus les uns après les autres – étape par étape. Toute tentative de regrouper les problèmes et de les résoudre à la fois peut vous causer beaucoup de maux de tête. Vous comprendrez bientôt pourquoi… soyez juste patient avec moi.

De retour à notre problème, nous devons vérifier la ligne 100 pour la prochaine erreur. L'erreur indique : « 'if' - les expressions de portée générale ne sont pas autorisées » Et je suis sûr que l'expression if de la ligne 100 n'est pas de portée globale, mais pourquoi avons-nous cette erreur. S'il vous plaît, allons à la ligne 100.

Figure 11. Localisation de l'erreur dans le code

Figure 11.  Localisation de l'erreur dans le code

Nous ne trouvons aucun problème à la ligne 100 et comme nous venons de terminer la correction de la ligne 31, nous sommes sûrs que le problème se situe maintenant entre la ligne 32 et la ligne 99. Avançons donc un peu plus haut jusqu'à la ligne 99 (nous avons un commentaire , donc cela ne peut pas être l'erreur). Si nous regardons plus haut aux déclarations (MqlTick, MqlTradeRequest et MqlTradeResult), elles sont correctement déclarées et ponctuées.

Examinons ensuite le code de l'expression if avant ces lignes de code de déclaration et voyons si l'expression est correcte.  En étudiant de très près, nous découvrons que l'expression if a une accolade fermante, mais pas une accolade ouvrante.

Figure 12. Regarder par-delà le nombre de la ligne d'erreur pour identifier l'erreur

Figure 12. Regarder par-delà le nombre de la ligne d'erreur pour identifier l'erreur

Ajoutez l'accolade ouvrante et compilez à nouveau le code.

//--- 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;
     }

Une fois le code compilé, les erreurs sur la ligne 100, 107, 121, 126, 129, , etc. auront complètement disparu pour laisser place aux nouvelles lignes. Vous voyez pourquoi il est bon d’y aller pas à pas ? 

Plus d'erreurs s'affichent dans un code

Figure 13. Plus d'erreurs existent toujours dans le code

Ensuite, nous passons à la ligne 56 avec deux erreurs : « 'cciVal1' - la conversion des paramètres n'est pas autorisée » et « 'cciVal1' - le tableau est obligatoire »

En regardant de plus près la ligne 56, cciVal1 est censé avoir été déclaré comme un tableau. Se pourrait-il que nous ne l'ayons pas déclaré comme un tableau mais que nous essayions maintenant de l'utiliser comme un tableau ? Vérifions la section de déclaration pour le confirmer avant de savoir quoi faire ensuite.

//--- 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

À partir de là, nous pouvons voir que nous déclarons par erreur cciVal1 comme un double plutôt qu’un tableau dynamique car nous avons omis les crochets ([]). Ajoutons les crochets (comme nous l'avons fait pour cciVal2[]) puis compilons le code.

//--- 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

Les erreurs ont été considérablement réduites dans le code

Figure 14. Les erreurs ont été considérablement réduites dans le code

Quoi ! Tant d'erreurs ont disparu. Nous n'avons corrigé que l'erreur signalée à la ligne 56 et d'autres erreurs ont été résolues automatiquement. En effet, l'erreur signalée à la ligne 56 était responsable de ces autres erreurs. C'est pourquoi il est bon de suivre un processus étape par étape pour résoudre les erreurs dans votre code.

Nous allons maintenant passer à la prochaine erreur signalée à la ligne 103 : « 'GetLastError' - identifiant »  Attendez une minute, GetLastError est censé être une fonction… Allons à la ligne 103 pour voir quel est le problème.

//--- 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;
     }

Le problème est en fait à la ligne 103. GetLastError est une fonction et chaque fonction a besoin d'une paire de parenthèses pour les paramètres d'entrée. Tapons une paire de parenthèses vide puis compilons le code. La paire de parenthèses vide indique que la fonction ne prend aucun argument ou paramètre.

//--- 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;
     }

Ensuite, nous passons à la ligne 159 : « '=' - l-value obligatoire »  et  un avertissement : « l’expression n’est pas une variable booléenne » Allons à la ligne 159 et voyons ce que signifie cette erreur. 

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

On peut voir ici que nous avons affecté la valeur de POSITION_TYPE_SELL to  PositionGetInteger(POSITION_TYPE)) dans l'instruction if et ce n'est pas ce que nous avons l'intention de faire. Nous voulions plutôt faire des comparaisons. Nous allons maintenant modifier l'expression pour utiliser l'opérateur égal plutôt que d'utiliser un opérateur d'affectation. (c'est-à-dire '==' au lieu de '='). Faites la correction et compilez le code.

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

Très bien ! Maintenant, il nous en reste un. Allons à la ligne 292 pour voir pourquoi il est déclaré « PositionsTotal' - identifiant non déclaré ». Attendez une minute, vous souvenez-vous que nous avons déjà vu une erreur identique ? « GetlastError » Ligne 103. Nous oublions peut-être   aussi d'ajouter la paire de parenthèses pour PositionsTotal. Allons à la ligne 292 pour confirmer.

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

Comme nous le soupçonnions, c'est parce que nous avons oublié d'ajouter la paire de parenthèses pour la fonction PositionsTotal. Ajoutez maintenant la paire de parenthèses (PositionsTotal()) et compilez le code. Permettez-moi également de préciser qu'il est possible d'obtenir cette erreur si nous utilisons effectivement une variable que nous n'avons déclarée nulle part dans le code.

Figure 15. Toutes les erreurs de compilation ont été complètement résolues

Figure 15. Toutes les erreurs de compilation ont été complètement résolues

Merveilleux ! Maintenant, nous avons pu corriger toutes les erreurs de compilation. Il est maintenant temps de déboguer notre code et de voir s'il y a des erreurs d'exécution.  Ici, nous n'entrerons pas dans les détails du débogage de notre code comme cela a déjà été expliqué dans cet article.

Au début de la session de débogage, nous remarquons une autre erreur :

Figure 16. Erreur d'exécution observée lors du débogage de code

Figure 16. Erreur d'exécution observée lors du débogage de code

Cliquez sur le bouton OK et vous serez redirigé vers la ligne de code qui génère l'erreur.

Identification de la ligne de code qui génère une erreur d'exécution

Figure 17. Identification de la ligne de code qui génère une erreur d'exécution

L'erreur est générée par ce code à la ligne 172 comme vous pouvez le voir sur la figure ci-dessus. Étant donné que l'erreur est une erreur « tableau hors plage », cela signifie que la valeur que nous avons l'intention d'obtenir du tableau est hors de la plage des valeurs du tableau disponibles. Nous allons donc maintenant passer à la ligne où nous copions les tampons d'indicateurs dans des tableaux pour voir quel est le problème.

//--- 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;
     }

Nous pouvons observer à partir des fonctions CopyBuffer que nous n'avons copié que trois valeurs (Bar 0, 1 et 2), ce qui signifie que nous ne pouvons accéder qu'aux valeurs de tableau de maVal[0],  maVal[1],  et maVal[2] et aussi cciVal1[0] , cciVal1[1]  et cciVal1[2], etc. Mais dans notre code à la ligne 172, nous essayions d'obtenir la valeur du tableau pour cciVal1[3]. C'est pourquoi l'erreur a été générée.  Maintenant, arrêtez le débogueur afin que nous puissions corriger l'erreur :

Figure 18. Arrêt du débogueur pour correction de l'erreur dans le code

Figure 18. Arrêt du débogueur pour correction de l'erreur dans le code

Pour résoudre ce problème, nous devons augmenter le nombre de dossiers à copier à partir des tampons d'indicateurs à 5 afin que nous puissions obtenir les valeurs de tableau de cciVal1[0], cciVal1[1], cciVal1[2], cciVal1[3], et cciVal1[4] si besoin est.

//--- 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;
     }

Corrigez le code comme indiqué, puis redémarrez le débogueur. Cette fois, plus d'erreurs car nous remarquons que notre Expert Advisor effectue des actions de trading

Figure 19. Toutes les erreurs sont corrigées, l’Expert Advisor trade lors du débogage

Figure 19. Toutes les erreurs sont corrigées, l’Expert Advisor trade lors du débogage

 

2. Test de l'Expert Advisor

Une fois que nous sommes sûrs que notre code est exempt d'erreurs, il est maintenant temps de tester l'Expert Advisor pour pouvoir obtenir les meilleurs paramètres qui nous donneront les meilleurs résultats. Pour effectuer le test, nous utiliserons le Testeur de stratégie, un programme intégré au terminal   MetaTrader. Pour lancer le testeur de stratégie, accédez au menu Affichage sur le terminal et sélectionnez Testeur de stratégie.

Figure 20. Lancement du Testeur de stratégie

Figure 20. Lancement du testeur de stratégie

2.1. Tests préliminaires de notre Expert Advisor

À ce stade, nous voulons tester notre Expert en utilisant les symboles disponibles dans la fenêtre Market. Avec ce résultat, nous sommes en mesure de deviner le type de paires de devise à utiliser pour mieux optimiser notre Expert. Assurez-vous que la fenêtre Market contient la plupart des devises que vous ciblez pour l'Expert.

Sélectionnez l'Expert dans l'onglet Paramètres du testeur de stratégie, sélectionnez la période/délai que vous avez en tête (et bien sûr, vous pouvez également le tester pour différents délais), puis sélectionnez « Tous les symboles sélectionnés dans MARKET Watch » dans le champ d'optimisation. Juste en face se trouve le paramètre Résultats d'optimisation, sélectionnez Solde + facteur de profit maximal.

Figure 34. Test préliminaire d'Expert Advisor avec tous les symboles dans la fenêtre Market Watch Figure 34.

Figure 21. Test préliminaire d'Expert Advisor avec tous les symboles dans la fenêtre Market Watch 

1. Sélectionnez le mode de génération de traits - (Chaque trait)

2. Sélectionnez le type d'optimisation - (Tous les symboles sélectionnés dans MARKET Watch)

3. Sélectionnez le type de résultat attendu de l'optimisation

Vous pouvez obtenir les détails des différents types d'optimisation dans la documentation d'aide du terminal. Nous ne faisons pas de tests en aval, alors gardez Forwardcomme Non.

Pour ce test, les valeurs/paramètres de base (surlignés en vert) seront utilisés dans l'onglet Entrées.

Figure 35. Paramètres d'entrée de test préliminaires

Figure 22. Paramètres d'entrée de test préliminaires

Une fois que vous avez terminé, passez à l'onglet Paramètres et cliquez sur le bouton Démarrer. À la fin du test, vous verrez un message dans l'onglet Journal semblable au suivant :

Figure 36. Test préliminaire terminé

Figure 23. Test préliminaire terminé

Une fois le test terminé, accédez à l'onglet Résultats d'optimisation pour voir les résultats.

Figure 37. Résultats préliminaires de l'optimisation des tests

Figure 24. Résultats préliminaires de l'optimisation des tests

Notre intérêt se porte sur le symbole qui donne le résultat le plus élevé en fonction de notre paramètre - (Solde + facteur de profit maximum). Pour obtenir cela, trions le résultat en cliquant sur le titre Résultat de sorte que le symbole avec le résultat le plus élevé soit classé en tête de liste.

Figure 38. Analyse préliminaire des résultats d'optimisation

Figure 25. Analyse préliminaire des résultats d'optimisation

A partir de ce résultat, nous pouvons voir que notre Expert Advisor peut être rentable pour les symboles suivants (EURUSD, EURJPY, AUDUSD) dans le délai que nous avons sélectionné.  Vous pouvez également effectuer ce test avec un différent délai, disons 30 minutes et voir ce que vous avez. Cela devrait être entendu comme un devoir et veuillez partager le résultat afin que nous puissions tous apprendre aussi.

À partir du résultat de notre test préliminaire, nous allons maintenant décider pour quel(s) symbole(s) et délai(s) nous allons optimiser notre Expert Advisor.

Dans cet exemple, nous allons optimiser notre Expert Advisor avec l'EURUSD et pour un délai de 1 Hour .  Quelles sont les choses qui motivent le choix que nous venons de faire :

  • Facteur Profit :

Le facteur Profit est le rapport du profit total à cette perte totale pour ce test. Plus le facteur Profit est élevé, plus votre stratégie de trading est rentable.

  • % Encaissement :

Il s'agit du retrait relatif des capitaux propres ou de la perte la plus importante (en pourcentage) par rapport à la valeur maximale des capitaux propres. Plus l’encaissement est bas (en pourcentage), mieux est la stratégie.

  • Facteur Recouvrement :

C'est le rapport entre le profit et l’encaissement maximal. Il reflète le caractère risqué de la stratégie de trading.

Après avoir décidé du symbole et du délai à utiliser, il est maintenant temps d'optimiser notre Expert Advisor.

2.2. Optimiser l’Expert Advisor

L'optimisation est simplement un processus d’un réglage affiné des performances de notre EA en testant divers facteurs (paramètres) qui déterminent l'efficacité ou la rentabilité de notre stratégie codée dans l'EA. C'est une procédure similaire au test, mais au lieu de tester l'EA une seule fois, il sera testé plusieurs fois en fonction des paramètres sélectionnés dans l'onglet Entrée.

Pour commencer, nous allons dans l'onglet Paramètres et activons l'optimisation, puis sélectionnons le type de résultat que nous voulons de notre optimisation.

Figure 39. Paramètres d'optimisation pour Expert Advisor

Figure 26. Paramètres d'optimisation pour Expert Advisor

1. Sélectionnez le mode de génération de traits - (Chaque trait)

2. Sélectionnez le type d'optimisation - (algorithme basé sur la génétique rapide)

3. Sélectionnez le type de résultat attendu de l'optimisation (ici, nous sélectionnons Solde + Facteur Profit Maximal)

Vous pouvez obtenir les détails des différents types d'optimisation dans la documentation d'aide du terminal. Nous ne faisons pas un test en aval, donc gardez Forward comme Non. Après avoir défini les propriétés d'optimisation, définissons les paramètres à utiliser pour l'optimisation dans l'onglet Entrées.

Figure 40. Paramètres Optimisation d'entrées

Figure 27. Paramètres Optimisation d'entrées

Puisque nous optimisons, nous nous concentrerons uniquement sur les zones surlignées en jaune. Tout d'abord, tout paramètre que nous ne voulons pas utiliser dans l'optimisation doit être décoché. En d'autres termes, nous ne vérifierons que les paramètres que nous souhaitons utiliser dans l'optimisation de l'EA. Ici, j'ai vérifié cinq paramètres, mais vous pouvez décider de n'en vérifier qu'un ou deux selon les paramètres sur lesquels repose l'efficacité de votre stratégie. Par exemple, vous pouvez vérifier uniquement les périodes de moyenne mobile et de CCI de sorte que le résultat de l'optimisation vous permette de connaître la meilleure valeur pour chacun des indicateurs qui donnent à votre EA les meilleures performances. C'est l'essence même de l'optimisation.

De plus, le nombre de paramètres vérifiés déterminera le nombre total de tests que votre EA subira. Vous verrez bientôt de quoi je parle.

Définition des valeurs

Start :

Il s'agit de la valeur de départ à utiliser pour la variable sélectionnée pour l'optimisation.  Utilisons la variable Stop Loss pour expliquer comment définir les valeurs. Pour le Stop Loss, nous avons demandé au testeur de commencer par une valeur de 30. Ce sera la valeur minimale qui sera utilisée pour le Stop Loss lors de l'optimisation.

Step :

Il s'agit de la valeur incrémentielle du Stop Loss. Si nous définissons un incrément de 2 ; cela signifie que, si dans le premier test, il utilise 30 pour Stop Loss il utilisera soit 32, 36, 34 etc. dans le second… Cela ne veut pas dire qu'il utilisera 30, suivi de 32, 34 etc. Non, il sélectionne les valeurs au hasard mais elles seront toujours des multiples de deux (2) entre la valeur Start et la valeur Stop.

Stop :

Il s'agit de la valeur maximale ou la plus élevée qui sera utilisée pour l'optimisation. Ici, nous avons spécifié 38. Cela signifie que les valeurs qui seront utilisées pour le test seront comprises entre 30 et 38 mais seront des valeurs multiples de 2. Il n'utilisera pas 40 ou toute valeur supérieure.

Le nombre total de tests qui seront effectués dépend des réglages de ces trois sections. Dans notre exemple, le testeur combinera un total de 5 possibilités uniquement pour le Stop Loss comme indiqué dans la colonne Steps de l'onglet Entrées , il combinera un total de 8 possibilités pour le Take Profit, etc. Lorsque vous considérez toutes les autres variables, vous allez obtenir des centaines ou des milliers de possibilités (tests/passes). Si vous ne voulez pas attendre longtemps pour optimiser un seul Expert Advisor, assurez-vous de ne pas inclure ou vérifier trop de variables ; peut-être juste deux ou trois dont dépend vraiment la performance de votre EA (plus particulièrement, les périodes d’indicateur, si vous les utilisez dans votre propre code). Vous devez également vous assurer que votre valeur Step n'entraînera pas trop de possibilités (tests). Par exemple, si nous utilisons 1 comme valeur Step, nous avons augmenté le nombre de tentatives pour le Stop Loss seul à 10. Eh bien, comme indiqué précédemment, le temps total requis pour terminer une session d'optimisation dépend du nombre total d'agents disponibles que vous avez configurés sur votre système.

Je pense que l'explication est suffisante.

Une fois que nous avons fini de définir les entrées, nous retournons maintenant à l'onglet Paramètres pour cliquer sur le bouton Démarrer.

Une fois l'optimisation terminée, nous pouvons voir les détails sur l'onglet journal.

Figure 43. Optimisation terminée comme indiqué dans l'onglet Journal

Figure 28. Optimisation terminée comme indiqué dans l'onglet Journal

Pour afficher les résultats au fur et à mesure que chaque test est réussi ou terminé, nous allons dans l'onglet Résultats d'optimisation. Et il est toujours bon de faire le tri de la sortie par les résultats afin que nous puissions facilement identifier les paramètres qui nous donnent le meilleur résultat en fonction de notre paramètre d'optimisation. En cliquant sur l'en-tête Résultat dans l'onglet Résultats de l'optimisation, les résultats seront classés par ordre croissant ou décroissant.

Figure 44. Rapport d'optimisation

Figure 29. Rapport d'optimisation

Passez à l'onglet Graphique d'optimisation pour voir à quoi ressemble le graphique.

Figure 45. Graphique d'optimisation

Figure 30. Graphique d'optimisation

Vous ne comprenez pas ce que vous voyez ? Ne vous en faites pas ; les points que vous voyez sont un graphique du nombre de tests que votre EA a réussis par rapport au résultat d'optimisation en fonction du type de résultat d'optimisation que vous avez sélectionné. Dans notre cas, nous avons sélectionné Solde + facteur de profit maximum.

2.3. Interprétation du résultat

Pour interpréter correctement le rapport d'optimisation, accédez à l'onglet Résultats d'optimisation. Vous découvrirez que vous ne pouvez pas voir certains champs tels que le facteur de profit, le gain attendu, le pourcentage de retrait, etc. Pour les voir, cliquez avec le bouton droit n'importe où dans l'onglet Résultats d'optimisation et sélectionnez les informations supplémentaires que vous souhaitez voir, comme indiqué ci-dessous :

Figure 46. Sélection de l’encaisse en % dans le résultat d'optimisation

Figure 31. Sélection de l’encaisse en % dans le résultat d'optimisation

 Figure 47. Sélection du facteur de profit dans le résultat de l'optimisation

Figure 32. Sélection du facteur de profit dans le résultat de l'optimisation

Après avoir ajouté ces dossiers supplémentaires, nous allons maintenant analyser le résultat de l'optimisation pour décider de meilleurs paramètres pour notre Expert Advisor.

Analyse du rapport d'optimisation

Figure 33. Analyse du résultat d'optimisation

À partir de la figure ci-dessus, les sections mises en évidence étiquetées A et B indiquent les meilleurs résultats pour notre Expert Advisor.  Maintenant, le choix que vous faites vous appartient entièrement, tout dépend de ce que vous recherchez. Cependant, ici, nous nous intéressons non seulement aux paramètres qui donnent le bénéfice le plus élevé, mais qui ont également un drawdown% inférieur.

Comme vous pouvez le voir, la section A (surlignée en jaune) a le meilleur résultat (Solde + facteur de profit maximal) de 22381,71 avec un profit de 924,10 tandis que la section B (surlignée en vert) a le deuxième meilleur résultat de 22159,25 mais avec un bénéfice plus élevé de 936,55. La section A avait un Drawdown% inférieur de 1,78 tandis que B a un encaissement plus élevé de 1,95.

Le testeur de stratégie enregistre les résultats de l'optimisation dans le dossier « <dossier des données du terminal client>\Tester\cache ». Dans votre cas, toutes les données d'optimisation seront enregistrées dans le fichier cci_ma_ea.EURUSD.H1.0.xml,

Le nom du fichier a la forme suivante : NomExpert.SYMBOL.PERIOD.GenerationMode.xml, où :

  • ExpertName - Nom de l’Expert Advisor ;
  • Symbol - symbole ;
  • Period - délai (M1,H1,...)
  • GenerationMode - mode de génération de trait (0-chaque trait, 1 - OHLC d'une minute, 2 - prix ouverts uniquement).

Les fichiers XML peuvent être ouverts par MS Excel.

2.4. Choix du meilleur résultat

Pour finalement obtenir le meilleur résultat, nous devons revoir le graphique d'optimisation. Retour vers le graphique d'optimisation.  Cliquez avec le bouton droit n'importe où dans le graphique et sélectionnez   Graphique 1D. .

Sélection d’un graphique d'optimisation de forme 1-D Graph

Figure 34. Sélection d’un graphique à 1 dimension (1 D) pour l'analyse des résultats

Avec cela, nous pouvons facilement voir les valeurs de chacun des paramètres d'entrée qui donnent le meilleur résultat.  Vous pouvez maintenant commencer à choisir chaque paramètre pour pouvoir visualiser la meilleure valeur. Cliquez avec le bouton droit sur le graphique et sélectionnez X-Axis, puis sélectionnez le paramètre que vous souhaitez vérifier. Cela ressemblera à ce qui suit (pour Stop loss)

Figure 50. Obtention de la meilleure valeur StopLoss à partir du résultat d'optimisation

Figure 35. Obtention de la meilleure valeur StopLoss à partir du résultat de l'optimisation

En fait, d'après le résultat de l'optimisation, il est très clair que le meilleur Stoploss est de 34, le meilleur TakeProfit est de 78 et le meilleur CCI_Period1 est de 62. Pour obtenir les meilleures valeurs pour MAPeriod et CCI_Period2, sélectionnez chacune d'elles comme ci-dessus

Figure 51. Obtention de la meilleure valeur de période Moyenne mobile à partir du résultat de l'optimisation

Figure 36. Obtention de la meilleure valeur de période Moyenne mobile à partir du résultat de l'optimisation

Ce graphique montre une valeur de 26 comme MA_Period avec le meilleur résultat.

Figure 52. Obtention de la meilleure valeur CCI_Period1 à partir du résultat de l'optimisation

Figure 37. Obtention de la meilleure valeur CCI_Period1 à partir du résultat de l'optimisation

Ce graphique montre une valeur de 62 comme CCI_Period1 avec le meilleur résultat.

Figure 53. Obtention de la meilleure valeur CCI_Period2 à partir du résultat de l'optimisation

Figure 38. Obtention de la meilleure valeur CCI_Period2 à partir du résultat de l'optimisation

Ce graphique montre des valeurs de 28 ou 30 comme CCI_Period2 avec les meilleurs résultats.

Après avoir obtenu les meilleures valeurs pour chaque paramètre, il est maintenant temps pour le test final de notre Expert Advisor.

2.5. Le test final

Le test final consiste à rassembler les meilleurs paramètres pour le test de l'Expert Advisor. Dans ce cas, nous utiliserons les meilleures valeurs que nous avons découvertes dans la section INPUT du Testeur de stratégie, comme indiqué ci-dessous.

Valeurs d'entrée pour le test final

Figure 39. Les paramètres d'entrée de test final

Dans l'onglet PARAMÈTRES du testeur de stratégie, nous désactiverons l'optimisation comme indiqué ci-dessous

Les paramètres du test final

Figure 40. Les paramètres de test final

Nous allons maintenant cliquer sur le bouton STARTpour commencer le test. Une fois le test terminé, nous avons les résultats sur l'onglet RÉSULTATS comme indiqué ci-dessous

Figure 56. Les résultats du test final

Figure 41. Les résultats du test final

Et aussi, nous avons le graphique pour le test sur l'onglet GRAPH

Figure 57. Le résultat du graphique de test final

Figure 42. Le résultat du graphique de test final

Conclusion

Dans cet article, nous avons discuté des moyens d'identifier et de corriger les erreurs de code et nous avons également expliqué comment tester et optimiser un Expert Advisor pour le meilleur symbole Market Watch.

Avec cet article, je pense que la vérification du code pour les erreurs via l'éditeur et l'optimisation ainsi que le test des Expert Advisors via le Testeur de stratégie rendent possible la rédaction d'un meilleur, rentable Expert Advisor.

Traduit de l’anglais par MetaQuotes Ltd.
Article original : https://www.mql5.com/en/articles/156

Fichiers joints |
cci_ma_ea.mq5 (14.23 KB)
Ordres, positions et transactions dans MetaTrader 5 Ordres, positions et transactions dans MetaTrader 5
La création d'un robot de trading robuste ne peut se faire sans une compréhension des mécanismes du système de trading MetaTrader 5. Le terminal client reçoit les informations sur les positions, les ordres et les transactions du serveur de trading. Pour gérer correctement ces données en utilisant le MQL5, il est nécessaire d'avoir une bonne compréhension de l'interaction entre le programme MQL5 et le terminal client.
Systèmes de trading adaptatifs et leur utilisation dans le terminal client MetaTrader 5 Systèmes de trading adaptatifs et leur utilisation dans le terminal client MetaTrader 5
Cet article suggère une variante d’un système adaptatif qui se compose de nombreuses stratégies, chacune effectuant ses propres opérations de trading « virtuelles ». Le trading réel est effectué en fonction de signaux de la plus rentable stratégie du moment. Grâce à l’utilisation de l’approche orientée objet, des classes de travail avec des données et des classes de trading de la bibliothèque Standard, l’architecture du système est apparue simple et évolutive ; vous pouvez désormais facilement créer et analyser les systèmes adaptatifs qui incluent des centaines de stratégies de trading.
Événements de trade dans MetaTrader 5 Événements de trade dans MetaTrader 5
Un suivi de l'état actuel d'un compte de trade implique le contrôle des positions ouvertes et des ordres. Avant qu'un signal de trade ne devienne une transaction, il doit être envoyé depuis le terminal client en tant que demande au serveur de trade, où il sera placé dans la file d'attente des ordres en attente de traitement. Accepter une demande via le serveur de trade, la supprimer à son expiration ou conclure une transaction sur sa base - toutes ces actions sont suivies d'événements de trade ; et le serveur de trade en informe le terminal.
Expert Advisor basé sur les « Nouvelles dimensions en trading » livre écrit par Bill Williams Expert Advisor basé sur les « Nouvelles dimensions en trading » livre écrit par Bill Williams
Dans cet article, je vais discuter du développement de l'Expert Advisor, basé sur le livre intitulé « Nouvelles dimensions en trading : Comment tirer profit du chaos dans les changes, les actions et les matières premières » par Bill Williams. La stratégie elle-même est bien connue et son utilisation est encore controversée parmi les traders. L'article examine les signaux système en trading, les spécificités de sa mise en œuvre et les résultats des tests sur les données historiques.