Optimieren Sie einen EA und holen Sie sich das Beste aus den optimierten EAs. - Seite 41

 

Freies Signal - reoptimiert.

Derzeit gibt es 6 Liga-TS, die mir am optimalsten erscheinen.

Die aktuellen Ergebnisse der CU-Liga-Favoriten finden Sie auf den vorherigen Seiten.

Aktuelle TCs für Überoptimierung:

Symbol System Grund
1 EURCHF ChnTrendDTS Neu
2 EURCHF ChnTrendSAR Neu
3 EURCHF ChnTrendSP Neu
4 EURCHF ChnFlatSP Neu
5 EURCHF ChnFlatSAR Neu
6 EURCHF ChnFlatRTS Neu
7 EURCHF ChnTrendRTS Neu
8 EURCHF ChnFlatDTS Neu
9 GBPUSD ChnTrendSAR Nicht erlaubt SL
10 CADJPY ChnFlatSAR Nicht erlaubt SL
11 CHFJPY EMAFlatRTS Big DD
12 USDJPY EMAFlatDTS Lange maximale Wartezeit


Ich setze USDJPY EMAFlatDTS

Optimierungszeitraum 4.05.17 - 4.15.18, vorwärts ab 4.10.17

(Da ich zu viel optimiert habe, werde ich diesen Beitrag korrigieren und die TCs, beginnend mit den letzten, wieder auf die ersten optimieren)

 
Georgiy Merts:

Freies Signal - wiedereröffnet.

Derzeit gibt es 6 Liga-TKs, die mir am optimalsten erscheinen.

Vielleicht können Sie noch die Möglichkeit schaffen, die Optimierungsergebnisse in die Datei zu schreiben? Nur Standard-Indikatoren nicht geben mir, und ich denke, andere nicht viel geben.

Hier ist mein Datensatz, der den Optimierer gibt, aber ich plane, ihn auch zu erweitern.

 
Aleksey Vyazmikin:

Vielleicht könnten Sie noch die Möglichkeit schaffen, die Optimierungsergebnisse in eine Datei zu schreiben? Es ist nur so, dass ich, und ich glaube auch andere, mit den Standardindikatoren nicht viel anfangen kann.

Hier ist mein Datensatz, der vom Optimierer zur Verfügung gestellt wird, aber ich habe vor, ihn noch zu erweitern.


Natürlich habe ich alle diese Daten in meinem Expert Advisor. Schlagen Sie vor, dass ich nach jedem Durchlauf eine solche Datei erstelle und sie in den Dateibereich lege?

Aber ich bin mir sicher, dass viele Leute es sich ansehen werden?


Aber, sagen wir, in Ihrer Datei - ich persönlich nicht wahrnehmen, diese Zahl - nur "den Wald vor lauter Bäumen nicht sehen". Ich betrachte nur die Spalten "Erholungsfaktor" und "Misserfolg".

Alle anderen Daten sind für mich überflüssig, sie sagen mir nichts Neues. Ich bin der Meinung, dass es notwendig ist, so wenige Parameter wie möglich für die Experten und so wenige Indikatoren wie möglich für die Bewertung zu haben. Ich würde alles in einen Parameter "Qualität" packen, aber ich sehe, dass ein weiterer Parameter "Nachhaltigkeit" notwendig ist.


Sie sagen: "Das sind die Parameter, die ich ausgegeben habe, und ich beabsichtige, diesen Satz zu erweitern" - was ist das Ziel?

Zeigen Sie mir ein konkreteres Beispiel - wo würden Sie mindestens ein Drittel dieser Spalten, die Sie ausgeben, verwenden? Sie sind genau wie der Teilnehmer eines benachbarten Themas, der eine wunderbare Canvas-Engine geschrieben hat, die wunderbare visuelle Effekte auf dem Diagramm anzeigt... Aber er dachte nicht an den praktischen Nutzen dieser Funktionen. Die Gewinnung von Daten sollte von besonderem Nutzen sein, sie sollte Teil einer bestimmten Auswahl- oder TZ-Methode sein. Und "einfach zu haben"... Diese Ressourcen sind besser für zusätzliche Re-Optimierungen von Fremdsystemen oder neuen Systemen geeignet.

In der Idee ist es natürlich möglich, sich um die Ausgabedatei zu kümmern. Nun, wenn es mindestens ein paar mehr Stimmen, dass die drei Parameter - Qualität, Drawdown und SL Warteschlange ist nicht genug - gut, machen eine solche Datei, und wird seine Daten in den Berichten anzuzeigen.

 

Aktuelle TCs für Überoptimierung:

Symbol System Grund
1 EURCHF ChnTrendSAR Neu
2 EURCHF ChnTrendSP Neu
3 EURCHF ChnFlatSP Neu
4 EURCHF ChnFlatSAR Neu
5 EURCHF ChnFlatRTS Neu
6 EURCHF ChnTrendRTS Neu
7 EURCHF ChnFlatDTS Neu
8 GBPUSD ChnTrendSAR Nicht erlaubt SL
9 EURCHF EMATrendSP Viele SL
10 GBPAUD EMAFlatRTS Big DD
11 CADJPY ChnFlatSAR Nicht erlaubt SL
12 CHFJPY EMAFlatRTS Big DD
13 GBPNZD EMAFlatSAR Lange maximale Wartezeit


Ich habe einen GBPNZD EMAFlatSAR

Zeitraum 5.05.17 - 5.05.18, vorwärts vom 5.10.17

 

Aktuelle Situation bei den Favoriten

(Alle TCs arbeiten auf Demo ohne MM, mit Mindestmengen)

Top 20 nach Qualität:

Übersicht über die Top 10 der Qualität:

Beste 20 nach Gleichgewicht:

Die 10 besten Diagramme nach Gleichgewicht:

Nur zur Erinnerung, die Trading Systems League Expert (Versionen für MT4 und MT5) ist auf Yandex-Disk. Das Archiv enthält auch eine kurze Beschreibung der Grundsätze der Liga und eine Liste der TS, die in ihr arbeiten.

Standardmäßig arbeitet die Liga mit einem TS (EURUSD ChnTrendSAR, magik 220141) ohne jegliche Einschränkungen.

Andere TS funktionieren nur im Strategie-Tester. Für ihre Arbeit auf einem Demo- oder Realkonto sind Registrierungscodes erforderlich. Registrierungscodes, die 3 Monate lang gültig sind und einen Link zu Ihrer Kontonummer enthalten, werden für die Optimierung der einzelnen League-Systeme ausgegeben (2-5 Stunden auf einem Quad-Core Core i5).

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


Natürlich habe ich alle diese Daten innerhalb des Expert Advisors. Schlagen Sie vor, eine solche Datei nach jedem Durchlauf zu erstellen und sie in den Dateibereich zu werfen?

Aber ich bin mir sicher, dass viele Leute es sich ansehen werden?

Sie sagen: "Das sind die Parameter, die ich anzeige, und ich beabsichtige immer noch, diesen Satz zu erweitern" - was ist der Zweck?

Zeigen Sie mir ein konkreteres Beispiel - wo würden Sie mindestens ein Drittel der von Ihnen ausgegebenen Spalten verwenden?

Theoretisch ist natürlich auch die Ausgabe der Datei möglich. Nun, wenn es mindestens ein paar mehr Stimmen, dass die drei Parameter - Qualität, Senkung und SL Warteschlange ist nicht genug - gut, machen eine solche Datei, und wird seine Daten in den Berichten anzuzeigen.

Lassen Sie es mich so sagen: Ich war plötzlich neugierig, welche Art von Expert Advisors ich optimierte, aber da ich ihren genauen Algorithmus nicht kannte, beschloss ich, mich auf ihre Leistung zu konzentrieren, und stellte plötzlich fest, dass ich die Ergebnisse aufgrund des Mangels an statistischen Indikatoren nicht beurteilen konnte.

Sie sagen, dass die Projektteilnehmer die Auswahl selbst vornehmen sollten, aber das ist auf der Grundlage der verfügbaren Daten nicht realistisch.

Jetzt arbeite ich an einem mechanischen Bewertungssystem - die Hauptidee ist, alle Indikatoren auszugleichen, nicht nur ihren absoluten Wert, der natürlich genauso wichtig ist.

Ich verwende zum Beispiel oft die Formel "Einnahmen"-"Maximaler Dauergewinn "*3-"Ausgaben"-"Maximaler Dauerverlust "*3, um den Gewinn zu schätzen, und wenn wir immer noch im Plus sind, schauen wir weiter, aber auch in diesem Stadium können wir viel aussieben.

Und den Drawdown nehme ich nur in natürlichen Begriffen wahr, da der Prozentsatz von den kumulierten Gewinnen zum Zeitpunkt des Drawdowns abhängt, was aber nichts aussagen kann, da es keine Garantie gibt, dass dieser Drawdown auch beim nächsten Mal eintritt, sondern nur nach den kumulierten Gewinnen. Zum Beispiel, eine Inanspruchnahme von 10% mit einem Startkapital von 1000 ist 10 Einheiten, und wenn 10% mit einem Gewinn von 2000, ist es bereits 30 Einheiten, stimmen Sie zu, dass die Zahlen sind nicht vergleichbar. Die Bedeutung des Prozentsatzes nur, wenn die Entnahme von Geldern jeden Tag, aber wenn Sie es zu implementieren, dann sind andere Indikatoren schleichen, die automatisch berechnet werden, dann müssen Sie jede Zahl von selbst, die mühsam ist.

Ich kann Ihnen meinen Code zum Schreiben von Daten in eine Datei geben, falls Sie das noch nicht getan haben.

 
Aleksey Vyazmikin:

Ich kann Ihnen meinen Code zum Schreiben von Daten in eine Datei geben, falls Sie das noch nicht getan haben.

Sie hätten Skype nicht aufgeben sollen. Sie hätten sich den Code ansehen und herausfinden können, wie man es am besten macht.

Kommen Sie, welche Indikatoren brauchen Sie?

Und zu welchem Zeitpunkt sollte sie vom Expert Advisor ausgegeben werden? So wie ich es verstehe - in der Funktion OnTester()? Ich werde Ihnen eine solche Funktion erstellen. Es wird eine CSV-Datei ausgegeben, die leicht in Excel geöffnet werden kann.


Und über welchen Expert Advisor reden wir, den Hauptexpert Advisor der Liga oder separate EAs für verschiedene TS?

 
Georgiy Merts:

Sie hätten Skype nicht aufgeben sollen. Sie hätten sich den Code ansehen und herausfinden können, wie man es am besten macht.

Kommen Sie, welche Indikatoren brauchen Sie?

Und zu welchem Zeitpunkt soll es vom Expert Advisor ausgegeben werden? So wie ich es verstehe - in der Funktion OnTester ()? Ich werde Ihnen ein solches Feature machen.


Oh, und was EA sind wir hier reden - die wichtigsten Expert Advisor der Liga, oder separate EAs für verschiedene TS?

Ich habe es wie folgt organisiert

//--- Кол-во показателей для записи в файл
#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

  }

Es gibt einen Fehler im Code, oder vielleicht auch nicht - manchmal wird das letzte Bild nicht angezeigt, aber das ist nicht immer der Fall, und manchmal kann die Nummerierung übereinstimmen. Im Allgemeinen denke ich, dass es sich um eine Programmstörung handelt, aber wenn Sie einen Fehler im Code sehen, sagen Sie es mir!


Und in welchen EAs - ja, das kann man, und in allen, die der Optimierung unterliegen.

 

Hmmm...

Speichern Sie jeden Testlauf nicht nur in der Statistikdatei, sondern auch in den Rahmen der MQD-Datei? Habe ich es richtig verstanden?

Außerdem frage ich mich, wie eine solche Ausgabe in eine Datei bei OnTesterPass() funktionieren soll, wenn der Tester in der Cloud ist? In einen Frame wird es geschrieben, in eine Datei vermutlich nicht.

Alexey, du wirst im Datenstrom ertrinken.


Aber wenn es für Sie so wichtig ist - ich kann Ihren Code in TC League einstellen.

Ihr Code ist ziemlich transparent und clever, so dass er fast ohne Änderungen passen wird, ich brauche nur eine kleine Änderung, damit alle Strukturen innerhalb meiner OOP-Klassen sind.

Na ja... Ich werde es tun, heute oder morgen werde ich deinen Code in die Liga einfügen... Ich weiß allerdings nicht, was das bringen soll. Es gibt eine Menge Zahlen, und wir sehen den Wald vor lauter Bäumen nicht.

 
Georgiy Merts:

Hmmm...

Speichern Sie jeden Testlauf nicht nur in der Statistikdatei, sondern auch in den Rahmen der MQD-Datei? Habe ich es richtig verstanden?

Alexey, du wirst im Datenstrom ertrinken.


Aber wenn es für Sie so wichtig ist - ich kann Ihren Code in TC League einstellen.

Ihr Code ist ziemlich transparent und intelligent, so dass er fast ohne Änderungen passen wird. Ich brauche nur etwas Feinabstimmung, damit alle Strukturen innerhalb meiner OOP-Klassen sind.

Na ja... Ich werde es tun, heute oder morgen werde ich deinen Code in die Liga einfügen... Ich sehe allerdings keinen großen Nutzen darin. Es gibt eine Menge Zahlen, und wir sehen den Wald vor lauter Bäumen nicht.

Frames werden benötigt, um alles aus dem Netzwerk zu sammeln - Optimierer (Agenten), ich bin nicht mit einem Computer. Der Code ist also nicht von Grund auf von mir - ich habe ihn teilweise aus dem Artikel über Optimierung entkernt und an meine Bedürfnisse angepasst.

In Expert Advisor können Sie eine externe Variable erstellen, je nachdem, ob Statistiken geschrieben werden oder nicht.

Und, Sie haben nur wenige externe Variablen in Ihrem EA, im Gegensatz zu meinem Monster, so können (müssen) schreiben Sie den Wert der Variablen auf einmal - es wird ein paar Zeilen in der endgültigen Datei hinzufügen, aber wird es ermöglichen, mit ihm auf einer anderen Ebene zu arbeiten. Jetzt füge ich diese Werte einfach von Hand in die Datei ein, d.h. ich optimiere in Fragmenten.

Grund der Beschwerde: