Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Lesen Sie über die Arbeit mit Frames.
Hier ist dieser Code:
inNum=0;
{ // Einlesen der entsprechenden optimierten Eingabeparameter
Print("GLOC = ",GLOC);
Forum über Handel, automatisierte Handelssysteme und das Testen von Handelsstrategien.
Bibliotheken: TesterCache
fxsaber, 2019.11.11 04:45 pm.
Sie haben eine opt-Datei in einem Byte-Array erhalten. Als nächstes müssen Sie sie in den Cache einspeisen.
Ich habe es wie von Ihnen beschrieben korrigiert:
string Sohran,Contr;
MTTESTER::GetSettings(Sohran); // Die aktuellen Anfangseinstellungen des Roboters werden gelesen und in Sohran zwischengespeichert.
prWrite = MTTESTER::SetSettings2(Odinar); // Odinar auf Robotereinstellungen setzen
prRead = MTTESTER::GetSettings(Contr); // Lesen der soeben gesetzten Robotereinstellungen.
Print("prWriteSettings = ",prWrite," prReadSettings = ",prRead);
Print("SettingBeg OdinarContr ",Kol," PoseY = ",PoseY," Iteration ",IterNumber,"\n",Contr);
Run(Contr[0]); // Optimierung mit den Werten des ausgewählten Y-Parameters durchführen
int GLOC = MTTESTER::GetLastOptCache(Bytess); // Opt-Datei in Bytess Byte-Array holen
TESTERCACHE<ExpTradeSummary> Cache;
bool CL = Cache.Load(Bytess); // Einspeisen des Bytess-Byte-Arrays in den Cache
ProfitNow = Cache[GetMaxProfitPos(Cache)].profit; // Maximaler Gewinn
int NomProchodaMaxProfit = Cache[GetMaxProfitPos(Cache)].Pass; // Nummer des Durchgangs mit maximalem Gewinn
int IndexMaxProfit = GetMaxProfitPos(Cache); // Index des Arrays mit dem Wert des Parameters https://www.mql5.com/ru/forum/318998/page2#comment_13846951
Cache.GetInputs(IndexMaxProfit,Paramas);
ParamMax = Paramas[0,1].double_value; // Der Wert des Parameters, bei dem der maximale Gewinn erreicht wurde
Alert("CL=",CL," GLOC = ",GLOC," GLOC," ProfitNow =",ProfitNow," ParamMax=",ParamMax," Odinar ",Kol," PoseY = ",PoseY," PosEq = ",PosEq," TypPar = ",TypPar," Iteration ",IterNumber);
zurückgeben;
Das Ergebnis ist immer noch falsch.
Aus irgendeinem Grund werden ProfitNow und ParamMax Daten aus einem früheren Lauf aus dem Cache gelesen.
Mit freundlichen Grüßen, Alexander
Aus irgendeinem Grund werden die ProfitNow- und ParamMax-Daten aus einem früheren Lauf aus dem Cache gelesen.
Zeigt dieses Skript nach der Optimierung korrekte Werte an?
Wenn ja, dann liegt das Problem höchstwahrscheinlich darin, dass die opt-Datei nicht sofort nach der Optimierung fertig ist. Sie können versuchen, Sleep nach Run zu setzen. Oder Run funktioniert nicht richtig.
Zeigt dieses Skript nach der Optimierung die richtigen Werte an?
Wenn ja, liegt das Problem höchstwahrscheinlich darin, dass die opt-Datei nicht sofort nach der Optimierung fertig ist. Sie können versuchen, Sleep nach Run zu setzen. Oder Run funktioniert nicht richtig.
Vielen Dank! Ich werde das alles morgen überprüfen.
Aber jetzt habe ich herausgefunden, dass, wenn ich die Optimierung mit einem neuen Parameter einstelle, alles richtig funktioniert.
Es scheint mir also so zu sein, dass das Prüfgerät, wenn man eine Optimierung, die schon vorher funktioniert hat, neu einstellt, diese nicht wirklich neu verarbeitet, sondern nur das vorherige Ergebnis aus dem Speicher abruft.
Könnte man nicht etwas erfinden, um diesen Speicher des Testers vorher zu löschen?
Es scheint mir also, dass der Sinn des Ganzen darin besteht, dass das Prüfgerät, wenn Sie eine bereits laufende Optimierung erneut einstellen, diese nicht tatsächlich erneut bearbeitet, sondern lediglich das frühere Ergebnis aus dem Speicher abruft.
Ihre Hypothesen sind falsch. Das Problem liegt in dem Code, den Sie geschrieben haben.
Ihre Hypothesen sind falsch. Das Problem ist der Code, den Sie geschrieben haben.
Guten Tag!
Ich stimme Ihnen zu: "Das Problem liegt in dem Code, den ich geschrieben habe". Der Fehler liegt im Code, und ich weiß noch nicht, wie ich ihn beheben kann.
Ich habe jedoch experimentell herausgefunden, dass, wenn Sie alle opt-Dateien manuell entfernen, bevor Sie Run.
aus dem Ordner "C:\Users\ASUSAppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075\Tester\cache" entfernen,
dann funktioniert mein Code korrekt und führt eine Optimierung für den ausgewählten Parameter durch.
Wenn dieser Ordner nicht bereinigt wird, führt der Tester keine wiederholten Optimierungen (mit denselben unveränderten Daten) durch, sondern liest aus
bereits vorhandene opt-Datei aus diesem Ordner. Dies ist deutlich zu erkennen, wenn dieselbe Optimierung wiederholt manuell durchgeführt wird.
Es ist zu erkennen, dass die eigentliche Optimierung nur beim ersten Mal durchgeführt wird, und dann nur die opt-Datei aus dem Ordner gelesen wird.
Dieses wiederholte Lesen scheint den Inhalt des Caches nicht zu aktualisieren, und das ist die Ursache für den Fehler in meinem Code.
Das Löschen des besagten Ordners könnte helfen, den Fehler zu beheben. Natürlich ist dies eine schlechte Lösung, und es wäre eleganter, die richtigen Daten im Cache wiederherzustellen.
Aber ich weiß nicht, wie man das macht. Im Moment bleiben die Daten der letzten echten Optimierung im Cache hängen (sie passen nicht zum erneuten Einlesen aus dem Ordner).
Leider kann dieser Ordner nicht mit FolderClean aus dem Skript bereinigt werden, da dies in MQL5 verboten ist.
Er befindet sich außerhalb der "Sandbox" und wird nur vom Strategy Tester gefüllt.
Vielleicht sollten Sie ein externes Add-on mit Hilfe von C++ erstellen und es vom Skript aus ausführen.
Mit freundlichen Grüßen, Alexander