Diskussion zum Artikel "Entwicklung eines Expert Advisors für mehrere Währungen (Teil 20): Ordnung in den Ablauf der automatischen Projektoptimierungsphasen bringen (I)"

 

Neuer Artikel Entwicklung eines Expert Advisors für mehrere Währungen (Teil 20): Ordnung in den Ablauf der automatischen Projektoptimierungsphasen bringen (I) :

Wir haben bereits eine ganze Reihe von Komponenten entwickelt, die bei der automatischen Optimierung helfen. Bei der Erstellung folgten wir der traditionellen zyklischen Struktur: von der Erstellung eines minimalen funktionierenden Codes bis hin zum Refactoring und dem Erhalt eines verbesserten Codes. Es ist an der Zeit, mit dem Aufräumen unserer Datenbank zu beginnen, die auch eine Schlüsselkomponente in dem von uns geschaffenen System ist.

In dieser Artikelserie versuchen wir, ein automatisches Optimierungssystem zu entwickeln, das es ermöglicht, gute Kombinationen von Parametern einer Handelsstrategie ohne menschliches Eingreifen zu finden. Diese Kombinationen werden dann zu einem endgültigen EA kombiniert. Das Ziel wird in Teil 9 und Teil 11 ausführlicher dargelegt. Der Prozess einer solchen Suche selbst wird von einem EA (optimizing EA) gesteuert, und alle Daten, die während des Betriebs gespeichert werden müssen, werden in der Hauptdatenbank festgelegt.

In der Datenbank gibt es Tabellen, in denen Informationen über verschiedene Klassen von Objekten gespeichert werden. Einige haben ein Statusfeld, das Werte aus einer festen Reihe von Werten annehmen kann („Queued“, „Process“, „Done“), aber nicht alle Klassen verwenden dieses Feld. Genauer gesagt, wird es derzeit nur für Optimierungsaufgaben (Task) verwendet. Unser optimierendes EA sucht in der Aufgabentabelle (Aufgaben) nach den Aufgaben in der Warteschlange, um die nächste auszuführende Aufgabe auszuwählen. Nach Abschluss jeder Aufgabe ändert sich ihr Status in der Datenbank auf Erledigt.

Versuchen wir, automatische Statusaktualisierungen nicht nur für Aufgaben, sondern auch für alle anderen Klassen von Objekten (Aufträge, Phasen, Projekte) zu implementieren und die automatische Ausführung aller erforderlichen Phasen bis zur Erlangung des endgültigen EA zu organisieren, der unabhängig ohne Verbindung zur Datenbank arbeiten kann.

Autor: Yuriy Bykov

 

Ich habe versucht, Ihr Beispiel auszuführen.

Ich habe groupId_ = 1 gesetzt.

Aber der Experte wird nicht in der Initialisierungsfunktion erstellt. Hier kommt es heraus:

int OnInit() {
// Parameter in der Kapitalverwaltungsklasse einstellen
   CMoney::DepoPart(expectedDrawdown_ / 10.0);
   CMoney::FixedBalance(fixedBalance_);

// Initialisierungsstring mit Strategieparametersätzen
   string strategiesParams = NULL;

// Wenn der ausgewählte Index der Strategiegruppe aus der Bibliothek gültig ist, dann
   if(groupId_ >= 0 && groupId_ < ArraySize(CGroupsLibrary::s_params)) {
      // Übernahme der Initialisierungszeichenfolge aus der Bibliothek für die ausgewählte Gruppe
      strategiesParams = CGroupsLibrary::s_params[groupId_];
   }

// Wenn die Strategiegruppe aus der Bibliothek nicht angegeben ist, wird der Vorgang abgebrochen
   if(strategiesParams == NULL) {
      return INIT_FAILED;
   }

// Bereiten Sie den Initialisierungsstring für einen Expert Advisor mit einer Gruppe von mehreren Strategien vor
   string expertParams = StringFormat(
                            "class CVirtualAdvisor(\n"
                            "    class CVirtualStrategyGroup(\n"
                            "       [\n"
                            "        %s\n"
                            "       ],%f\n"
                            "    ),\n"
                            "    class CVirtualRiskManager(\n"
                            "       %d,%.2f,%d,%.2f,%.2f,%d,%.2f,%.2f,%d,%.2f,%d,%.2f,%.2f"
                            "    )\n"
                            "    ,%d,%s,%d\n"
                            ")",
                            strategiesParams, scale_,
                            rmIsActive_, rmStartBaseBalance_,
                            rmCalcDailyLossLimit_, rmMaxDailyLossLimit_, rmCloseDailyPart_,
                            rmCalcOverallLossLimit_, rmMaxOverallLossLimit_, rmCloseOverallPart_,
                            rmCalcOverallProfitLimit_, rmMaxOverallProfitLimit_, rmMaxOverallProfitDate_,
                            rmMaxRestoreTime_, rmLastVirtualProfitFactor_,
                            magic_, "SimpleVolumes", useOnlyNewBars_
                         );

   PrintFormat(__FUNCTION__" | Expert Params:\n%s", expertParams);

// Erstellen Sie einen Expert Advisor, der mit virtuellen Positionen arbeitet.
   expert = NEW(expertParams);

// Wenn der Expert Advisor nicht erstellt wird, wird ein Fehler zurückgegeben
   if(!expert) return INIT_FAILED;

...
}


Wenn wir tiefer gehen, wird das Objekt nicht in CVirtualFactory() erstellt:

class CVirtualFactory {
public:
   // Erstellen eines Objekts aus der Initialisierungszeichenfolge
   static CFactorable* Create(string p_params) {
      // Lesen des Objektklassennamens
      string className = CFactorable::ReadClassName(p_params);
      
      // Zeiger auf das zu erstellende Objekt
      CFactorable* object = NULL;

      // Je nach Klassenname, Aufruf des entsprechenden Konstruktors
      if(className == "CVirtualAdvisor") {
         object = new CVirtualAdvisor(p_params);
...

Können Sie mir sagen, was das Problem ist, und wie ich Ihr Beispiel doch noch in die Tat umsetzen kann?

Danke!

 

Hallo.

Es kann sein, dass Sie die Arbeiten zum Anlegen von Einträgen in der Parameterbibliothek oder auch alle anderen notwendigen Schritte der automatischen Optimierung nicht abgeschlossen haben. Über den letzten Schritt - das Füllen der Bibliothek - können Sie zum Beispiel in Teil 17 mehr lesen.

Es kann aber auch sein, dass der Punkt ein anderer ist. Im Idealfall brauchen Sie keine Datenbank, um den endgültigen EA auszuführen. Ich werde den Code überprüfen und später antworten.
 
Ich habe mir den Code für diesen Artikel angesehen. In der Tat haben wir bisher noch nicht die letzte Stufe der Automatisierung erreicht, bei der der endgültige EA, der nicht mit der Optimierungsdatenbank verknüpft ist, automatisch erzeugt wird. Dies wird in einem zukünftigen Artikel nachgeholt. Im Moment ist eine vorläufige Ausführung der ersten Stufen der Pipeline erforderlich, um die Ergebnisse zu erhalten.
 

Hallo Yuriy

ich habe Google Translate benutzt, um zu Teil 20 zu gelangen. Googeln Sie "Google Translate" und öffnen Sie eine neue Registerkarte im Browser. In der Suchleiste ganz rechts wird ein Symbol angezeigt. Laden Sie die Seite in ihrer Muttersprache und drücken Sie auf das Symbol, um die Sprache des Artikels und die Sprache, in die übersetzt werden soll, auszuwählen. Und schon bin ich bei Teil 20! Die Übersetzung ist zwar nicht perfekt, aber zu 99 % nützlich.

Ich habe Ihre Archivquelle in Excel geladen und ein paar Spalten zum Sortieren hinzugefügt, um den Inhalt zu ordnen. Neben der Sortierung in Excel kann die Tabelle auch direkt in eine OutLook-Datenbank importiert werden.


Ich habe Probleme, den Startartikel für die Einrichtung der SQL-Datenbank zu identifizieren. Ich habe versucht, Simple Volume Stage 1 auszuführen und erhielt eine flache Linie, was mir zeigt, dass ich wahrscheinlich zurückgehen und eine andere SQL-Datenbank erstellen muss. Es wäre äußerst hilfreich, eine Tabelle mit der Reihenfolge der Ausführung der erforderlichen Programme zu haben, um ein funktionierendes System zu erhalten. Vielleicht könnte man sie in die Tabelle der Archivquellen aufnehmen.

Eine weitere kleine Bitte ist die Verwendung der <>-Option für Include-Dateispezifikationen anstelle von "". Ich halte Ihr System in meinen Verzeichnissen Experts und Include getrennt, #include <!!!! MultiCurrency\VirtualAdvisor.mqh>, so dass diese Änderung das Hinzufügen der Unterverzeichnisspezifikation/ erleichtern wird.

Vielen Dank für Ihren Beitrag

CapeCoddah

Dateien:
 

Hallo.

Über die anfängliche Befüllung der Datenbank mit Informationen über das Projekt, die Phasen, Arbeiten und Aufgaben können Sie in den Teilen 13, 18 und 19 lesen. Dies ist nicht das Hauptthema, so dass die Informationen, die Sie benötigen, irgendwo näher am Ende der Artikel zu finden sind. Zum Beispiel in Teil 18:

Проверив, что в базу данных теперь корректно попадают результаты проходов, совершаемых с использованием форвард-периода, проведём более приближенный к реальным условиям тест работы автоматической оптимизации. Для этого в чистую базу данных добавим уже два этапа. На первом будет оптимизироваться одиночный экземпляр торговой стратегии, но только на одном символе и периоде (EURGBP H1) на промежутке 2018 - 2023 годов. Форвард-период на этом этапе использоваться не будет. На втором этапе будет оптимизироваться группа из хороших одиночных экземпляров, полученных на первом этапе. Теперь форвард период уже будет использоваться: под него отводится весь 2023 год.

Oder in Teil 19:

Legen wir für unser Projekt vier Stufen in der Datenbank an, die wir "Erste", "Clustering Pässe der ersten Stufe", "Zweite" und "Zweite mit Clustering" nennen. Für jede Phase werden wir zwei Werke für EURGBP- und GBPUSD-Symbole auf dem H1-Zeitrahmen erstellen. Für die Arbeiten der ersten Stufe werden wir drei Optimierungsaufgaben mit unterschiedlichen Kriterien (komplex, maximaler Gewinn und benutzerdefiniert) erstellen. Für den Rest der Arbeiten werden wir jeweils eine Aufgabe erstellen. Als Optimierungsintervall nehmen wir den Zeitraum von 2018 bis 2023. Für jede Aufgabe werden wir die richtigen Werte der Eingabeparameter angeben.

Oder Sie warten auf den nächsten Artikel, der sich unter anderem mit der Erstbefüllung der Datenbank mit Hilfe eines Hilfsskripts befassen wird.

Die Umstellung auf die Verwendung des Include-Ordners für die Speicherung von Bibliotheksdateien ist geplant, aber es ist noch nicht so weit.

 
Yuriy Bykov Speicherung der Bibliothek ist zwar geplant, aber bisher noch nicht erfolgt.

Vielen Dank

 

Hallo Yuriy,

Haben Sie den nächsten Artikel eingereicht oder wissen Sie, wann er veröffentlicht wird?

 
Hallo, höchstwahrscheinlich in etwa einem Monat.