English Русский 中文 Español Deutsch 日本語 Português 한국어 Italiano Türkçe
Utilisation de la fonction TesterWithdrawal() pour modéliser les retraits de bénéfice.

Utilisation de la fonction TesterWithdrawal() pour modéliser les retraits de bénéfice.

MetaTrader 5Tester | 17 novembre 2021, 15:55
313 0
Andriy Voitenko
Andriy Voitenko

Introduction

Le but du trading spéculatif est d’obtenir un bénéfice. Habituellement, lorsqu’un système de trade est testé, tous les aspects sont analysés, à l’exception du suivant : retirer une partie de l’argent gagné utilisé pour vivre. Même si le trading n’est pas la seule source d’argent pour le trader, les questions sur le bénéfice prévu pour une période de trading (mois, trimestre, année) se posent tôt ou tard. La fonction TesterWithdrawal() dans MQL5 est celle destinée à émuler les retraits d’argent du compte.


1. Que pouvons-nous vérifier?

Il existe des opinions sur le trading ainsi que sur les systèmes de trading qui impliquent de retirer l’excès d’argent dans une situation à risque. Seule une petite partie du capital total se trouve au compte trade; c’est une protection contre la perte de tout l’argent en raison de circonstances imprévues.

Pratiquement, c’est un exemple de Stratégies de Gestion de l’Argent. De nombreux fonds qui acceptent des investissements pour la gestion donnent un certain quota (une partie du capital total) à chaque trader, mais jamais le capital entier est donné aux traders. En d’autres termes, en plus des limites sur le volume de positions ouvertes, il existe des limitations sur le capital qu’un trader peut commander. En fin de compte, chaque trader n’a accès qu’à une petite partie des actifs pour faire des spéculations à risque.

Un autre problème est le réinvestissement agressif des actifs gagnés pendant les tests. Les traders visent à faire monter les lignes d’équilibre et d’actions verticalement pendant l’optimisation. Bien que tout le monde comprenne qu’il y a certaines règles à chaque niveau d’argent; il ne sert à rien de croire qu’un système rentable au trading avec 0,1 lot est bon lorsqu’il trade 100 lots.

En outre, il y a un problème psychologique - chaque trader en exercice peut avouer intervenir dans le fonctionnement du système de trading à un certain niveau d’argent sur le compte, bien qu’il ait promis de ne pas le faire. Ainsi, de ce point de vue, le retrait des excès est un facteur stabilisateur dans le trading.

Il existe une fonction dans MQL5 destinée à implémenter le retrait d’argent lors du test d’un Expert Advisor. La section suivante y est consacrée.


2. Comment utiliser la fonction?

La fonction TesterWithdrawal() est destinée uniquement à la modélisation du retrait d’argent du compte dans le testeur de stratégie et n’affecte pas le fonctionnement d’Expert Advisor en mode normal. 

bool TesterWithdrawal(double money);

Le paramètre d’entrée argent est destiné à indiquer le montant d’argent à retirer dans la monnaie de dépôt. Par la valeur renvoyée, vous pouvez repérer si l’opération a abouti. Chaque opération de retrait effectuée pendant le test est affichée avec l’entrée correspondante dans l’onglet « Journal » ainsi que dans l’onglet « Résultats » comme le montre la figure 1.

Entrées sur le retrait réussi

 Figure 1. Entrées sur le retrait réussi des actifs pendant les tests

Dans le cas où la taille du retrait dépasse la taille de la marge libre et que le retrait n’est pas effectué, l’entrée suivante apparaît dans le « Journal »:

  Entrée sur l’opération de retrait infructueuse pendant le test

Figure 2. Entrée sur l’opération de retrait infructueuse pendant le test

Lorsque vous appelez cette fonction, la taille du solde courant et des capitaux propres diminuent du montant de l’argent retiré. Cependant, le testeur de stratégie ne prend pas en compte le retrait lors du calcul du bénéfice et de la perte, mais il calcule la somme totale des retraits dans le taux de « retrait », comme le montre la figure 3.

Taux de la somme totale des retraits dans le rapport

Figure 3. Taux de la somme totale des retraits dans le rapport

Il convient de noter qu’une fonction inverse de dépôt d’actifs sur un compte de trade n’existe pas encore dans MQL5 et qu’il est peu probable qu’elle soit implémentée. Qui a besoin de systèmes qui nécessitent une augmentation constante des dépôts?

La section suivante est consacrée à l’exemple d’un Expert Advisor non seulement avec une stratégie de trade implémentée mais avec une boîte à outils pour modéliser les retraits d’argent en utilisant la fonction que nous étudions


3. Un cochon d’Inde à tester

  
Nous allons effectuer un test plutôt simple sur un Expert Advisor. Ceux qui s’intéressent aux principes de fonctionnement d’Expert Advisor peuvent trouver la description de son système de trade ci-dessous.

Les valeurs maximale et minimale du prix sont calculées à une période indiquée de 5 millions de données, qui est définie à l’aide de la variable d’entrée PERIOD. Les niveaux calculés forment un canal horizontal avec les lignes de soutien (variable CalcLow) et de résistance (variable CalcHigh). Les commandes en cours sont passées aux frontières du canal. Le jeu se joue sur le piercing de la chaîne.

Une commande en attente est placée lorsque le prix pénètre dans le canal pour pas moins de la valeur de la variable d’entrée INSIDE_LEVEL. De plus, une seule position ou une commande en cours peut être ouverte dans une direction.

Si la chaîne devient plus étroite lorsque les niveaux sont recalculés et que le prix y reste toujours, la commande en attente se rapproche du prix du marché. L’étape de déplacement des commandes en attente est définie à l’aide de la variable d’entrée ORDER_STEP.

La taille du bénéfice d’un deal est indiquée dans la variable d’entrée PRISE_BENEFICE et la perte maximale est indiquée à l’aide de ARRET_PERTE 

L’Expert Advisor implique le déplacement de ARRET_PERTE avec une étape indiquée dans la variable d’entrée ARRET_TRAINE

Vous pouvez trader à la fois avec un lot fixe ou avec un calculé en pourcentage du dépôt. La valeur du lot est définie à l’aide de la variable d’entrée LOT et la méthode de calcul du lot est définie à l’aide de la variable LOT_TYPE. Il y a une possibilité de corriger le lot (LOT_CORRECTION = vrai). Dans le cas où vous tradez avec un lot fixe et que sa taille dépasse celle autorisée pour l’ouverture d’une position, la taille du lot est corrigée à la valeur autorisée la plus proche.

Pour le réglage de l’algorithme de l’Expert Advisor, vous pouvez activer la fonction d’écriture du journal (WRITE_LOG_FILE = vrai). Pour que les entrées sur toutes les opérations de trade soient écrites dans le journal du fichier texte.txt.

Ajoutons plusieurs variables d’entrée à l’Expert Advisor pour gérer les retraits d’argent.

Les premiers paramètres seront utilisés comme indicateur de la possibilité de retirer des actifs.

input bool WDR_ENABLE = true; // Allow withdrawal

 Le deuxième paramètre déterminera la périodicité des retraits.

enum   wdr_period
  {
   days      = -2, // Day
   weeks     = -1, // Week 
   months    =  1, // Month  
   quarters  =  3, // Quarter
   halfyears =  6, // Half a year    
   years     = 12  // Year    
  };
input wdr_period WDR_PERIOD = weeks; // Periodicity of withdrawals
 Le troisième paramètre définira le montant d’argent à retirer.
input double WDR_VALUE = 1; // Amount of money to be withdrawn

Le quatrième paramètre déterminera la méthode de calcul du montant à retirer.

enum lot_type 
   {
      fixed,  // Fixed
      percent // Percentage of deposit
   };
input lot_type WDR_TYPE = percent; // Method of calculation of the withdrawal amount

Pour calculer le montant du retrait unique d’argent du compte, le wdr_value est utilisé. La variable wdr_summa est utilisée pour calculer le montant total d’argent à retirer.

Nous calculerons également le nombre total d’opérations de retrait réussies à l’aide de la variable wdr_count. Les valeurs de ces variables sont nécessaires pour former notre propre rapport sur le résultat des tests. Toute la fonctionnalité de retrait d’argent est implémentée dans la fonction ci-dessous.

//--- Function of withdrawing assets from the account
//+------------------------------------------------------------------+
bool TimeOfWithDrawal()
//+------------------------------------------------------------------+
  {
   if(!WDR_ENABLE) return(false); // exit if withdrawal is prohibited
   
   if( tick.time > dt_debit + days_delay * DAY) // periodic withdrawals with specified period
     {
      dt_debit = dt_debit + days_delay * DAY;
      days_delay = Calc_Delay();// Updating the value of period-number of days between withdrawal operations
      
      if(WDR_TYPE == fixed) wdr_value = WDR_VALUE;
      else wdr_value = AccountInfoDouble(ACCOUNT_BALANCE) * 0.01 * WDR_VALUE;

      if(TesterWithdrawal(wdr_value))
        {
         wdr_count++;
         wdr_summa = wdr_summa + wdr_value;
         return(true);
        }
     }
   return(false);
  }

Nous devons maintenant préparer notre Expert Advisor pour les tests en mode optimisation. Il y aura plusieurs paramètres d’optimisation, déclarons donc une variable d’entrée à l’aide de laquelle nous choisirons le paramètre nécessaire.

enum opt_value
{
   opt_total_wdr,      // Total sum of withdrawal
   opt_edd_with_wdr,   // Drawdown with consideration of withdrawal
   opt_edd_without_wdr // Drawdown without consideration of withdrawal
};
input opt_value OPT_PARAM = opt_total_wdr; // Optimization by the parameter

Nous devons également ajouter une autre fonction importante à l’Expert Advisor - OnTester(); la valeur retournée de cette fonction détermine le critère d’optimisation.

//--- Displaying information about testing
//+------------------------------------------------------------------+
double OnTester(void)
//+------------------------------------------------------------------+
  {
   //--- Calculation of parameters for the report
   CalculateSummary(initial_deposit);
   CalcEquityDrawdown(initial_deposit, true, false);
   //--- Creation of the report
   GenerateReportFile("report.txt");

   //--- Returned value is the optimization criterion
   if (OPT_PARAM == opt_total_wdr) return(wdr_summa);
   else return(RelEquityDrawdownPercent);
  }

La section suivante est consacrée à l’examen détaillé des tests de notre Expert Advisor.


4. Test de l’Expert Advisor

Pour l’intégrité du test, nous devons tout d’abord obtenir les résultats des tests de notre Expert Advisor avec la fonction de retrait désactivé. Pour ce faire, avant de tester, définissez le paramètre « Autoriser le retrait » à faux comme le montre la figure 5.

Pour ceux qui souhaitent répéter les résultats des tests, les paramètres et les valeurs des paramètres d’entrée de l’Expert Advisor sont donnés ci-dessous dans les figures 4 et 5.

Paramètres de test

Figure 4. Paramètres de test de l’Expert Advisor

  Paramètres de l’Expert Advisor avec

 Figure 5. Paramètres de l’Expert Advisor avec la fonction de retrait désactivée

Les résultats obtenus à la fin des essais sont présentés dans les figures 6 et 7.

  Changement de solde pour 6 mois de

 Figure 6. Changement de solde pour 6 mois de travail de test de l’Expert Advisor 

  Le tableau des résultats de travail de l’Expert Advisor

Figure 7. Le tableau des résultats des résultats de travail de l’Expert Advisor

Le paramètre qui nous intéresse est le retrait relatif des capitaux propres. Dans ce cas, il est égal à 4,75%. 

Voyons maintenant comment ce paramètre change si nous activons les retraits d’argent. Effectuons des tests avec différentes quantités et périodicité des retraits.

La figure 8 illustre les paramètres de l’Expert Advisor avec l’optimisation et les retraits activés; et la figure 9 illustre les résultats de tel test.

Le paramètre de l’Expert Advisor avec optimisation et retraits activés

 Figure 8. Le paramètre de l’Expert Advisor avec optimisation et retraits activés

Les résultats du calcul du prélèvement relatif des capitaux propres

Figure 9. Les résultats du calcul du prélèvement relatif des capitaux propres

Les résultats des tests sont un peu surprenants, car le retrait est plus faible avec la périodicité de retrait d’un jour ou d’une semaine qu’avec les retraits désactivés du tout.

De plus, la ligne de prélèvement quotidien augmente à 100%, puis revient à 8% et continue de descendre. Pour bien interpréter les résultats, vous devez savoir comment le prélèvement relatif des capitaux propres est calculé dans le testeur de stratégie. C’est le objet de la section suivante.


5. Calcul du Prélèvement des Capitaux Propres

Les esprits fouineurs seront curieux de savoir comment le calcul de l’équité est effectué dans le testeur de stratégie, et comment calculer ce paramètre par eux-mêmes.

Si la fonction TesterWithdrawal() n’est pas utilisée dans votre Expert Advisor, alors le calcul du paramètre que nous analysons n’a aucune différence par rapport à son calcul dans MetaTrader 4; il est décrit dans l’article « Que signifient les chiffres dans le rapport de test d’expert » ; et le code source de celui-ci et de nombreux autres paramètres du rapport de testeur résultant est donné dans l’article « Comment évaluer les résultats des tests d’experts ».

Une description visuelle du calcul du prélèvement relatif et maximal dans le testeur de stratégie est la figure 10 ci-dessous.

Calcul des prélèvements de capitaux propres sans tenir compte des retraits

Figure 10. Calcul des prélèvements de capitaux propres sans tenir compte des retraits

Au cours de son travail, le testeur de stratégie détermine les valeurs maximales et minimales actuelles des capitaux propres. Avec l’apparition d’un nouveau maximum d’équité, qui est marqué sur le graphique avec la coche bleue, les prélèvements maximaux et minimaux sont recalculés et la plus grande valeur est enregistrée pour être affichée dans le rapport subséquent.

L’important est le dernier recalcul des paramètres à la fin des tests, car il peut se produire une situation où le dernier extremum non enregistré de l’équité donne la valeur maximale du prélèvement. Les changements des valeurs maximales des prélèvements sont affichés avec les couleurs bleu et rouge respectivement. La couleur grise représente le prélèvement enregistré à chaque arrivée d’un nouveau maximum.

Il est à noter que l’appel de la fonction TesterWithDrawal() modifie l’algorithme de calcul des prélèvements dans le testeur de stratégie. La différence par rapport à la variante précédente est le recalcul des valeurs de prélèvement non seulement à l’arrivée de nouveaux maximums d’actions, mais également lors des retraits d’actifs. La démonstration visuelle de celui-ci se trouve à la figure 11.

Calcul des prélèvements en

 Figure 11. Calcul des prélèvements en tenant compte des retraits

Le moment du retrait des actifs est indiqué avec les coches vertes sur l’image ci-dessus. Les retraits d’argent sont plutôt fréquents, chose qui ne permet pas les valeurs de retraits maximaux, déterminées par les extremums sur le graphique qui seront à définir. En conséquence, le prélèvement subséquent avec la prise en compte des retraits peut être inférieur à celui sans tenir compte de ce qui a été noté à la figure 9.

Si les retraits d’argent sont beaucoup plus importants que la croissance des capitaux propres à la suite de l’obtention de bénéfices, cela peut conduire à de faibles taux de prélèvements. La raison pour laquelle cette situation ne permet pas aux extremums de se former sur le graphique; et dans la limite, cela ressemblera à une ligne descendante droite, où le prélèvement relatif tente à zéro. Cet effet a commencé à se produire avec les prélèvements quotidiens de plus de 1000 $ sur le graphique illustré dans la figure 9.

Reproduisons le calcul du prélèvement maximal et relatif des capitaux propres dans MQL5 en combinant l’algorithme entier dans la procédure unique CalcEquityDrawdown comme décrit ci-dessous.

double RelEquityDrawdownPercent; // relative drawdown of equity in percentage terms
double MaxEquityDrawdown;        // maximal drawdown of equity
//--- Calculation of the drawdown of equity
//+------------------------------------------------------------------+
void CalcEquityDrawdown(double initial_deposit, // initial deposit
                        bool finally)          // flag of calculation that registers extremums
//+------------------------------------------------------------------+
  {
   double drawdownpercent;
   double drawdown;
   double equity;
   static double maxpeak = 0.0, minpeak = 0.0;

   //--- exclusion of consideration of profit withdrawals for the calculation of drawdowns
   if(wdr_ignore) equity = AccountInfoDouble(ACCOUNT_EQUITY) + wdr_summa;
   else equity = AccountInfoDouble(ACCOUNT_EQUITY);

   if(maxpeak == 0.0) maxpeak = equity;
   if(minpeak == 0.0) minpeak = equity;

   //--- check of conditions of extremum
   if((maxpeak < equity)||(finally))
    {
      //--- calculation of drawdowns
      drawdown = maxpeak - minpeak;
      drawdownpercent = drawdown / maxpeak * 100.0;

      //--- Saving maximal values of drawdowns
      if(MaxEquityDrawdown < drawdown) MaxEquityDrawdown = drawdown;
      if(RelEquityDrawdownPercent < drawdownpercent) RelEquityDrawdownPercent = drawdownpercent;
    
      //--- nulling the values of extremums
      maxpeak = equity;
      minpeak = equity;
    }

   if(minpeak > equity) minpeak = equity;
 }

Pour garder les calculs précis, nous devons appeler la procédure écrite ci-dessus à partir du corps de notre Expert Advisor chaque fois qu’une nouvelle coche arrive et avec les paramètres donnés ci-dessous.

CalcEquityDrawdown(initial_deposit, false);

De plus, pour obtenir les valeurs fiables des prélèvements, il faut également l’appeler à la fin de l’Expert Advisor dans la fonction OnTester() avec les paramètres finally = true qui indiquent que le calcul est terminé. Et si le prélèvement non fixé actuel est supérieur au maximum enregistré, il remplacera le maximum et sera affiché dans le rapport résultant.

CalcEquityDrawdown(initial_deposit, true);

Si l’algorithme des retraits est implémenté dans un Expert Advisor, alors pour le calcul correct des prélèvements, vous devez appeler la fonction CalcEquityDrawdown avec le paramètre finalement=vrai chaque fois qu’un retrait est effectué. La commande d’appel peut être la suivante :

//--- Withdrawing assets and calculating drawdowns of equity
if(TimeOfWithDrawal())
    CalcEquityDrawdown(initial_deposit, true);
else 
    CalcEquityDrawdown(initial_deposit, false);

Pour s’assurer de l’exactitude de la méthodologie décrite ci-dessus, comparons les données calculées avec les données du testeur de stratégie. Pour ce faire, nous devons faire en sorte que la fonction OnTester() renvoie la valeur du paramètre que nous souhaitons vérifier - le retrait relatif des capitaux propres stocké dans la variable RelEquityDrawdownPercentPercent.

Il est implémenté dans le code de l’Expert Advisor en définissant la valeur « prélèvement en tenant compte du retrait » pour le paramètre d’entrée « Optimisation par le paramètre ». Le reste des paramètres doit être laissé sans modification, comme le montre la figure 8. Les résultats de ces tests sont présentés à la figure 12.

  Comparaison des résultats de nos calculs avec les

 Figure 12. Comparaison des résultats de nos calculs avec les données du testeur de stratégie

La comparaison des résultats obtenus prouve que l’algorithme de calcul du prélèvement relatif est correct.

Ajoutons une autre variante au calcul du prélèvement. Nous allons y exclure l’influence des retraits d’argent sur les capitaux propres; et surveiller l’évolution du prélèvement relatif des capitaux propres.

À cette fin, ajoutons une variable à l’Expert Advisor, nous l’utiliserons pour déterminer s’il est nécessaire de prendre en compte les retraits lors du calcul des paramètres de l’Expert Advisor.

bool wdr_ignore; // calculation of rate without the consideration of withdrawals

La valeur de wdr_ignore est égale à vrai si la variable « Optimisation par le paramètre » est définie sur « prélèvement sans tenir compte du retrait ».

En outre, vous devez corriger la procédure de calcul du prélèvement CalcEquityDrawdown en y ajoutant le traitement de ce paramètre comme indiqué ci-dessous.

if (wdr_ignore) 
  equity = AccountInfoDouble(ACCOUNT_EQUITY) + wdr_summa;
else 
  equity = AccountInfoDouble(ACCOUNT_EQUITY);

Maintenant, tout est prêt pour obtenir de nouvelles valeurs des prélèvements. Effectuons des tests avec le nouvel algorithme de calcul activé. Le résultat des tests est illustré à la figure 13.

Les résultats du calcul du prélèvement sans

Figure 13. Les résultats du calcul du prélèvement sans tenir en compte des retraits

Les résultats indiquent que ni le fait de retirer des actifs, ni le montant d’argent retiré ne dépendent du prélèvement. Ainsi, nous avons obtenu un facteur pur qui n’est pas affecté par la fonction TesterWithDrawal().  .Cependant, pour utiliser ce type de calcul, nous devons corriger les valeurs des bénéfices et des pertes, car leurs valeurs réelles ont changé et ces facteurs ne sont pas corrects dans le rapport subséquent du testeur.

Calculons le bénéfice, la perte et leur ratio (rentabilité) et enregistrons les valeurs obtenues sous forme de rapport dans un fichier texte. La procédure de calcul des paramètres énumérés est donnée ci-dessous.

double SummaryProfit;     // Total net profit
double GrossProfit;       // Gross profit
double GrossLoss;         // Gross loss
double ProfitFactor;      // Profitability
//--- Calculation of parameters for the report
//+------------------------------------------------------------------+
void CalculateSummary(double initial_deposit)
//+------------------------------------------------------------------+
  {
   double drawdownpercent, drawdown;
   double maxpeak = initial_deposit, 
          minpeak = initial_deposit, 
          balance = initial_deposit;
          
   double profit = 0.0;
   
   //--- Select entire history
   HistorySelect(0, TimeCurrent());
   int trades_total = HistoryDealsTotal();

   //--- Searching the deals in the history
   for(int i=0; i < trades_total; i++)
     {
      long ticket = HistoryDealGetTicket(i);
      long type   = HistoryDealGetInteger(ticket, DEAL_TYPE);

      //--- Initial deposit is not considered
      if((i == 0)&&(type == DEAL_TYPE_BALANCE)) continue;

      //--- Calculation of profit
      profit = HistoryDealGetDouble(ticket, DEAL_PROFIT) +
                 HistoryDealGetDouble(ticket, DEAL_COMMISSION) +
               HistoryDealGetDouble(ticket, DEAL_SWAP);
      
      balance += profit;

      if(minpeak > balance) minpeak = balance;

      //---
      if((!wdr_ignore)&&(type != DEAL_TYPE_BUY)&&(type != DEAL_TYPE_SELL)) continue;

      //---
      if(profit < 0) GrossLoss   += profit;
      else           GrossProfit += profit;
      SummaryProfit += profit;
     }

   if(GrossLoss < 0.0) GrossLoss *= -1.0;
   //--- Profitability
   if(GrossLoss > 0.0) ProfitFactor = GrossProfit / GrossLoss;
  }

La fonction de création du rapport dans un fichier texte est donnée ci-dessous.

//--- Forming the report  
//+------------------------------------------------------------------+
void GenerateReportFile(string filename)
//+------------------------------------------------------------------+
  {
   string str, msg;

   ResetLastError();
   hReportFile = FileOpen(filename, FILE_READ|FILE_WRITE|FILE_TXT|FILE_ANSI);
   if(hReportFile != INVALID_HANDLE)
     {

      StringInit(str,65,'-'); // separator

      WriteToReportFile(str);
      WriteToReportFile("| Period of testing: " + TimeToString(first_tick.time, TIME_DATE) + " - " +
                        TimeToString(tick.time,TIME_DATE) + "\t\t\t|");
      WriteToReportFile(str);

      //----
      WriteToReportFile("| Initial deposit \t\t\t"+DoubleToString(initial_deposit, 2));
      WriteToReportFile("| Total net profit    \t\t\t"+DoubleToString(SummaryProfit, 2));
      WriteToReportFile("| Gross profit     \t\t\t"+DoubleToString(GrossProfit, 2));
      WriteToReportFile("| Gross loss      \t\t\t"+DoubleToString(-GrossLoss, 2));
      if(GrossLoss > 0.0)
         WriteToReportFile("| Profitability       \t\t\t"+DoubleToString(ProfitFactor,2));
      WriteToReportFile("| Relative drawdown of equity \t"+
                        StringFormat("%1.2f%% (%1.2f)", RelEquityDrawdownPercent, MaxEquityDrawdown));

      if(WDR_ENABLE)
        {
         StringInit(msg, 10, 0);
         switch(WDR_PERIOD)
           {
            case day:     msg = "day";    break;
            case week:    msg = "week";  break;
            case month:   msg = "month";   break;
            case quarter: msg = "quarter"; break;
            case year:    msg = "year";     break;
           }

         WriteToReportFile(str);
         WriteToReportFile("| Periodicity of withdrawing       \t\t" + msg);

         if(WDR_TYPE == fixed) msg = DoubleToString(WDR_VALUE, 2);
         else msg = DoubleToString(WDR_VALUE, 1) + " % from deposit " + DoubleToString(initial_deposit, 2);

         WriteToReportFile("| Amount of money withdrawn     \t\t" + msg);
         WriteToReportFile("| Number of withdrawal operations \t\t" + IntegerToString(wdr_count));
         WriteToReportFile("| Withdrawn from account          \t\t" + DoubleToString(wdr_summa, 2));
        }

      WriteToReportFile(str);
      WriteToReportFile(" ");

      FileClose(hReportFile);
     }
  }

Le résultat de l’exécution de cette fonction est la création d’un fichier texte rempli d’informations comme le montre la figure 14.

  Fichier du rapport créé par la

 Figure 14. Fichier du rapport créé par la procédure GenerateReportFile

La fonction est rédigée de manière à ajouter chaque nouveau rapport au contenu existant du fichier. De ce fait, nous pouvons comparer les valeurs des résultats des tests avec différents paramètres d’entrée de l’Expert Advisor.

Comme vous pouvez le constater dans le rapport, lors du calcul sans tenir compte des retraits (tableau inférieur), le bénéfice net total est plus faible et la perte brute est supérieure au montant d’argent retiré, par rapport aux calculs du testeur (tableau supérieur). Il convient de noter que pour obtenir la valeur réelle du bénéfice et de la perte lors du retrait d’actifs dans le testeur de stratégie, vous devez soustraire la valeur du paramètre « Retrait » du bénéfice net total et l’ajouter à la perte brute.


6. Analyse des Résultats

Sur la base des résultats obtenus à partir de toutes les expériences menées, nous pouvons tirer plusieurs conclusions:

  1. L’utilisation de la fonction TesterWithDrawal() entraîne des modifications dans l’algorithme de calcul des prélèvements dans le testeur de stratégie. Comparer plusieurs Expert Advisors différents par la valeur du prélèvement relatif peut être incorrect si l’un d’eux contient un mécanisme de retrait d’argent. En utilisant cette fonction, vous pouvez faire un calcul pragmatique du montant d’argent que vous pouvez retirer périodiquement du compte en fonction du pourcentage indiqué et acceptable du prélèvement de capitaux propres.
  2. L’utilisation de cette fonction peut être implémentée comme un facteur déstabilisant synthétique du trading utilisé pour vérifier la stabilité de fonctionnement de votre Expert Advisor et ajuster la logique du code en charge de la gestion de l’argent. Si votre Expert Advisor a une logique de prise de décisions sur la base de niveaux d’équilibre ou d’équité , l’utilisation de cette fonction offre des possibilités supplémentaires de test et de réglage.
  3. Lors du recalcul du prélèvement relatif sans tenir compte des retraits, à l’aide de l’algorithme décrit dans l’article, vous pouvez obtenir une valeur pure du retrait relatif qui n’est pas affectée par l’utilisation de cette fonction.


Conclusion 

Cet article couvre l’utilisation de la fonction TesterWithdrawal() pour modéliser le processus de retrait d’actifs d’un compte, et son impact sur l’algorithme de calcul du prélèvement des capitaux propres dans le testeur de stratégie.

Traduit du russe par MetaQuotes Ltd.
Article original : https://www.mql5.com/ru/articles/131

Fichiers joints |
testexpert.mq5 (33.95 KB)
L'utilisation des bibliothèques MQL5 Standard de Cours de Trade  dans la rédaction d'un Expert Advisor L'utilisation des bibliothèques MQL5 Standard de Cours de Trade dans la rédaction d'un Expert Advisor
Cet article explique comment utiliser les principales fonctionnalités de la bibliothèque standard MQL5 de classes de trade dans la rédaction des conseillers experts qui implémente la fermeture de la position et la modification , la passation et la suppression de commande en attente et la vérification de la marge avant de passer un trade.. Nous avons également démontré comment les classes de trade peuvent être utilisés pour obtenir les détails des commandes et des deals.
La Méthode Optimale pour le calcul du volume total de la position par Nombre Magique Indiqué La Méthode Optimale pour le calcul du volume total de la position par Nombre Magique Indiqué
Le problème du calcul du volume total de position du symbole indiqué et du nombre magique est examiné dans cet article. La méthode suggérée ne demande que la partie minimale nécessaire de l'historique des deals, trouve le moment le plus proche où la position totale était égale à zéro et effectue les calculs avec les récents deals. Le travail avec des variables globales du terminal client est également envisagé.
Contrôler  la Pente de la Courbe d' Équilibre Pendant le Travail d'un Expert Advisor Contrôler la Pente de la Courbe d' Équilibre Pendant le Travail d'un Expert Advisor
Trouver des règles pour un système de trade et les programmer dans un Expert Advisor est la moitié du travail. D'une certaine manière, vous devez corriger le fonctionnement de l'Expert Advisor au fur et à mesure qu'il accumule les résultats du trading. Cet article décrit l'une des approches qui permet d'améliorer les performances d'un Expert Advisor à travers un feedback qui mesure la pente de la courbe d'équilibre.
Rédaction d'un Expert Advisor à l'aide de l'approche de programmation  orientée-objet MQL5 Rédaction d'un Expert Advisor à l'aide de l'approche de programmation orientée-objet MQL5
Cet article est axé sur l'approche orientée-objet pour faire ce que nous avons fait dans l'article « Guide étape par étape pour écrire un Expert Advisor en MQL5 pour les débutants » : créer un Expert Advisor simple. La plupart des gens pensent que c'est difficile, mais je tiens à vous rassurer qu'au moment où vous aurez fini de lire cet article, vous serez en mesure d'écrire votre propre Expert Advisor qui est orienté-objet.