Der Artikel ist interessant und sehr nützlich für mich. Ich habe jedoch eine Frage: Wie korrekt ist der Vergleich von reellen Zahlen in diesem Code-Stück?
double AnnealingMethod::FindValue(double val,double step) { double buf=0; if(val==step) return val; if(step==1) return round(val);
Images\AnnealingMethod\back.bmp Images\AnnealingMethod\pause.bmp Images\AnnealingMethod\play.bmp Images\AnnealingMethod\stop.bmp Images\AnnealingMethod\forward.bmp
Danke für die Nachricht, korrigiert
| AnnealingMethod.zip | Zip-файл с картинками для создания интерфейса плеера. Файлы нужно разместить в папке MQL5/Images/AnnealingMethod |
Dies war ein guter Artikel. Vielen Dank an den Autor!
Ich bin immer noch ein wenig verwirrt, aber ich möchte etwas dazu sagen
Несмотря на значительные преимущества, алгоритм метода отжига имеет следующие недостатки реализации:
- Die Unmöglichkeit, den Algorithmus in der Cloud zu testen;
- die Komplexität der Verbindung mit dem Expert Advisor und die Notwendigkeit, Parameter zu wählen, um die besten Ergebnisse zu erzielen.
Ich schlage vor, den Artikel leicht anzupassen, so dass Sie jeden Expert Advisor mit kleinen Bewegungen anschließen können.
Zum Beispiel können Sie den Standard Moving Average.mq5 mit der vorgestellten Implementierung der Annealing-Methode wie folgt verbinden
//+------------------------------------------------------------------+ //|Gleitende Durchschnitte.mq5 | //| Copyright 2009-2017, MetaQuotes Software Corp. | | //|http://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2009-2017, MetaQuotes Software Corp." #property link "http://www.mql5.com" #property version "1.00" #include <Trade\Trade.mqh> input double MaximumRisk = 0.02; // Maximales Risiko in Prozent input double DecreaseFactor = 3; // Verkleinerungsfaktor. input int MovingPeriod = 12; // Gleitender Durchschnittszeitraum input int MovingShift = 6; // Verschiebung des gleitenden Durchschnitts // Nach allen Eingaben einfügen #include <AddAnnealingMethod.mqh> #define MaximumRisk Inputs[0] #define DecreaseFactor Inputs[1] #define MovingPeriod (int)Inputs[2] #define MovingShift (int)Inputs[3] //--- int ExtHandle=0; bool ExtHedging=false; CTrade ExtTrade; #define MA_MAGIC 1234501
Und das war's auch schon! Es sind keine weiteren Manipulationen erforderlich. Damit es funktioniert, mussten wir eine Funktion leicht ändern
//Funktion zur Einstellung der Optimierungsparameter uint AnnealingMethod::RunOptimization(string &InputParams[],int count,double F0,double T) { Input Mass[]; ArrayResize(Mass, ArraySize(InputParams)); ResetLastError(); bool Enable=false; double Start= 0; double Stop = 0; double Step = 0; double Value= 0; int j=0; Alg.HQRndRandomize(&state);//Initialisierung for(int i=0;i<ArraySize(InputParams);i++) { if(!ParameterGetRange(InputParams[i],Enable,Value,Start,Step,Stop)) return GetLastError(); // if(Aktivieren) { // ArrayResize(Masse,ArraySize(Masse)+1); Mass[j].num=i; // Masse[j].Wert=EinheitlicherWert(Start,Stop,Schritt); Mass[j].Value=Enable ? UniformValue(Start,Stop,Step) : Value; Mass[j].BestValue=Mass[j].Value; Mass[j].Start=Start; Mass[j].Stop=Stop; Mass[j].Step=Step; Mass[j].Temp=T*Distance(Start,Stop); j++; // if(!ParameterSetRange(InputParams[i],false,Value,Start,Stop,count)) if(Enable && !ParameterSetRange(InputParams[i],false,Value,Start,Step,Stop)) return GetLastError(); } // sonst // InputParams[i]="""; } if(j!=0) { if(!ParameterSetRange("iteration",true,1,1,1,count)) return GetLastError(); else return WriteData(Mass,F0,1); } return 0; }
Und ein ordentliches Stück Code in AddAnnealingMethod.mqh verstecken.
Таким образом, алгоритм сверхбыстрого отжига — достойный конкурент ГА и при правильных настройках может показать лучший результат.
bei welchen "richtigen" Einstellungen?
Der Sinn eines Optimierungsalgorithmus besteht darin, den Suchraum zu verkleinern. Wenn eine Suche im Gange ist, bedeutet dies, dass die FF-Formel nicht bekannt ist (sonst könnten die Extrema mit der FF-basierten Formel berechnet werden), und daher gibt es keine "richtigen Einstellungen".
Der Algorithmus sucht entweder nach besser, wenn alles andere gleich ist, oder nach schlechter, es ist unmöglich, ein bisschen schwanger zu sein.
Es gab echte Versuche, das reguläre GA und andere AOs in verschiedenen Tests zu vergleichen. die Götter sagten - es wird keinen Kampf geben und Amen dazu.
ZY. 1, 2 optimierbare Parameter? das ist einfach ugh..... Versuchen Sie einmal, mehrere Hunderte, Tausende von Parametern mit Ihrem Glühverfahren zu optimieren..... dann werden Ihnen die Augen geöffnet.
tester_file wird nur gelesen, wenn sie zum Zeitpunkt der Kompilierung existierte (der Inhalt ist nicht wichtig).
Wenn mq5 kompiliert wurde, als es noch keine entsprechende Datei gab, wird auch ihre weitere Existenz in EX5 nicht wahrgenommen.
Wenn Sie also in OnTesterInit eine Datei für tester_file erzeugen, stellen Sie sicher, dass Sie den EA kompilieren, wenn es zumindest eine leere übergebene Datei gibt.
@Renat Fatkhullin liegt mit seiner Aussage etwas daneben
Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien
Kann ein EA ohne DLL-Funktionen Daten irgendwo hinschicken?
Renat Fatkhullin, 2017.06.21 11:12 AM
Ich habe es nicht überprüft, aber ich nehme an, dass diese Datei direkt in OnTesterInit erzeugt werden kann.
Nein, sie wird nicht in das berechnete Datenpaket im Durchlauf selbst gehen.
Der Artikel zeigt, dass OnTesterInit die Daten, die an die Agenten gesendet werden sollen, perfekt als Datei generiert. Es ist klar, dass diese Daten von persönlicher Natur sein können...
Der Autor hat gute Arbeit geleistet. Ein sehr interessanter Artikel.
Ich danke Ihnen.
Es gab echte Versuche, die regulären GA und andere AOs in verschiedenen Tests zu vergleichen. Die Götter haben gesagt, dass es kein Einradfahren geben wird, und das ist richtig.
ZY. 1, 2 optimierbare Parameter? das ist einfach ugh..... Versuchen Sie einmal, mehrere Hunderte, Tausende von Parametern mit Ihrem Glühverfahren zu optimieren..... dann werden Ihnen die Augen geöffnet.
Der Artikel ist nicht wegen des Optimierungsalgorithmus wertvoll (obwohl er mehr als interessant ist), sondern wegen der in den Standard-Optimierer eingebauten Implementierung. Die Implementierung ist zur Zeit sehr uneinheitlich und widerspricht sogar einigen Aussagen der Entwickler. Aber um sie zu verstehen, müssen Sie den Quellcode lesen, der nicht den Annealing-Algorithmus selbst betrifft.
Nichts hindert Sie daran, Ihren eigenen Algorithmus in ähnlicher Weise einzubinden und seine Vor- und Nachteile direkt in Expert Advisors darzustellen, wie es der Autor getan hat.
Der Artikel ist interessant und sehr nützlich für mich. Ich habe jedoch eine Frage: Wie korrekt ist der Vergleich von reellen Zahlen in diesem Stück Code?
Ja, Sie haben Recht, es ist unmöglich, auf diese Weise zu vergleichen. Die MQL5-Hilfe schlägt vor, die folgende Funktion zu verwenden:
bool CompareDoubles(double number1,double number2) { if(NormalizeDouble(number1-number2,8)==0) return(true); else return(false); }
Aber selbst wenn der Vergleich nicht korrekt durchgeführt wird, liefert die Funktion FindValue das richtige Ergebnis
Der Artikel ist nicht wegen des Optimierungsalgorithmus wertvoll (obwohl er mehr als interessant ist), sondern wegen der in den Standard-Optimierer eingebauten Implementierung. Die Implementierung ist zur Zeit sehr uneinheitlich und widerspricht sogar einigen Aussagen der Entwickler. Aber um sie zu verstehen, muss man die Quellen lesen, die nicht den Annealing-Algorithmus selbst betreffen.
Nichts hindert Sie daran, Ihren eigenen Algorithmus in ähnlicher Weise einzubetten und seine Vor- und Nachteile direkt in Expert Advisors aufzuzeigen, wie es der Autor getan hat.
Es ist klar, dass der Artikel bei der Umsetzung des Optimierungsmanagements wertvoll ist, aber der Autor zieht aus irgendeinem Grund einen Vergleich mit dem Standardalgorithmus, und das sogar mit einer vernachlässigbaren Anzahl von Parametern - das ist es, was ich in meinem Beitrag zu betonen versuchte, dass es nutzlos ist, mit dem Standardoptimierer in dem für praktische Zwecke von Algotradern ausreichenden Suchraumbereich (Anzahl der Parameter und deren Schritt) zu konkurrieren.
Und wenn eine benutzerdefinierte Optimierung verwendet werden soll, dann definitiv nicht auf diese Weise, denn der "Engpass" bei der Geschwindigkeit ist der Tester selbst, nicht die AO, und die Qualität wurde bereits erwähnt - die Standardoptimierung ist bereits gut genug.
- 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 Kontrollierte Optimierung: Simuliertes Abkühlen :
Der Strategy Tester in der Handelsplattform MetaTrader 5 bietet nur zwei Optimierungsoptionen: Die vollständige Suche nach Parametern oder den genetischen Algorithmus. Dieser Artikel schlägt eine neue Methode zur Optimierung von Handelsstrategien vor — Simuliertes Abkühlen (simulated annealing). Dabei werden der Algorithmus der Methode, ihre Implementierung und die Integration in jeden Expert Advisor besprochen. Der entwickelte Algorithmus wird mit dem Moving Average EA getestet.
Die Implementierung des Algorithmus erfordert zwei neue Klassen, die in den optimierten Expert Advisor aufgenommen werden sollten:
Außerdem erfordert der Betrieb des Algorithmus, dass zusätzlicher Code in die OnInit-Funktion aufgenommen wird und die Funktionen OnTester, OnTesterInit, OnTesterDeInit, OnTesterDeInit, OnTesterPass zum EA-Code hinzugefügt werden. Der Prozess der Integration des Algorithmus in einen Experten ist in Abb. 2 dargestellt.
Abb. 2. Das Einbinden des Algorithmus in den Expert Advisor
Autor: Aleksey Zinovik