Diskussion zum Artikel "Kontrollierte Optimierung: Simuliertes Abkühlen"

 

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:

  • Die Klasse AnnealingMethod.mqh — sie enthält eine Reihe von Methoden, die separate Schritte des Algorithmus implementieren;
  • Die Klasse FrameAnnealingMethod.mqh — enthält Methoden zur Bedienung der grafischen Oberfläche, die im Chart des Terminals angezeigt werden.

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

 

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);
 
Abwesend
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.

Dateien:
 

Таким образом, алгоритм сверхбыстрого отжига — достойный конкурент ГА и при правильных настройках может показать лучший результат.

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

fxsaber:

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.

 
Andrey Dik:

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.

 
Sergey Pavlov:

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

 
fxsaber:

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.