Discussion de l'article "Création de Critères Personnalisés d’Optimisation des Expert Advisors" - page 3

 

Après de nombreuses expériences, j'en suis arrivé à des conclusions similaires. Je ne sais pas pourquoi il m'a fallu tant de temps pour trouver cet article et cette discussion.

J'ai commencé avec un problème où mes stratégies de break out et de trend riding avaient tendance à s'adapter à quelques trades super rentables. L'optimiseur ne s'intéressait qu'à ces quelques transactions et utilisait des stops larges et des take profit éloignés en s'assurant que son signal capturait et exploitait au maximum ces quelques transactions. Cela se produisait même sur des échantillons de 20 ans avec des centaines de transactions. Même en optimisant avec un ratio dd/bénéfice, il a continué à rechercher les runs avec ces trades à tout prix parce que les runs représentaient 90% de ses bénéfices. Je voulais limiter ce comportement d'une manière ou d'une autre sans pour autant couper la tête de la stratégie de rupture/suivi de tendance. J'ai découvert que l'optimisation du pourcentage dd relatif (PAS le ratio dd/bénéfice, juste le pourcentage dd relatif et rien d'autre) donne de bons résultats tant que le nombre minimum de trades et le facteur de profit minimum (environ 1,3) sont respectés.


//............... 

sinput double mint; //moins de transactions à des fins d'optimisation. Une pénalité sera imposée aux séries comportant moins de transactions. 

sinput double minpf; //Facteur de profit minimum à des fins d'optimisation. Une pénalité sera imposée pour les runs dont le pf est inférieur.

//...............

double OnTester()

{ 

	 double dd=TesterStatistics(STAT_BALANCE_DDREL_PERCENT);//L'équité au lieu de l'équilibre a également bien fonctionné à l'avenir.

	 double pf=TesterStatistics(STAT_PROFIT_FACTOR);

	 int    tt=TesterStatistics(STAT_TRADES); 

	 double custom=(100-dd);

	 if (mint>t) custom=custom*(tt/mint); // impose une pénalité si le nombre minimum de transactions n'est pas atteint

	 if (minpf>minpf) custom=custom*((pf-1)/(minpf-1)) // cette ligne a également pour effet de rendre les séries perdantes négatives et d'imposer une pénalité inférieure à pf.

	 return(custom); 

}

 

 

Il n'est pas normal que le profit ne soit pas pris en compte, mais le fait d'avoir un critère minimum de pf fait que la plupart des séries très rentables apparaissent en haut de l'échelle. Le fait d'éliminer les dd des séries rentables permet généralement d'augmenter les bénéfices. Quoi qu'il en soit, en sélectionnant les transactions les plus rentables et en effectuant les dernières retouches manuellement (comme vers la fin de cet excellent article https://www.mql5.com/fr/articles/156), je peux permettre à l'optimiseur de faire une grande partie du travail initial tout en évitant une grande partie de l'ajustement des courbes. J'ai expérimenté et obtenu des résultats mitigés avec le code suivant. (Les expériences devraient inclure la modification du risque et de l'équilibre de départ une fois que vous commencez à mettre des poids supplémentaires en plus d'un score basé sur le pourcentage).

//.............

sinput double pfw /Poids du facteur de rentabilité 

//.............

        double custom=(100-dd)+(pf-1)*pfw;
//...........
Guide to Testing and Optimizing of Expert Advisors in MQL5
Guide to Testing and Optimizing of Expert Advisors in MQL5
  • 2010.10.12
  • Samuel
  • www.mql5.com
This article explains the step by step process of identifying and resolving code errors as well as the steps in testing and optimizing of the Expert Advisor input parameters. You will learn how to use Strategy Tester of MetaTrader 5 client terminal to find the best symbol and set of input parameters for your Expert Advisor.
 

Quelqu'un peut-il me dire si cet article sera applicable à MT4 ? Il semble qu'il ait déjà adopté de nombreuses propriétés de MT5.

En général, ma tâche consiste à obtenir uniquement les valeurs de la corrélation LR et de l' erreur standard LR dans le testeur MT4, comme on peut facilement le voir dans le testeur MT5.

Je veux juste lire ces valeurs dans la fonction deinit() à la fin de l'exécution du test et les écrire dans un fichier avec la valeur du paramètre optimisé.

Peut-être que quelqu'un a déjà fait ce genre de choses et qu'il partagera avec moi le résultat obtenu (la fonction nécessaire pour calculer les valeurs de corrélation LR et d'erreur standard LR) afin que je n'aie pas à réinventer la roue ?

 
solandr:

Quelqu'un peut-il me dire si cet article sera applicable à MT4 ? Il semble qu'il ait déjà adopté de nombreuses propriétés de MT5.

En général, ma tâche consiste à obtenir uniquement les valeurs de la corrélation LR et de l' erreur standard LR dans le testeur MT4, comme on peut facilement le voir dans le testeur MT5.

Je veux juste lire ces valeurs dans la fonction deinit() à la fin de l'exécution du test et les écrire dans un fichier avec la valeur du paramètre optimisé.

Peut-être que quelqu'un a déjà fait ce genre de choses et peut partager avec moi le résultat (la fonction nécessaire pour calculer les valeurs de corrélation LR et d'erreur standard LR) afin que je n'aie pas à réinventer la roue ?

Un exemple de calcul de la corrélation LR et de l'erreur standard LR sur les transactions dans l'historique est disponible dans AlgLib (MQL4\Scripts\Alglib\UseAlglib.mq4).
 
Automated-Trading:
Un exemple de calcul de la corrélation LR et de l'erreur standard LR pour les transactions dans l'historique est disponible dans AlgLib (MQL4\Scripts\Alglib\UseAlglib.mq4).
Je vous remercie ! J'y jetterai un coup d'œil.
 
solandr:
Je vous remercie ! Je vais y jeter un coup d'œil.

J'ai compris. La corrélation semble être calculée.

La seule chose à laquelle j'ai dû penser est le fait que ce point ne fonctionne pas dans le testeur MT4 Build 670 :

//--- obtention du solde initial
      if(order_type==6) // OP_BALANCE=6
        {
         if(NormalizeDouble(OrderProfit()+OrderSwap(),2)>=0.0)
            if(balance==0.0)
               balance=OrderProfit();
        }

Il n'y a tout simplement pas d'ordres de type 6 dans le testeur.

C'est-à-dire, lors de l'exécution dans le testeur MT4 et en utilisant le code de UseAlglib.mq4, inclus dans le fichier zip téléchargé, à travers un appel de la fonction deinit().

reste égal à 0. Puis l'erreur"Trading operations with zero balance" s'affiche.

Il m'a suffi d'insérer la valeur nécessaire du solde initial dans le testeur MT4 dans le code lui-même et tout a été compté parfaitement.

Peut-être que les développeurs pourront tenir compte de ce point dans les prochaines versions de la bibliothèque.

 

J'ai testé le critère Kelly (stratégie) en utilisant le code suivant :


double OnTester(void)
  {
   //https://www.investopedia.com/articles/trading/04/091504.asp
   double w=((TesterStatistics(STAT_PROFIT_TRADES)+TesterStatistics(STAT_LOSS_TRADES))>0)?TesterStatistics(STAT_PROFIT_TRADES)/(TesterStatistics(STAT_PROFIT_TRADES)+TesterStatistics(STAT_LOSS_TRADES)):0; // probabilité de gain
   double r=((TesterStatistics(STAT_GROSS_LOSS)!=0)&&(TesterStatistics(STAT_LOSS_TRADES)!=0)&&(TesterStatistics(STAT_PROFIT_TRADES)!=0))?(TesterStatistics(STAT_GROSS_PROFIT)/TesterStatistics(STAT_PROFIT_TRADES))/(-TesterStatistics(STAT_GROSS_LOSS)/TesterStatistics(STAT_LOSS_TRADES)):0; // Ratio victoires/défaites ;
   double Kelly=(r!=0)?w-((1-w)/r):0; // Kelly Criterion
   return(Kelly);
  }


Je ne suis pas sûr que le testeur de stratégie Metatrader calcule les trades à profit 0 (zéro) comme des trades à profit. Quelqu'un d'autre ?

 
Ingvar Engelbrecht:

Eh bien, me revoilà, le loup solitaire de cet univers :-)

J'ai essayé le critère de la rectitude en essayant d'intégrer la pente de la ligne droite calculée dans l'équation. En l'état, cela peut donner une note très élevée pour un bénéfice très faible. Il suffit d'ajouter le bénéfice final

Dans le but d'ajouter la pente réelle dans l'équation, j'ai modifié le code comme indiqué ci-dessous.

Ce n'est pas une solution parfaite mais elle est plus proche de ce que je veux voir. L'utilisation du résultat avec le solde ou le bénéfice fonctionne bien pour moi avec ce code.


Je sais que cela fait longtemps que vous avez posté cette question, mais au cas où vous joueriez encore avec cela ou que quelqu'un d'autre chercherait à mettre en œuvre le même critère de rectitude, j'ai trouvé une solution publique qui fonctionne ici.

J'ai trouvé une solution publique qui fonctionne ici https://community.darwinex.com/t/equity-curve-straigthness-optimization-with-metatrader/3976

Equity Curve Straigthness Optimization with Metatrader
Equity Curve Straigthness Optimization with Metatrader
  • 2018.05.16
  • KlondikeFX
  • community.darwinex.com
An underrated feature of Metatrader’s Backtester is its ability to define a custom fitness function for the genetic optimization process. Meaning that you no longer are limited to rather simple metrics like final balance or profit factor but can evaluate the quality of each test run with your own individual calculations. To give a quick...
 

Le tutoriel qui s'y rapporte contient trop d'informations, notamment sur la programmation d'un EA, qui se trouve dans un autre tutoriel, et n'est pas applicable au parieur moyen, qui achètera son EA et aura des compétences minimales en programmation.

Je trouve que par défaut, le seul critère utile pour MT5 dans l'algo génétique est le "balance max", puis je dois répéter cela plusieurs fois, et chercher dans les résultats pour trouver un faible drawdown, comme pour l'utilisation sur plusieurs paires.

Quels sont les critères dont j'ai besoin :- Max balance avec <20 Drawdown, MaxBalance avec <10 Drawdown

 
Très bonne lecture, Lone wolf out here 😁
 
Merci pour cet excellent article Dmitriy.

Pour tous les "loups solitaires" qui existent, vous êtes sur la bonne voie en créant des critères de test rigoureux et en les automatisant. Il y a bien sûr plusieurs façons d'aborder le même défi, et à la lecture des commentaires, le consensus semble porter sur un compromis entre l'équilibre, le drawdown, le RRR et une certaine mesure du profit (facteur de profit, critère de Kelly, etc.).
Je suis arrivé à cet article en essayant de faire la même chose, et en voulant que le testeur de stratégie le fasse à ma place ; je suis heureux de ne pas être seul :).