Optimisez un EA et obtenez le meilleur des EA optimisés. - page 41

 

Signal gratuit - sur-optimisé.

Il y a actuellement 6 League TS en cours, qui me semblent être les plus optimales.

Les résultats actuels des favoris de la CU League se trouvent sur les pages précédentes.

TCs actuels pour la sur-optimisation :

Symbole Système Raison
1 EURCHF ChnTrendDTS Nouveau
2 EURCHF ChnTrendSAR Nouveau
3 EURCHF ChnTrendSP Nouveau
4 EURCHF ChnFlatSP Nouveau
5 EURCHF ChnFlatSAR Nouveau
6 EURCHF ChnFlatRTS Nouveau
7 EURCHF ChnTrendRTS Nouveau
8 EURCHF ChnFlatDTS Nouveau
9 GBPUSD ChnTrendSAR Non autorisé SL
10 CADJPY ChnFlatSAR Non autorisé SL
11 CHFJPY EMAFlatRTS Big DD
12 USDJPY EMAFlatDTS Attente maximale longue


Je mets USDJPY EMAFlatDTS

Période d'optimisation 4.05.17 - 4.15.18, en avant du 4.10.17

(Comme je sur-optimise - je vais corriger ce post, et ré-optimiser les CTs, en commençant par les derniers, vers les premiers)

 
Georgiy Merts:

Signal libre - réouvert.

Actuellement, 6 CT de la Ligue y travaillent, ce qui me semble être le plus optimal.

Peut-être pouvez-vous encore rendre possible l'écriture des résultats d'optimisation dans le fichier ? Les indicateurs standard ne me donnent pas, et je pense que les autres ne donnent pas beaucoup.

Voici mon ensemble de données, qui donne l'optimiseur, mais je prévois de l'étendre aussi.

 
Aleksey Vyazmikin:

Peut-être pourriez-vous encore rendre possible l'écriture des résultats d'optimisation dans un fichier ? C'est juste que moi, et je pense que d'autres, ne tirent pas grand-chose des indicateurs standard.

Voici mon ensemble de données fourni par l'optimiseur, mais je prévois de l'élargir également.


Bien sûr, je dispose de toutes ces données dans mon conseiller expert. Suggérez-vous qu'après chaque passage je génère un tel fichier et que je le mette dans la zone des fichiers ?

Mais je suis sûr que de nombreuses personnes le regarderont ?


Mais, disons, dans votre dossier - je ne perçois personnellement pas cette figure - juste "ne peut pas voir la forêt pour les arbres". Je ne regarde que les colonnes "Facteur de récupération", et "Échec".

Toutes les autres données sont superflues pour moi, elles ne m'apprennent rien de nouveau. Je pense qu'il est nécessaire d'avoir le moins de paramètres possible dans les experts, et le moins d'indicateurs d'évaluation possible. Je mettrais tout dans un seul paramètre "qualité", mais je vois qu'un autre paramètre "durabilité" est nécessaire.


Vous dites "ce sont les paramètres que j'ai sortis, et j'ai l'intention d'élargir cet ensemble" - quel est l'objectif ?

Montrez-moi un exemple plus concret - où utiliseriez-vous au moins un tiers de ces colonnes, que vous produisez ? Vous êtes exactement comme le participant d'un sujet voisin, qui a écrit un merveilleux moteur de canevas, qui affiche de merveilleux effets visuels sur le graphique... Mais il n'a pas pensé à l'utilisation pratique de ces fonctionnalités. L'obtention de toute donnée doit avoir une utilité particulière, doit faire partie d'une méthodologie particulière de sélection ou d'opération de CT. Et "juste pour avoir"... Il est préférable de consacrer ces ressources à une réoptimisation supplémentaire des systèmes externes ou à de nouveaux systèmes.

Dans l'idée, bien sûr, il est possible de s'embêter avec le fichier de sortie. Eh bien, s'il y a au moins deux autres votes pour dire que les trois paramètres - qualité, drawdown et file d'attente SL ne sont pas suffisants - eh bien, créez un tel fichier, et affichez ses données dans les rapports.

 

TCs actuels pour la sur-optimisation :

Symbole Système Raison
1 EURCHF ChnTrendSAR Nouveau
2 EURCHF ChnTrendSP Nouveau
3 EURCHF ChnFlatSP Nouveau
4 EURCHF ChnFlatSAR Nouveau
5 EURCHF ChnFlatRTS Nouveau
6 EURCHF ChnTrendRTS Nouveau
7 EURCHF ChnFlatDTS Nouveau
8 GBPUSD ChnTrendSAR Non autorisé SL
9 EURCHF EMATrendSP Plusieurs SL
10 GBPAUD EMAFlatRTS Big DD
11 CADJPY ChnFlatSAR Non autorisé SL
12 CHFJPY EMAFlatRTS Big DD
13 GBPNZD EMAFlatSAR Attente maximale longue


J'ai un GBPNZD EMAFlatSAR

Période 5.05.17 - 5.05.18, à partir du 5.10.17

 

Situation actuelle des favoris

(Tous les CTs travaillent sur démo sans MM, avec des lots minimums)

Top 20 par qualité :

Graphique du top 10 en qualité :

Les 20 meilleurs par équilibre :

Les 10 meilleurs tableaux par équilibre :

Pour rappel, le Trading Systems League Expert (versions pour MT4 et MT5) est sur Yandex-disk. Dans les archives, vous trouverez également une brève description des principes de la Ligue et une liste des TS qui y travaillent.

Par défaut, la Ligue travaille avec un seul TS (EURUSD ChnTrendSAR, magik 220141) sans aucune restriction.

Les autres TS ne fonctionnent que dans le testeur de stratégie. Pour leur travail sur un compte démo ou réel, des codes d'enregistrement sont nécessaires. Les codes d'enregistrement, valables 3 mois avec un lien vers le numéro de compte, sont délivrés pour l'optimisation des systèmes individuels de la Ligue (2-5 heures sur un Core i5 quad-core).

EALeague
EALeague
  • yadi.sk
View and download from Yandex.Disk
 
Georgiy Merts:


Bien sûr, j'ai toutes ces données à l'intérieur du conseiller expert. Suggérez-vous de générer un tel fichier après chaque passage, et de le jeter dans la zone des fichiers ?

Mais je suis sûr que de nombreuses personnes le regarderont ?

Vous dites : "ce sont les paramètres que j'affiche, et j'ai toujours l'intention d'élargir cet ensemble" - quel est le but ?

Montrez-moi un exemple plus concret - où utiliseriez-vous au moins un tiers des colonnes que vous produisez ?

En théorie, bien sûr, la sortie du fichier est possible. Eh bien, s'il y a au moins deux autres votes pour dire que les trois paramètres - qualité, affaissement et file d'attente SL - ne sont pas suffisants, eh bien, créez un tel fichier, et affichez ses données dans les rapports.

Permettez-moi de m'exprimer ainsi : j'étais soudainement curieux de voir quel type d'Expert Advisors j'optimisais, mais ne connaissant pas leur algorithme exact, j'ai décidé de me concentrer sur leurs performances et j'ai soudainement réalisé que je ne pouvais pas évaluer le résultat en raison de la rareté des indicateurs statistiques.

Vous dites que les participants au projet devraient faire la sélection eux-mêmes, mais ce n'est pas réaliste sur la base des données disponibles.

Je travaille actuellement sur un système d'évaluation mécanique - l'idée principale est d'équilibrer tous les indicateurs, et pas seulement leur valeur absolue, qui est bien sûr tout aussi importante.

Par exemple, j'utilise souvent la formule "Revenu"-"Bénéfice maximum continu "*3-"Dépenses"-"Perte maximum continue "*3 pour estimer le bénéfice, et si nous sommes toujours dans le plus, nous regardons plus loin, mais aussi à ce stade, nous pouvons passer au crible beaucoup de choses.

Et, le drawdown je ne le perçois qu'en termes naturels, puisque le pourcentage dépend des bénéfices cumulés au moment du drawdown, mais cela ne peut rien dire puisqu'il n'y a aucune garantie que la prochaine fois ce drawdown se produira aussi, seulement après les bénéfices cumulés. Par exemple, un prélèvement de 10% avec un capital de départ de 1000 est de 10 unités, et si 10% avec un bénéfice de 2000, c'est déjà 30 unités, convenez que les chiffres ne sont pas comparables. La signification du pourcentage n'est que si le retrait des fonds chaque jour, mais si vous le mettez en œuvre, alors d'autres indicateurs se glissent, qui sont calculés automatiquement, puis vous devez à chaque chiffre par vous-même, ce qui est gênant.

Je peux vous donner mon code pour écrire des données dans un fichier, si vous ne l'avez jamais fait auparavant.

 
Aleksey Vyazmikin:

Je peux vous donner mon code pour écrire des données dans un fichier, si vous ne l'avez jamais fait auparavant.

Vous n'auriez pas dû abandonner Skype. Vous auriez pu regarder le code et trouver la meilleure façon de le faire.

Allez, de quels indicateurs avez-vous besoin ?

Et à quel moment le conseiller-expert doit-il l'envoyer ? Si j'ai bien compris, dans la fonction OnTester(). Je vais vous créer une telle fonction. Il produira un fichier CSV, qui peut être facilement ouvert dans Excel.


Et de quel conseiller expert parlons-nous, le conseiller expert principal de la Ligue, ou des conseillers experts séparés pour différents TS ?

 
Georgiy Merts:

Vous n'auriez pas dû abandonner Skype. Vous auriez pu regarder le code et trouver la meilleure façon de le faire.

Allez, de quels indicateurs avez-vous besoin ?

Et à quel moment doit-il être émis par l'Expert Advisor ? Si je comprends bien - dans la fonction OnTester ()? Je vais vous faire une telle fonctionnalité.


Oh, et de quel EA parlons-nous ici - le conseiller expert principal de la Ligue, ou des EA séparés pour différents TS ?

Je l'ai organisé comme suit

//--- Кол-во показателей для записи в файл
#define  STAT_VALUES_COUNT 21
double stat_values[STAT_VALUES_COUNT]; // Массив для показателей теста


//+------------------------------------------------------------------+
//| Начало оптимизации                                               |
//+------------------------------------------------------------------+
void OnTesterInit()
  {
      //FileWrite(Statistic,"typeMAH","pMAH","pipsXH","pMAT_Sell","CalcPlan","FinRezultatTotalSell","avrMassSell","MaxOrdersSell","N_Sell","ProcTotalSell","Вершин Sell","FinRezultatTotalBuy","avrMassBuy","MaxOrdersBuy","N_Buy","ProcTotalBuy","Вершин Buy");
      //Printer.Write("OnTesterInit");

      string TimeF=TimeToString(TimeLocal(),TIME_DATE|TIME_MINUTES);
      StringSetCharacter(TimeF,13,'_');    
      Statistic=Printer.FileCreate(Symbol()+"_"+TimeF+"_S&G","S&G\\Test",false,false,EvryTick); //Создание файла для записи     
      Printer.Write("N",
      "Депо",
      "Прибыль",
      "Доход",
      "Расход",
      "Прибыльность",
      "Фактор вост.",
      "Мат ож",
      "К.Ш.",
      "Макс ДД баланса",
      "Макс ДД средств",
      "N сделок",
      "N трейдов",
      "N + трейдов",
      "N - трейдов",
      "Sell трейдов",
      "Buy трейдов",
      "Sell + трейдов",
      "Buy + трейдов",
      "Avr + трейдов",
      "Avr - трейдов",
      "% Sell от прибыльных",
      "% Buy от прибыльных",
      "% Sell от всех",
      "% Buy от всех",      
      "% + от всех",
      "Custom"            
      );
  }
//+------------------------------------------------------------------+
//| Обработчик события окончания тестирования                        |
//+------------------------------------------------------------------+
double OnTester()
  {

  
      //--- Заполним массив показателями теста
      GetTestStatistics(stat_values);
      //--- Создадим фрейм
      FrameAdd("Statistics",1,0,stat_values);

   double custom_Pokazatel_01=CustomPokazatelf(1);

  // return(0.0);
   return(custom_Pokazatel_01);

  }
//+------------------------------------------------------------------+
//| Пользовательские функции                                         |
//+------------------------------------------------------------------+
double CustomPokazatelf(int VariantPokazatel)
{

     double  profit = TesterStatistics(STAT_PROFIT);
     double  max_dd = TesterStatistics(STAT_BALANCE_DD);
   //  double  RecoveryF = TesterStatistics(STAT_RECOVERY_FACTOR);  
     double  Mat_Ojidanie = TesterStatistics(STAT_EXPECTED_PAYOFF);  
     
   double custom_Pokazatel=0;
   //=ЕСЛИ(C3-40000>0;(C3-40000)*(3000-J3);-1)
   //if (profit-40000>0)custom_Pokazatel_01=(profit-40000)*(3000-max_dd);
   //=ЕСЛИ(И(C3-40000>0;3000-J3>0);(C3-40000)*СТЕПЕНЬ(3000-J3;1,5)*H3;0)

   if (VariantPokazatel==1)
      {
      if (profit-Find_Profit>0 && Find_MaxDD-max_dd>0)custom_Pokazatel=(profit-Find_Profit)*MathPow((Find_MaxDD-max_dd),1.5)*Mat_Ojidanie/(Find_Profit+max_dd);
      else custom_Pokazatel=-1;
      }
   return(custom_Pokazatel);
}
//+------------------------------------------------------------------+
//| Очередной проход оптимизации                                     |
//+------------------------------------------------------------------+
void OnTesterPass()
  {

      string name ="";  // Публичное имя/метка фрейма
      ulong  pass =0;   // Номер прохода в оптимизации, на котором добавлен фрейм
      long   id   =0;   // Публичный id фрейма
      double val  =0.0; // Одиночное числовое значение фрейма
      //---
      FrameNext(pass,name,id,val,stat_values);
      //---
     // Print(__FUNCTION__,"(): pass: "+IntegerToString(pass)+"; STAT_PROFIT: ",DoubleToString(stat_values[0],2));
     // double a=stat_values[0];
     // Print ("a=",a);
     // Print(DotToComma(DoubleToString(stat_values[0],2)));
      
      double SellPribl_from_Pribl=0.0;//Процент прибыльных позиций Sell из всех прибыльных
      double BuyPribl_from_Pribl=0.0;//Процент прибыльных позиций Buy из всех прибыльных
      double SellPribl_from_All=0.0;//Процент прибыльных позиций Sell из всех проторгованных
      double BuyPribl_from_All=0.0;//Процент прибыльных позиций Buy из всех проторгованных
      double Pribl_from_All=0.0;//Процент прибыльных позиций из всех проторгованных
      if (stat_values[12]>0) SellPribl_from_Pribl=stat_values[16]/stat_values[12]*100.0;
      if (stat_values[12]>0) BuyPribl_from_Pribl=stat_values[17]/stat_values[12]*100.0;
      if (stat_values[11]>0) SellPribl_from_All=stat_values[16]/stat_values[11]*100.0;
      if (stat_values[11]>0) BuyPribl_from_All=stat_values[17]/stat_values[11]*100.0;
      if (stat_values[11]>0) Pribl_from_All=stat_values[12]/stat_values[11]*100.0;
      
      /*if (pass>0)*/ Printer.Write(IntegerToString(pass),
                              stat_values[0],
                              stat_values[1],
                              stat_values[2],
                              stat_values[3],
                              DoubleToString(stat_values[4],2),
                              DoubleToString(stat_values[5],2),
                              DoubleToString(stat_values[6],2),
                              DoubleToString(stat_values[7],2),
                              stat_values[8],
                              stat_values[9],
                              stat_values[10],
                              stat_values[11],
                              stat_values[12],
                              stat_values[13],
                              stat_values[14],
                              stat_values[15],
                              stat_values[16],
                              stat_values[17],
                              stat_values[18],
                              stat_values[19],      
                              DoubleToString(SellPribl_from_Pribl,2),
                              DoubleToString(BuyPribl_from_Pribl,2),  
                              DoubleToString(SellPribl_from_All,2),
                              DoubleToString(BuyPribl_from_All,2),
                              DoubleToString(Pribl_from_All,2),
                              DoubleToString(stat_values[20],2)
                              );


//--- Если включена запись результатов оптимизации
//      CreateOptimizationReport();

/*

  Print("OnTesterPass");
         Printer.Write("OnTesterPass");
*/

  }
//+------------------------------------------------------------------+
//| Завершение оптимизации                                           |
//+------------------------------------------------------------------+
void OnTesterDeinit()
  {



      FileClose(Statistic);

  }
//+------------------------------------------------------------------+
//| Заполняет массив результатами теста                              |
//+------------------------------------------------------------------+
void GetTestStatistics(double &stat_array[])
  {


stat_array[0]=     TesterStatistics(STAT_INITIAL_DEPOSIT);      //      Значение начального депозита
stat_array[1]=     TesterStatistics(STAT_PROFIT);                //     Чистая прибыль по окончании тестирования, сумма STAT_GROSS_PROFIT и STAT_GROSS_LOSS (STAT_GROSS_LOSS всегда меньше или равно нулю)
stat_array[2]=     TesterStatistics(STAT_GROSS_PROFIT);    //   Общая прибыль, сумма всех прибыльных (положительных) трейдов. Значение больше или равно нулю
stat_array[3]=     TesterStatistics(STAT_GROSS_LOSS);         //        Общий убыток, сумма всех убыточных (отрицательных) трейдов. Значение меньше или равно нулю
stat_array[4]=     TesterStatistics(STAT_PROFIT_FACTOR);           //   Прибыльность – отношение STAT_GROSS_PROFIT/STAT_GROSS_LOSS. Если STAT_GROSS_LOSS=0, то прибыльность принимает значение DBL_MAX
stat_array[5]=     TesterStatistics(STAT_RECOVERY_FACTOR);      //      Фактор восстановления – отношение STAT_PROFIT/STAT_BALANCE_DD
stat_array[6]=     TesterStatistics(STAT_EXPECTED_PAYOFF);      //      Математическое ожидание выигрыша
stat_array[7]=     TesterStatistics(STAT_SHARPE_RATIO);    //   Коэффициент Шарпа
stat_array[8]=     TesterStatistics(STAT_BALANCE_DD);         //        Максимальная просадка баланса в деньгах. В процессе торговли баланс может испытать множество просадок, берется наибольшее значение.
stat_array[9]=     TesterStatistics(STAT_EQUITY_DD);          //        Максимальная просадка средств в деньгах. В процессе торговли средства могут испытать множество просадок, берется наибольшее значение.
stat_array[10]= TesterStatistics(STAT_DEALS);               //  Количество совершенных сделок
stat_array[11]= TesterStatistics(STAT_TRADES);           //     Количество трейдов
stat_array[12]= TesterStatistics(STAT_PROFIT_TRADES);      //   Прибыльные трейды
stat_array[13]= TesterStatistics(STAT_LOSS_TRADES);           //        Убыточные трейды
stat_array[14]= TesterStatistics(STAT_SHORT_TRADES);       //   Короткие трейды
stat_array[15]= TesterStatistics(STAT_LONG_TRADES);              //     Длинные трейды 
stat_array[16]= TesterStatistics(STAT_PROFIT_SHORTTRADES);   // Короткие прибыльные трейды
stat_array[17]= TesterStatistics(STAT_PROFIT_LONGTRADES);          //   Длинные прибыльные трейды
stat_array[18]= TesterStatistics(STAT_PROFITTRADES_AVGCON);  // Средняя длина прибыльной серии трейдов
stat_array[19]= TesterStatistics(STAT_LOSSTRADES_AVGCON);          //   Средняя длина убыточной серии трейдов
//stat_array[20]=       TesterStatistics(STAT_CUSTOM_ONTESTER);    //   Custom
stat_array[20]= CustomPokazatelf(1);       //   Custom

  }

Il y a un problème dans le code, ou peut-être pas dans le code - parfois la dernière image ne vient pas du tout, mais ce n'est pas toujours le cas, et parfois la numérotation peut coïncider. En général, je pense que c'est un problème de programme, mais si vous voyez un bug dans le code, dites-le moi !


Et dans quels EAs - oui, vous pouvez, et dans tout ce qui sont soumis à l'optimisation.

 

Hmmm...

Enregistrez-vous chaque essai non seulement dans le fichier de statistiques, mais aussi dans les cadres du fichier MQD ? Est-ce que j'ai bien compris ?

De plus, je me demande comment cette sortie vers un fichier fonctionnera avec OnTesterPass(), si le succès du testeur est dans le nuage ? Dans un cadre, il sera écrit, mais dans un fichier, je suppose que non.

Alexey, tu vas te noyer dans le flux de données.


Mais, si c'est si important pour vous - je peux mettre votre code dans TC League.

Votre code est assez transparent et intelligent, donc il s'adaptera presque sans changements, j'aurai juste besoin d'une légère modification, pour que toutes les structures soient à l'intérieur de mes classes OOP.

Eh bien... Je vais le faire, aujourd'hui ou demain je vais mettre ton code dans la Ligue... Je ne vois pas en quoi ça peut être utile, cependant. Il y a beaucoup de chiffres, et nous ne pouvons pas voir la forêt pour les arbres.

 
Georgiy Merts:

Hmmm...

Enregistrez-vous chaque essai non seulement dans le fichier de statistiques, mais aussi dans les cadres du fichier MQD ? Est-ce que j'ai bien compris ?

Alexey, tu vas te noyer dans le flux de données.


Mais, si c'est si important pour vous - je peux mettre votre code dans TC League.

Votre code est assez transparent et intelligent, donc il s'adaptera presque sans changements, j'aurai juste besoin d'un réglage fin, pour que toutes les structures soient à l'intérieur de mes classes OOP.

Eh bien... Je vais le faire, aujourd'hui ou demain je vais mettre ton code dans la Ligue... Je n'en vois pas l'utilité, cependant. Il y a beaucoup de chiffres, et nous ne pouvons pas voir la forêt pour les arbres.

Des trames sont nécessaires pour que tout soit rassemblé à partir du réseau - des optimiseurs (agents), je n'utilise pas un seul ordinateur. Le code n'est donc pas le mien, il ne vient pas de zéro - je l'ai partiellement vidé de l'article sur l'optimisation et l'ai adapté à mes besoins.

Dans Expert Advisor, vous pouvez créer une variable externe, en fonction de laquelle les statistiques seront écrites ou non.

Et, vous avez peu de variables externes dans votre EA, contrairement à mon monstre, donc vous pouvez (devez) écrire la valeur des variables en une fois - cela ajoutera quelques lignes dans le fichier final, mais permettra de travailler avec lui à un niveau différent. Maintenant, j'ajoute ces valeurs au fichier à la main, c'est-à-dire que j'optimise par fragments.

Raison: