Diskussion zum Artikel "Entwicklung eines Expert Advisors für mehrere Währungen (Teil 20): Ordnung in den Ablauf der automatischen Projektoptimierungsphasen bringen (I)"
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.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
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:
Oder in Teil 19:
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.
Hallo Yuriy,
Haben Sie den nächsten Artikel eingereicht oder wissen Sie, wann er veröffentlicht wird?
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Neuer Artikel Entwicklung eines Expert Advisors für mehrere Währungen (Teil 20): Ordnung in den Ablauf der automatischen Projektoptimierungsphasen bringen (I) :
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