English Русский 中文 Español 日本語 Português
preview
Trauminspirierter Optimierungsalgorithmus (DOA)

Trauminspirierter Optimierungsalgorithmus (DOA)

MetaTrader 5 — Handel |
21 1
Andrey Dik
Andrey Dik

Inhaltsverzeichnis

  1. Einleitung
  2. Implementierung des Algorithmus
  3. Testergebnisse


Einleitung

Im Rahmen meiner umfassenden Forschung zu optimalen Optimierungsmethoden wurde ich auf einen völlig neuen und ungewöhnlichen Ansatz aufmerksam, der von einem höchst umstrittenen und bislang kaum erforschten Phänomen inspiriert ist: dem Mechanismus des Träumens.

Im März 2025 stellten Y. Lang und Y. Gao der wissenschaftlichen Gemeinschaft einen innovativen metaheuristischen Optimierungsalgorithmus vor – den Dream Optimization Algorithm (DOA), veröffentlicht in der Fachzeitschrift Computer Methods in Applied Mechanics and Engineering (Band 436). Dieser Algorithmus, der von den einzigartigen Eigenschaften menschlicher Träume inspiriert ist, eröffnet neue Perspektiven für die Lösung komplexer Optimierungsprobleme, darunter auch die Feinabstimmung der Parameter von Handelssystemen.

DOA simuliert drei zentrale Aspekte des Schlafprozesses: die teilweise Gedächtniserhaltung, selektives Vergessen mit anschließender Ergänzung von Informationen sowie den Austausch von „Träumen“ zwischen den Agenten in der Population. Im Kontext des algorithmischen Handels ermöglichen diese Mechanismen ein Gleichgewicht zwischen der Exploration neuer Bereiche des Parameterraums und der Exploitation der gefundenen optimalen Lösungen, was bei der Optimierung von Handelsstrategien im Umfeld nichtstationärer Finanzmärkte von entscheidender Bedeutung ist.

In diesem Artikel werden wir die mathematischen Grundlagen des Algorithmus eingehend untersuchen, ihn in MQL5 implementieren und eine vergleichende Analyse mit anderen populationsbasierten Optimierungsmethoden durchführen.


Implementierung des Algorithmus

Wenn wir schlafen, erledigt unser Gehirn drei wichtige Aufgaben: Es speichert wichtige Informationen des Tages, vergisst unnötige Details und verbindet verschiedene Erinnerungen zu neuen Ideen.

DOA nutzt genau diese Prinzipien, um optimale Lösungen zu finden. Nach der Initialisierung wird die gesamte Population in mehrere Teams aufgeteilt. Jede Gruppe erhält ihren eigenen „Gedächtnisstil“ – von der ersten Gruppe mit dem besten Gedächtnis bis zur Gruppe mit der größten Vergesslichkeit, wobei jede Gruppe je nach Gruppennummer und Gesamtdimensionalität des Problems (D) eine unterschiedliche Anzahl von Dimensionen (k) verändert.

Während des größten Teils seiner Laufzeit befindet sich der Algorithmus in der Explorationsphase. Zunächst wendet jede Gruppe eine Gedächtnisstrategie an, bei der alle ihre Agenten an die von der Gruppe gefundene beste Position zurückgeführt werden; anschließend wird mit einer bestimmten Wahrscheinlichkeit eine Strategie des Vergessens und Hinzufügens angewendet. In diesem Fall werden „k“ zufällig ausgewählte Dimensionen mittels Kosinusmodulation gemäß der Formel cos((i+T/10)π/T) modifiziert, wodurch zu Beginn große Schritte entstehen, die dann allmählich abnehmen. Mit der verbleibenden Wahrscheinlichkeit greift die Tauschstrategie der Träume, bei der „k“ Dimensionen von einem zufällig ausgewählten Agenten aus der Population kopiert werden.

In der letzten Phase des Prozesses tritt der Algorithmus in die Exploitationsphase ein, in der alle Agenten auf die global beste Lösung zurückgesetzt werden und mit minimalen Schrittweiten eine Feinabstimmung vornehmen, dank der Kosinusfunktion cos(iπ/T), die am Ende der Optimierung gegen Null tendiert. Dadurch entsteht ein Gleichgewicht zwischen der Exploration des Suchraums durch den Gruppengedächtnis-Mechanismus und einer kurzfristigen, aber präzisen abschließenden Optimierung.

DOA

Abbildung 1. DOA-Algorithmus in Aktion

Das obige Bild zeigt das Strukturdiagramm des DOA-Algorithmus. Oben in der Mitte befindet sich eine Gedankenwolke mit der Aufschrift „Dream-Inspired Search“. Von ihr gehen drei Linien aus, die zu den drei Hauptstrategien des Algorithmus führen: Der blaue Block „Remember Best“ spiegelt die Gedächtnisstrategie wider, in der Mitte befindet sich der rosa Block „Forget Explore“, der die Strategie des Vergessens und der Exploration symbolisiert, und rechts ist der grüne Block „Share Dreams“, der die Tauschstrategie der Träume zwischen den Agenten repräsentiert.

Unterhalb dieser drei Strategien befindet sich der Abschnitt „Two Phases“, der die zeitliche Verteilung des Algorithmus als horizontalen Fortschrittsbalken darstellt, wobei der grüne Teil 99 % ausmacht und mit „Explore“ beschriftet ist, während der rote Balken auf der rechten Seite die restlichen 1 % ausmacht, wodurch das extreme Missverhältnis zwischen der Explorations- und der Exploitationsphase visuell hervorgehoben wird.

Ganz unten in der Abbildung ist die zentrale mathematische Formel des Algorithmus „Position += Random × Cosine_Wave(iteration)“ dargestellt, wodurch der technische Charakter und die Bedeutung der Kosinusmodulation für die Funktionsweise des DOA-Algorithmus hervorgehoben werden. Kommen wir nun zum Schreiben des Pseudocodes.

Initialisierung
START des DOA-Algorithmus

SETZE Parameter:
- Populationsgröße = 60 Agenten
- Anzahl der Gruppen = 6
- Explorationsanteil = 99 % der Gesamtzeit
- Vergessenswahrscheinlichkeit = 30 %

ERZEUGE 60 Agenten mit zufälligen Positionen im Suchraum
TEILE die Agenten in 6 gleich große Gruppen auf (jeweils 10)
INITIALISIERE die beste Lösung jeder Gruppe als die schlechtestmögliche
Hauptoptimierungsschleife
FÜR jede Iteration von 1 bis zum Maximum:

WENN Iteration <= 99 % der Gesamtiterationen:
FÜHRE die Explorationsphase aus
SONST:
FÜHRE die Exploitationsphase aus
Explorationsphase
FÜR jede Gruppe m von 1 bis 6:

FINDE den besten Agenten in Gruppe m
AKTUALISIERE die beste Gruppenlösung

BERECHNE die Anzahl der zu ändernden Dimensionen:
k_minimum = ceiling(D / 8 / m)
k_maximum = ceiling(D / 3 / m)
k = Zufallszahl zwischen k_minimum und k_maximum

Hinweis: Gruppe 1 ändert mehr Dimensionen (besseres Gedächtnis),
Gruppe 6 ändert weniger Dimensionen (vergisst mehr)

FÜR jeden Agenten j in Gruppe m:

SCHRITT 1 – Gedächtnisstrategie:
KOPIERE die Position des besten Agenten der Gruppe auf den aktuellen Agenten
(alle Agenten der Gruppe „erinnern“ sich an die beste gefundene Lösung)

SCHRITT 2 – Wähle k zufällige Dimensionen zur Modifikation aus

SCHRITT 3 – Vergessens- oder Tauschstrategie der Träume:

WENN Zufallszahl < 0,3 (30 % Wahrscheinlichkeit):
// Strategie des Vergessens und Hinzufügens
FÜR jede der k ausgewählten Dimensionen:
new_value = current + random × cosine_wave

wobei cosine_wave = (cos((iteration + T/10) × π / T) + 1) / 2

Hinweis: Die Kosinuswelle sorgt zu Beginn für größere Schritte,
gegen Ende der Optimierung für kleine Schritte

SONST (70 % Wahrscheinlichkeit):
// Tauschstrategie der Träume
FÜR jede der k ausgewählten Dimensionen:
KOPIERE den Wert eines zufällig ausgewählten Agenten aus der Population
(der Agent „träumt“ von der Lösung eines anderen Agenten)

PRÜFE und korrigiere die Grenzen für alle Dimensionen
Exploitationsphase
FÜR jeden Agenten j unter allen 60 Agenten:

SCHRITT 1 – Auf global beste Lösung zurücksetzen:
KOPIERE die global beste Lösung auf den aktuellen Agenten
(alle Agenten versammeln sich am gefundenen „Gipfel“)

SCHRITT 2 – Feinabstimmung:
BERECHNE die Anzahl der zu ändernden Dimensionen:
k = Zufallszahl zwischen 2 und maximum(2, ceiling(D/3))

WÄHLE k zufällige Dimensionen aus

FÜR jede der k ausgewählten Dimensionen:
new_value = current + random × cosine_wave

wobei cosine_wave = (cos(iteration × π / T) + 1) / 2

Hinweis: Am Ende des Algorithmus ist der Kosinuswert nahezu 0,
was sehr kleine Schritte ermöglicht

PRÜFE und korrigiere die Grenzen
Ergebnisse aktualisieren
NACH jeder Positionsänderung:

BERECHNE den Wert der Zielfunktion für jeden Agenten

AKTUALISIERE die global beste Lösung:
WENN eine bessere Lösung als die aktuell global beste gefunden wird:
SPEICHERE sie als neue global beste Lösung

Auch in der Explorationsphase:
AKTUALISIERE die besten Lösungen jeder Gruppe

ENDE der Iteration

Fangen wir damit an, den Code für den Algorithmus zu schreiben. Die Klasse wird den DOA-Optimierungsalgorithmus implementieren und von der Basisklasse C_AO (Schnittstelle für verschiedene Optimierungsalgorithmen) erben. Der Konstruktor und der Destruktor entsprechen dem Standard, wobei im Destruktor keine zusätzlichen Aktionen ausgeführt werden. Der Konstruktor legt die wichtigsten Parameter des Algorithmus und deren Werte fest und verknüpft sie zudem mit dem Parameterarray „params“, wodurch sich die Parameter von außen einfach verwalten lassen.

Hauptparameter
    • popSize – Populationsgröße, die Anzahl der möglichen Lösungen in jeder Iteration;
    • numGroups – Anzahl der Gruppen, in die die Population für den parallelen Informationsaustausch unterteilt wird;
    • explorationRate – Anteil der Iterationen, die der Explorationsphase zugewiesen werden, in der der Algorithmus nach neuen Bereichen des Suchraums sucht;
    • forgettingProb – Wahrscheinlichkeit, die „Vergessensstrategie“ anzuwenden, mit der sich das Feststecken in lokalen Minima vermeiden lässt.
    Methoden:
      • SetParams () – legt Klassenparameter anhand des Arrays „params“ fest;
      • Init () – Initialisierung des Algorithmus unter Angabe der Suchbereiche und der Anzahl der Epochen;
      • Moving () – führt einen Optimierungsschritt durch;
      • Revision () – überarbeitet und aktualisiert den aktuellen Zustand der Lösung.
      Interne Variablen:
        • currentIteration, totalIterations, explorationIters – Iterationszähler und Phasengrenzen;
        • groupBest [] – Array, in dem die besten Lösungen jeder Gruppe gespeichert werden, was den Informationsaustausch und die Weiterentwicklung der Lösungen erleichtert.
        Interne Methoden:
          • ExplorationPhase () – zuständig für den explorativen Suchmodus, der den Suchhorizont erweitert;
          • ExploitationPhase () – Phase, in der bereits gefundene gute Lösungen genutzt werden, um sie weiter zu verbessern;
          • UpdateGroupBest () – aktualisiert die beste Lösung in einer bestimmten Gruppe;
          • GetGroupStartIndex (), GetGroupEndIndex () – dienen zur Ermittlung der Bereiche der Lösungsindizes innerhalb jeder Gruppe.

          Diese Klasse implementiert den DOA-Algorithmus, bei dem die Population in eine feste Anzahl von Gruppen aufgeteilt wird. Während der Iterationen teilt der Algorithmus seine Zeit zwischen der Explorationsphase (Suche nach neuen Lösungen) und der Exploitationsphase (Verbesserung der bereits gefundenen besten Lösungen) auf. Die Vergessensstrategie ermöglicht es dem Algorithmus, lokale Optima zu vermeiden. Der Grundgedanke besteht darin, ein Gleichgewicht zwischen der Exploration neuer Bereiche und der sorgfältigen Verbesserung bereits gefundener Lösungen sicherzustellen, was eine effektive globale Optimierung fördert.

          //————————————————————————————————————————————————————————————————————
          class C_AO_DOA_dream : public C_AO
          {
            public: //----------------------------------------------------------
            ~C_AO_DOA_dream () { }
            C_AO_DOA_dream ()
            {
              ao_name = "DOA";
              ao_desc = "Dream Optimization Algorithm";
              ao_link = "https://www.mql5.com/en/articles/19177";
          
              popSize              = 60;    // population size
              numGroups            = 6;     // number of groups (fixed in the original)
              explorationRate      = 0.99;  // iteration rate for the exploration phase (9/10 in the original)
              forgettingProb       = 0.3;   // probability of using the main forgetting strategy
          
              ArrayResize (params, 4);
          
              params [0].name = "popSize";           params [0].val = popSize;
              params [1].name = "numGroups";         params [1].val = numGroups;
              params [2].name = "explorationRate";   params [2].val = explorationRate;
              params [3].name = "forgettingProb";    params [3].val = forgettingProb;
            }
          
            void SetParams ()
            {
              popSize          = (int)params [0].val;
              numGroups        = (int)params [1].val;
              explorationRate  = params      [2].val;
              forgettingProb   = params      [3].val;
            }
          
            bool Init (const double &rangeMinP  [],
                       const double &rangeMaxP  [],
                       const double &rangeStepP [],
                       const int     epochsP = 0);
          
            void Moving   ();
            void Revision ();
          
            //------------------------------------------------------------------
            int    numGroups;         // number of groups
            double explorationRate;   // iteration rate for the exploration phase
            double forgettingProb;    // probability of applying the main strategy
          
            private: //---------------------------------------------------------
            int    currentIteration;  // current iteration
            int    totalIterations;   // total number of iterations
            int    explorationIters;  // number of exploration iterations
          
            S_AO_Agent groupBest [];  // best solutions in each group
          
            void   ExplorationPhase      ();
            void   ExploitationPhase     ();
            void   UpdateGroupBest       (int groupNum);
            int    GetGroupStartIndex    (int groupNum);
            int    GetGroupEndIndex      (int groupNum);
          };
          //————————————————————————————————————————————————————————————————————
          

          Die Initialisierungsmethode der Klasse C_AO_DOA_dream führt vorbereitende Operationen aus, um den Optimierungsalgorithmus zu starten. Sie legt die Anfangsparameter fest und richtet die für weitere Iterationen erforderlichen internen Zustände ein.

          Zunächst wird eine allgemeine Initialisierungsmethode aufgerufen, die die Suchbereiche und Schrittweiten überprüft und festlegt, um sicherzustellen, dass die Parameter korrekt eingestellt sind. Sollte diese Überprüfung oder Konfiguration fehlschlagen, wird die Initialisierung abgebrochen.

          Anschließend werden die Zähler gesetzt: Die aktuelle Iteration wird auf „0“ zurückgesetzt, die Gesamtzahl der Iterationen wird aus den übergebenen Parametern festgelegt, und die Anzahl der für die Exploration vorgesehenen Iterationen wird als Bruchteil der Gesamtzahl berechnet, wobei der angegebene Anteil (explorationRate) berücksichtigt wird.

          Anschließend wird ein Array mit den besten Gruppenlösungen (groupBest) initialisiert, dessen Größe der Anzahl der Gruppen entspricht. Für jede Gruppe wird mithilfe der Methode Init eine Anfangslösung erstellt, und der Wert der Qualitätsfunktion dieser Lösung wird auf den kleinstmöglichen Zahlenwert gesetzt, um künftig einen korrekten Vergleich und eine korrekte Aktualisierung zu gewährleisten.

          Nach der Ausführung dieser Methode ist der Algorithmus somit bereit, die Optimierung mit den festgelegten Parametern, Zählern und anfänglichen Gruppenlösungen zu starten.

          //————————————————————————————————————————————————————————————————————
          //--- Initialization
          bool C_AO_DOA_dream::Init (const double &rangeMinP  [],
                                     const double &rangeMaxP  [],
                                     const double &rangeStepP [],
                                     const int     epochsP = 0)
          {
            if (!StandardInit (rangeMinP, rangeMaxP, rangeStepP)) return false;
          
            //------------------------------------------------------------------
            currentIteration = 0;
            totalIterations  = epochsP;
            explorationIters = (int)(totalIterations * explorationRate);
          
            ArrayResize (groupBest, numGroups);
            for (int i = 0; i < numGroups; i++)
            {
              groupBest [i].Init (coords);
              groupBest [i].f = -DBL_MAX; // Initialize with the worst value
            }
          
            return true;
          }
          //————————————————————————————————————————————————————————————————————
          
          

          Die Methode Moving ist der Hauptiterationsschritt des DOA-Algorithmus. Sie implementiert die Logik des Fortschritts des Algorithmus von einer Iteration zur nächsten. Zunächst wird der Zähler currentIteration erhöht, um den Fortschritt des Algorithmus zu verfolgen.

          Erstinitialisierung (nur beim ersten Durchlauf). Das Flag „revision“ wird geprüft; ist es „false“ (d. h., der Algorithmus wird zum ersten Mal ausgeführt), wird die Population initialisiert; anschließend wird für jeden Agenten in der Population und für jede Koordinate des Agenten Folgendes ausgeführt:

          • ein zufälliger Koordinatenwert wird mithilfe der Funktion u.RNDfromCI() innerhalb des vorgegebenen Bereichs (rangeMin und rangeMax) generiert;
          • unter Berücksichtigung der Schrittweite (rangeStep) wird mithilfe der Funktion u.SeInDiSp() eine Anpassung dieses Werts vorgenommen; dadurch wird der Wert auf den nächstgelegenen zulässigen Wert (ein Vielfaches der Schrittweite) gebracht;
          • nach der Initialisierung wird das Flag „revision“ auf „true“ gesetzt, um eine erneute Initialisierung in künftigen Iterationen zu vermeiden;
          • an dieser Stelle schließt die Methode ihre Ausführung ab.
          Bestimmung der Algorithmusphase (nach der Initialisierung):
          • es wird geprüft, ob sich die aktuelle Iteration in der Explorationsphase befindet (currentIteration <= explorationIters);
          • Befindet sich die Iteration in der Explorationsphase, wird die Methode ExplorationPhase() aufgerufen;
          • Andernfalls (wenn sich die Iteration in der Exploitationsphase befindet) wird die Methode ExploitationPhase() aufgerufen.

            Somit steuert die Methode Moving den Optimierungsprozess, indem sie eine Initialisierung der Anfangspopulation vornimmt und anschließend anhand eines Iterationszählers zwischen der Explorations- und der Exploitationsphase wechselt. Die Initialisierung erfolgt nur einmal; danach durchläuft der Algorithmus eine Schleife, die bestimmt, welche Phase in der aktuellen Iteration ausgeführt werden soll.

            //————————————————————————————————————————————————————————————————————
            //--- The main step of the algorithm
            void C_AO_DOA_dream::Moving ()
            {
              currentIteration++;
            
              // Initial population setup
              if (!revision)
              {
                for (int i = 0; i < popSize; i++)
                {
                  for (int j = 0; j < coords; j++)
                  {
                    a [i].c [j] = u.RNDfromCI (rangeMin [j], rangeMax [j]);
                    a [i].c [j] = u.SeInDiSp (a [i].c [j], rangeMin [j], rangeMax [j], rangeStep [j]);
                  }
                }
            
                revision = true;
                return;
              }
            
              //------------------------------------------------------------------
              // Determine the phase of the algorithm
              if (currentIteration <= explorationIters)
              {
                ExplorationPhase ();
              }
              else
              {
                ExploitationPhase ();
              }
            }
            //————————————————————————————————————————————————————————————————————
            

            Die Methode ExplorationPhase implementiert die Explorationsphase des DOA-Algorithmus. In dieser Phase werden die Lösungen für die Agentengruppen aktualisiert und diversifiziert, um neue mögliche Bereiche des Suchraums zu erschließen. Für jede Gruppe von Agenten wird die beste Lösung innerhalb der Gruppe aktualisiert, um das aktuell beste gefundene Ergebnis widerzuspiegeln. Anschließend wird die Anzahl der Dimensionen (Dimensionalität) für die Vergessensprozedur auf Grundlage der aktuellen Gruppennummer und der Gesamtzahl der Koordinaten bestimmt. Für jede Gruppe werden die Indizes des ersten und des letzten darin enthaltenen Agenten berechnet.

            Anschließend wird für jeden Agenten innerhalb der Gruppe die beste Lösung der gesamten Gruppe in die aktuelle Lösung des Agenten kopiert (die Gedächtnisstrategie), wodurch eine „alte“, bewährte Lösung als Rückfalloption zur Verfügung steht. Es wird eine Liste von Dimensionen (Koordinaten) erstellt, die der Operation des „Vergessens“ und „Hinzufügens“ unterzogen werden. Das Array der Dimensionen wird gemischt, um zufällig auszuwählen, welche davon geändert werden sollen.

            Für jeden Agenten in der Gruppe wird mit einer durch den Parameter forgettingProb festgelegten Wahrscheinlichkeit eine Strategie zur Aktualisierung der ausgewählten Dimensionen bestimmt; dabei kommt eine Vergessensstrategie mit Kosinusmodulation zum Einsatz.

            Für die ausgewählten Dimensionen wird ein zufälliger Versatz innerhalb des Bereichs generiert. Die Kosinusmodulation hängt von der aktuellen Iteration und der Gesamtzahl der Iterationen ab, wodurch sich der Grad der Veränderung im Zeitverlauf steuern lässt. Nach der Aktualisierung wird der Dimensionswert unter Berücksichtigung der Schrittweiten in einen gültigen Bereich gebracht. Oder, falls das Szenario „Vergessen“ nicht ausgewählt wird, kommt die Tauschstrategie der Träume zur Anwendung. Die Dimensionswerte werden von einem zufällig ausgewählten anderen Agenten übernommen, was bedeutet, dass zwischen den Agenten Informationen ausgetauscht werden.

            Dadurch fördert diese Phase die Exploration des Suchraums, erhöht die Vielfalt der Lösungen und trägt durch zufällige Änderungen und den Informationsaustausch zwischen den Agenten dazu bei, lokale Fallen zu vermeiden.

            //————————————————————————————————————————————————————————————————————
            //--- Exploration phase
            void C_AO_DOA_dream::ExplorationPhase ()
            {
              // Handle each group
              for (int m = 0; m < numGroups; m++)
              {
                // Update the best solution in the group
                UpdateGroupBest (m);
            
                // Calculate the number of dimensions to forget
                int kMin = (int)MathCeil ((double)coords / 8.0 / (m + 1));
                int kMax = (int)MathCeil ((double)coords / 3.0 / (m + 1));
                int k    = u.RNDintInRange (kMin, kMax);
            
                // Handle agents in the group
                int startIdx = GetGroupStartIndex (m);
                int endIdx   = GetGroupEndIndex   (m);
            
                for (int j = startIdx; j <= endIdx; j++)
                {
                  // Memory strategy - reset to the best group solution
                  ArrayCopy (a [j].c, groupBest [m].c, 0, 0, WHOLE_ARRAY);
            
                  // Select random dimensions to forget
                  int dims [];
                  ArrayResize (dims, coords);
                  for (int i = 0; i < coords; i++) dims [i] = i;
            
                  // Shuffle the array of dimensions
                  for (int i = coords - 1; i > 0; i--)
                  {
                    int idx    = u.RNDintInRange (0, i);
                    int temp   = dims [i];
                    dims [i]   = dims [idx];
                    dims [idx] = temp;
                  }
            
                  // Strategy of forgetting and replenishment
                  if (u.RNDprobab () < forgettingProb)
                  {
                    // Basic strategy with cosine modulation
                    for (int h = 0; h < k; h++)
                    {
                      int    dim              = dims [h];
                      double range            = rangeMax [dim] - rangeMin [dim];
                      double randomValue      = u.RNDprobab () * range + rangeMin [dim];
                      double cosineModulation = (MathCos ((1.0 * currentIteration + totalIterations / 10.0) * M_PI / totalIterations) + 1.0) / 2.0;
            
                      a [j].c [dim] = a [j].c [dim] + randomValue * cosineModulation;
                      a [j].c [dim] = u.SeInDiSp (a [j].c [dim], rangeMin [dim], rangeMax [dim], rangeStep [dim]);
                    }
                  }
                  else
                  {
                    // Dream sharing - copying from a random agent
                    for (int h = 0; h < k; h++)
                    {
                      int dim   = dims [h];
                      int donor = u.RNDintInRange (0, popSize - 1);
                      a [j].c [dim] = a [donor].c [dim];
                    }
                  }
                }
              }
            }
            //————————————————————————————————————————————————————————————————————
            

            Die Methode ExploitationPhase implementiert die Exploitationsphase des Optimierungsalgorithmus. Ihre Hauptaufgabe besteht darin, die Suche auf die beste gefundene Lösung auszurichten, um die aktuellen Ergebnisse zu verbessern.

            Für jeden Agenten in der Population wird die Lösung des Agenten auf die bisher gefundene global beste Lösung zurückgesetzt, wodurch man sich auf die vielversprechendsten Bereiche des Suchraums konzentrieren kann. Als Nächstes wird die Anzahl der zu verändernden Dimensionen (Dimensionalität) festgelegt. In der Regel werden mindestens zwei und höchstens ein bestimmter Höchstwert ausgewählt, der sich nach der Anzahl der Koordinaten richtet. Es wird eine Liste aller Dimensionen (Koordinaten) erstellt und anschließend zufällig durchmischt, um auszuwählen, welche davon geändert werden sollen. Für jede ausgewählte Dimension:

            • der Variationsbereich dieser Dimension wird berechnet;
            • ein Zufallswert wird innerhalb dieses Bereichs generiert;
            • dieser Wert wird mithilfe einer Kosinusfunktion moduliert, die von der aktuellen Iterationsnummer und der Gesamtzahl der Iterationen abhängt, wodurch sich der Einfluss der Änderungen im Zeitverlauf steuern lässt;
            • infolgedessen ändert sich der Dimensionswert unter Berücksichtigung des generierten Werts und der Kosinusmodulation;
            • anschließend wird der Wert unter Berücksichtigung der Diskretisierungsschrittweite in den zulässigen Bereich gebracht, damit die Lösung gültig bleibt.

            Das Ziel dieser Methode besteht darin, die bereits gefundenen guten Lösungen durch zufällige und kontrollierte Modifikationen weiter zu verfeinern, wodurch ein günstigerer Bereich des Suchraums erreicht und bessere Lösungen erzielt werden können.

            //————————————————————————————————————————————————————————————————————
            //--- Exploitation phase
            void C_AO_DOA_dream::ExploitationPhase ()
            {
              // In the exploitation phase, all agents move towards the global best
              for (int j = 0; j < popSize; j++)
              {
                // Reset to global best solution
                ArrayCopy (a [j].c, cB, 0, 0, WHOLE_ARRAY);
            
                // Calculate the number of dimensions to modify
                int km = MathMax (2, (int)MathCeil ((double)coords / 3.0));
                int k = u.RNDintInRange (2, km);
            
                // Select random dimensions
                int dims [];
                ArrayResize (dims, coords);
                for (int i = 0; i < coords; i++) dims [i] = i;
            
                // Shuffle the array of dimensions
                for (int i = coords - 1; i > 0; i--)
                {
                  int idx = u.RNDintInRange (0, i);
                  int temp = dims [i];
                  dims [i] = dims [idx];
                  dims [idx] = temp;
                }
            
                // Apply the forgetting and addition strategy
                for (int h = 0; h < k; h++)
                {
                  int dim = dims [h];
                  double range = rangeMax [dim] - rangeMin [dim];
            
                  double randomValue = u.RNDprobab () * range + rangeMin [dim];
                  double cosineModulation = (MathCos (currentIteration * M_PI / totalIterations) + 1.0) / 2.0;
            
                  a [j].c [dim] = a [j].c [dim] + randomValue * cosineModulation;
                  a [j].c [dim] = u.SeInDiSp (a [j].c [dim], rangeMin [dim], rangeMax [dim], rangeStep [dim]);
                }
              }
            }
            //————————————————————————————————————————————————————————————————————
            

            Die Methode „UpdateGroupBest“ dient dazu, die beste Lösung innerhalb einer bestimmten Gruppe von Agenten zu ermitteln. Ihre wichtigsten Schritte sind:

            1. Ermittlung der Indizes der Start- und Endpositionen der Agenten, die zu einer bestimmten Gruppe gehören;
            2. Durchlaufen aller Agenten in der angegebenen Gruppe;
            3. Für jeden Agenten wird der Wert der Bewertungsfunktion (die Metrik für die Lösungsqualität) mit dem aktuell besten Wert verglichen, der für die Gruppe gespeichert ist;
            4. Wenn ein Agent eine Lösung mit dem besten Wert der Fitnessfunktion findet, aktualisiert er den Eintrag der besten Lösung in der Gruppe und ersetzt ihn durch die beste Lösung.

            Somit liefert die Methode aktuelle Informationen über die beste Lösung innerhalb jeder Gruppe, was für weitere Schritte des Algorithmus, wie beispielsweise die Suchstrategie und die Aktualisierung von Lösungen, von Bedeutung ist.

            //————————————————————————————————————————————————————————————————————
            //--- Update the best solution in the group
            void C_AO_DOA_dream::UpdateGroupBest (int groupNum)
            {
              int startIdx = GetGroupStartIndex (groupNum);
              int endIdx   = GetGroupEndIndex (groupNum);
            
              for (int i = startIdx; i <= endIdx; i++)
              {
                if (a [i].f > groupBest [groupNum].f)
                {
                  groupBest [groupNum].f = a [i].f;
                  ArrayCopy (groupBest [groupNum].c, a [i].c, 0, 0, WHOLE_ARRAY);
                }
              }
            }
            //————————————————————————————————————————————————————————————————————
            

            Die Methode „GetGroupStartIndex“ dient zur Berechnung des Startindexes der Elemente, die in der angegebenen Gruppe im Array der Lösungen oder Agenten enthalten sind. Sie basiert auf Berechnungen, bei denen von einer gleichmäßigen Verteilung der Gruppen über das gesamte Array ausgegangen wird. Die Grundidee besteht darin, die Position des ersten Agenten (bzw. Elements) in einer bestimmten Gruppe anhand der Gruppennummer, der Gesamtzahl der Gruppen und der Gesamtgröße der Population zu bestimmen.

            Dazu wird die Gruppennummer mit der Gesamtgröße der Population multipliziert und durch die Anzahl der Gruppen dividiert, wodurch sich der Index des ersten Elements innerhalb einer bestimmten Gruppe ergibt. Dieser Ansatz gewährleistet eine gleichmäßige Aufteilung der Daten in Gruppen und eignet sich gut für weitere Operationen im Zusammenhang mit der Gruppierung von Lösungen.

            //————————————————————————————————————————————————————————————————————
            //--- Get the starting index of the group
            int C_AO_DOA_dream::GetGroupStartIndex (int groupNum)
            {
              return (int)((double)groupNum * popSize / numGroups);
            }
            //————————————————————————————————————————————————————————————————————
            

            Die Methode GetGroupEndIndex berechnet den Endindex der Elemente, die zur angegebenen Gruppe gehören. Sie ermittelt das letzte Element einer Gruppe anhand der Gruppennummer, der Gesamtgröße der Population und der Anzahl der Gruppen. Die Berechnung erfolgt, indem die um eins erhöhte Gruppennummer mit der Gesamtgröße der Population multipliziert und durch die Anzahl der Gruppen dividiert wird. Der resultierende Wert wird anschließend um eins verringert, um den Index des letzten Elements in der Gruppe zu ermitteln.

            Es ist eine zusätzliche Prüfung erforderlich, um einen Zugriff außerhalb der Array-Grenzen zu verhindern: Wenn der berechnete Index die Größe der Population überschreitet, wird er auf den Wert des letzten gültigen Index gesetzt. Dieser Ansatz stellt sicher, dass die Grenzen jeder Agentengruppe in der Population korrekt definiert sind.

            //————————————————————————————————————————————————————————————————————
            //--- Get the ending index of the group
            int C_AO_DOA_dream::GetGroupEndIndex (int groupNum)
            {
              int endIdx = (int)((double)(groupNum + 1) * popSize / numGroups) - 1;
              if (endIdx >= popSize) endIdx = popSize - 1;
              return endIdx;
            }
            //————————————————————————————————————————————————————————————————————
            

            Die Methode Revision dient dazu, Informationen über die beste Lösung zu aktualisieren, die während des Algorithmuslaufs gefunden wurde. Zunächst durchläuft sie alle Lösungen der aktuellen Population. Innerhalb der Schleife wird für jede Lösung der Wert ihrer Zielfunktion überprüft. Ist dieser Wert größer als der aktuelle Bestwert, wird fB auf den Wert der Zielfunktion der aktuellen Lösung aktualisiert, und die aktuelle Lösung wird zur besten Lösung.

            Die Methode prüft anschließend, ob die aktuelle Iteration in der Explorationsphase (explorationIters) liegt; ist dies der Fall, berücksichtigt die Methode neben der Aktualisierung der global besten Lösung auch die besten Lösungen, die innerhalb jeder Gruppe gefunden wurden. Dazu durchläuft die Schleife alle Gruppen, und für jede Gruppe wird der Wert der Zielfunktion der besten Lösung in dieser Gruppe mit dem aktuellen Bestwert verglichen.

            Ist die Lösung innerhalb der Gruppe besser, wird fB aktualisiert und die Lösung aus groupBest in den globalen Puffer cB kopiert. Somit überwacht und aktualisiert die Methode Revision kontinuierlich die Informationen über die beste gefundene Lösung in Abhängigkeit von der aktuellen Phase des Algorithmus (Exploration oder Exploitation) und stellt so sicher, dass die zum aktuellen Zeitpunkt beste gefundene Lösung erhalten bleibt.

            //————————————————————————————————————————————————————————————————————
            //--- Update the best and worst solutions
            void C_AO_DOA_dream::Revision ()
            {
              // Update the global best solution
              for (int i = 0; i < popSize; i++)
              {
                if (a [i].f > fB)
                {
                  fB = a [i].f;
                  ArrayCopy (cB, a [i].c, 0, 0, WHOLE_ARRAY);
                }
              }
            
              // Update the best solutions of groups in the exploration phase
              if (currentIteration <= explorationIters)
              {
                for (int m = 0; m < numGroups; m++)
                {
                  if (groupBest [m].f > fB)
                  {
                    fB = groupBest [m].f;
                    ArrayCopy (cB, groupBest [m].c, 0, 0, WHOLE_ARRAY);
                  }
                }
              }
            }
            //————————————————————————————————————————————————————————————————————
            


            Testergebnisse

            Nachdem wir nun den DOA-Algorithmus implementiert haben, können wir direkt mit dem Testen anhand von Testfunktionen fortfahren. Wie Sie sehen können, erzielte der DOA-Algorithmus 53,62 % und wird in unsere Bewertungstabelle aufgenommen.

            DOA|Dream Optimization Algorithm|60.0|6.0|0.99|0.3|
            =============================
            5 Hilly's; Func runs: 10000; result: 0.8555594031110225
            25 Hilly's; Func runs: 10000; result: 0.7008493263471764
            500 Hilly's; Func runs: 10000; result: 0.37279821121874124
            =============================
            5 Forest's; Func runs: 10000; result: 0.7342194493052585
            25 Forest's; Func runs: 10000; result: 0.48905397049976357
            500 Forest's; Func runs: 10000; result: 0.24146681094197792
            =============================
            5 Megacity's; Func runs: 10000; result: 0.7723076923076921
            25 Megacity's; Func runs: 10000; result: 0.4735384615384616
            500 Megacity's; Func runs: 10000; result: 0.18561538461538593
            =============================
            All score: 4.82541 (53.62%)

            Die Visualisierung der Performance des DOA-Algorithmus bei kleinen Dimensionen (grüne Linien) zeigt eine Streuung der Ergebnisse, insbesondere bei den Funktionen „Forest“ und „Megacity“.

            Hilly

            DOA mit der Testfunktion Hilly

            Forest

            DOA mit der Testfunktion Forest

            Megacity

            DOA mit der Testfunktion Megacity

            Auf Grundlage der Testergebnisse belegt der DOA-Algorithmus Platz 26 in der Gesamtwertung der populationsbasierten Optimierungsalgorithmen.

            #AOBeschreibungHillyHilly
            Final
            ForestForest
            Final
            Megacity (diskret)Megacity
            Final
            Final
            Result
            % von
            MAX
            10 p (5 F)50 p (25 F)1000 p (500 F)10 p (5 F)50 p (25 F)1000 p (500 F)10 p (5 F)50 p (25 F)1000 p (500 F)
            1ANSnachbarschaftsübergreifende Suche0,949480,847760,438572,235811,000000,923340,399882,323230,709230,634770,230911,574916,13468,15
            2CLACodeschloss-Algorithmus (joo)0,953450,871070,375902.200420,989420,917090,316422,222940,796920,693850,193031,683806.10767,86
            3AMOmOptimierung der Tiermigration M0,903580,843170,462842,209590,990010,924360,465982,380340,567690,591320,237731,396755,98766,52
            4(P+O)ES(P+O)-Evolutionsstrategien0,922560,881010,400212,203790,977500,874900,319452,171850,673850,629850,186341,490035,86665,17
            5CTAKometenschweif-Algorithmus (joo)0,953460,863190,277702,094350,997940,857400,339492,194840,887690,564310,105121,557125.84664,96
            6TETAAlgorithmus der zeitlichen Entwicklung und Bewegung (joo)0,913620,823490,319902,057010,970960,895320,293242,159520,734620,685690,160211,580525.79764,41
            7SDSmStochastische Diffusionssuche M0,930660,854450,394762,179880,999830,892440,196192,088460,723330,611000,106701,441035,70963,44
            8BOAmBillard-Optimierungsalgorithmus M0,957570,825990,252352,035901,000000,900360,305022,205380,735380,525230,095631,356255,59862,19
            9AAmBogenschieß-Algorithmus M0,917440,708760,421602,047800,925270,758020,353282,036570,673850,552000,237381,463235.54861,64
            10ESGEntwicklung sozialer Gruppen (joo)0,999060,796540,350562,146161,000000,828630,131021,959650,823330,553000,047251,423585,52961,44
            11SIAsimuliertes isotropes Tempern (joo)0,957840,842640,414652,215130,982390,795860,205071,983320,686670,493000,090531,270205,46960,76
            12EOmextremal_optimization_M0,761660,772420,317471,851550,999990,767510,235272,002770,747690,539690,142491,429875,28458,71
            13BBObiogeografiebasierte Optimierung0,949120,694560,350311,993990,938200,673650,256821,868670,746150,482770,173691,402615,26558,50
            14ACSkünstliche kooperative Suche0,755470,747440,304071,806981,000000,888610,224132,112740,690770,481850,133221,305835,22658,06
            15DAdialektischer Algorithmus0,861830,700330,337241,899400,981630,727720,287181,996530,703080,452920,163671,319675,21657,95
            16BHAmBlack-Hole-Algorithmus M0,752360,766750,345831,864930,935930,801520,271772,009230,650770,516460,154721,321955,19657,73
            17ASOAnarchy-Society-Optimierung0,848720,746460,314651,909830,961480,791500,238031,991010,570770,540620,166141,277525,17857,54
            18RFORoyal-Flush-Optimierung (joo)0,833610,737420,346291,917330,894240,738240,240981,873460,631540,502920,164211,298675,08956,55
            19AOSmAtomorbital-Suche M0,802320,704490,310211,817020,856600,694510,219961,771070,746150,528620,143581,418355,00655,63
            20TSEATurtle-Shell-Evolution-Algorithmus (joo)0,967980,644800,296721,909490,994490,619810,227081,841390,690770,426460,135981,253225,00455,60
            21BSAbacktracking_search_algorithm0,973090,545340,290981,809410,999990,585430,217471,802890,847690,369530,129781,347004.95955,10
            22DEDifferential Evolution0,950440,616740,303081,870260,953170,788960,166521,908650,786670,360330,029531,176534,95555,06
            23SRASuccessful Restaurateur Algorithm (joo)0,968830,634550,292171,895550,946370,555060,191241,692670,749230,440310,125261,314804,90354,48
            24CROChemical Reaction Optimization0,946290,661120,298531,905930,879060,584220,211461,674730,758460,426460,126861,311784.89254,36
            25BIOBlood Inheritance Optimization (joo)0,815680,653360,308771,777810,899370,653190,217601,770160,678460,476310,139021,293784,84253,80
            26DOAdream_optimization_algorithm0,855560,700850,372801,929210,734210,489050,241471,464730,772310,473540,185611,431464,82553,62
            27BSABird Swarm Algorithm0,893060,649000,262501,804550,924200,711210,249391,884790,693850,326150,100121.120124,80953,44
            28DEAdolphin_echolocation_algorithm0,759950,675720,341711,777380,895820,642230,239411,777460,615380,440310,151151,206844.76252,91
            29HSHarmony Search0,865090,687820,325271,878180,999990,680020,095901,775920,620000,422670,054581,097254,75152,79
            30SSGSaplings Sowing and Growing0,778390,649250,395431,823080,859730,624670,174291,658690,646670,441330,105981,193984,67651,95
            31BCOmBacterial Chemotaxis Optimization M0,759530,622680,314831,697040,893780,613390,225421,732590,653850,420920,144351,219124.64951,65
            32ABOAfrican Buffalo Optimization0,833370,622470,299641,755480,921700,586180,197231,705110,610000,431540,132251,173784,63451,49
            33(PO)ES(PO)-Evolutionsstrategien0,790250,626470,429351,846060,876160,609430,195911,681510,590000,379330,113221,082554.61051,22
            34FBAFraktalbasierter Algorithmus0,790000,651340,289651,730990,871580,568230,188771,628580,610770,460620,123981,195374,55550,61
            35TSmTabu-Suche M0,877950,614310,291041,783300,928850,518440,190541,637830,610770,382150,121571,114494.53650,40
            36BSOBrainstorm-Optimierung0,937360,576160,296881,810410,931310,558660,235371,725340,552310,290770,119140,962224,49849,98
            37WOAmWal-Optimierungsalgorithmus M0,845210,562980,262631,670810,931000,522780,163651,617430,663080,411380,113571,188034,47649,74
            38AEFAAlgorithmus künstlicher elektrischer Felder0,877000,617530,252351,746880,927290,726980,180641,834900,666150,116310,095080,877544.45949,55
            39AEOOptimierungsalgorithmus auf Basis künstlicher Ökosysteme0,913800,467130,264701,645630,902230,437050,214001,553270,661540,308000,285631,255174,45449,49
            40CAmKamel-Algorithmus M0,786840,560420,351331,698590,827720,560410,243361,631490,648460,330920,134181,113564,44449,37
            41ACOmAmeisenkolonie-Optimierung M0,881900,661270,303771,846930,858730,586800,150511,596040,596670,373330,024720,994724,43849,31
            42CMAESKovarianzmatrix-Adaptions-Evolutionsstrategie0,762580,720890,000001,483470,820560,796160,000001,616720,758460,490770,000001,249234,34948,33
            43DA_duelistduelist_algorithm0,927820,537780,277921,743520,869570,475360,181931,526860,621530,335690,117151,074374,34548,28
            44BFO-GABacterial Foraging Optimization - GA0,891500,551110,315291,757900,969820,396120,063051,428990,726670,275000,035251,036924,22446,93
            45SOAeinfacher Optimierungsalgorithmus0,915200,469760,270891,655850,896750,374010,169841,440600,695380,280310,108521,084224,18146,45
            RWRandom Walk0,487540,321590,257811,066940,375540,219440,158770,753750,279690,149170,098470,527342,34826.09


            Zusammenfassung

            Der Dream Optimization Algorithm (DOA) zeigt eine angemessene Leistung: In den durchgeführten Tests erreichte er 53,62 % von möglichen 100 % und sicherte sich damit einen Platz in unserer Rangliste.

            Die Analyse der Ergebnisse zeigt ein Muster, das für viele metaheuristische Algorithmen charakteristisch ist: einen deutlichen Leistungsabfall bei zunehmender Dimensionalität des Problems. Bei niedrigdimensionalen Problemen erzielt DOA Ergebnisse im Bereich von 73–86 %, doch beim Übergang zu hochdimensionalen Problemen sinkt die Effizienz innerhalb einer begrenzten Anzahl von Iterationen auf 18–37 %.

            Insgesamt liegt der Algorithmus im Mittelfeld der untersuchten Optimierungsmethoden. Interessierte können mit den Algorithmuseinstellungen experimentieren; vielleicht gibt es noch Potenzial, bessere Ergebnisse zu erzielen.

            Registerkarte

            Abbildung 2. Farbabstufung der Algorithmen über die entsprechenden Tests hinweg

            Diagramm

            Abbildung 3. Histogramm der Testergebnisse des Algorithmus (Skala von 0 bis 100, je höher, desto besser; wobei 100 das maximal mögliche theoretische Ergebnis darstellt; im Archiv befindet sich ein Skript zur Berechnung der Bewertungstabelle)

            Vor- und Nachteile des DOA:

            Vorteile:

            1. Einfache Umsetzung.
            2. Schnell.

            Nachteile:

            1. Hohe Varianz bei niedrigdimensionalen Testfunktionen.

            Dem Artikel ist ein Archiv mit den neuesten Versionen des Algorithmuscodes beigefügt. Der Autor des Artikels übernimmt keine Gewähr für die absolute Richtigkeit der Beschreibung der kanonischen Algorithmen. An vielen von ihnen wurden Änderungen vorgenommen, um die Suchfähigkeiten zu verbessern. Die in den Artikeln dargelegten Schlussfolgerungen und Einschätzungen basieren auf den Ergebnissen der Experimente.


            Im Artikel verwendete Programme

            #NameTypBeschreibung
            1#C_AO.mqh
            Include
            Basisklasse für populationsbasierte Optimierungsalgorithmen
            2#C_AO_enum.mqh
            Include
            Enumeration populationsbasierter Optimierungsalgorithmen
            3TestFunctions.mqh
            Include
            Bibliothek mit Testfunktionen
            4
            TestStandFunctions.mqh
            Include
            Funktionsbibliothek für den Teststand
            5
            Utilities.mqh
            Include
            Bibliothek mit Hilfsfunktionen
            6
            CalculationTestResults.mqh
            Include
            Skript zur Berechnung der Ergebnisse in der Vergleichstabelle
            7
            Testing AOs.mq5
            SkriptDer einheitliche Teststand für alle populationsbasierten Optimierungsalgorithmen
            8
            Simple use of population optimization algorithms.mq5
            Skript
            Ein einfaches Beispiel für die Verwendung populationsbasierter Optimierungsalgorithmen ohne Visualisierung
            9
            Test_AO_DOA.mq5
            SkriptDOA-Teststand

            Übersetzt aus dem Russischen von MetaQuotes Ltd.
            Originalartikel: https://www.mql5.com/ru/articles/19177

            Beigefügte Dateien |
            DOArdream9.zip (265.3 KB)
            Letzte Kommentare | Zur Diskussion im Händlerforum (1)
            Chacha Ian Maroa
            Chacha Ian Maroa | 2 Juli 2026 in 20:03
            Wow! Ich kann es kaum erwarten, den „Andromeda Galaxy Spinning Algo“ zu sehen!!
            Marktsimulation: Positionsanzeige (VII) Marktsimulation: Positionsanzeige (VII)
            In diesem Artikel beginnen wir damit, den Positionsindikator zu verbessern, damit wir mit ihm interagieren und Preislinien ändern oder eine Position direkt über den Positionsindikator schließen können. Bevor wir zur Umsetzung übergehen, gibt es ein paar Dinge, die es zu klären gilt, insbesondere für diejenigen, die sich damit noch nicht auskennen. Der Indikator kann in keiner Weise dazu verwendet werden, irgendetwas auf dem Handelsserver zu ändern. Das liegt daran, dass MetaTrader 5 über ein Sicherheitssystem verfügt, das es ausschließlich Expert Advisors erlaubt, Aufträge (Orders) und Positionen zu ändern. Außer einem Expert Advisor kann keine andere Anwendung Aufträge oder Positionen ändern.
            Neuronale Netze im Trading: Das Temporal-Query-Modell (Fazit) Neuronale Netze im Trading: Das Temporal-Query-Modell (Fazit)
            Wir freuen uns, Ihnen die abschließende Phase der Entwicklung und des Testens des TQNet-Frameworks vorstellen zu dürfen, in der die Theorie auf die reale Trading-Praxis trifft. Wir werden vom historischen Training zu einem Stresstest mit aktuellen Marktdaten übergehen, um die Robustheit und Genauigkeit des Modells zu bewerten. Die Endergebnisse sind nicht nur trockene Statistiken, sondern auch eine klare Demonstration des praktischen Nutzens des vorgeschlagenen Ansatzes.
            Neuronale Netze im Trading: Heterogenitätsbasiertes Lernen von Metaparametern (HimNet) Neuronale Netze im Trading: Heterogenitätsbasiertes Lernen von Metaparametern (HimNet)
            Wir laden Sie ein, das HimNet-Framework kennenzulernen, das die Flexibilität der räumlich-zeitlichen Anpassung mit hoher Recheneffizienz verbindet und so genaue und stabile Prognosen für finanzielle Zeitreihen ermöglicht. Der Artikel erläutert ausführlich, wie dessen wichtigste Komponenten miteinander interagieren und komplexe Algorithmen in eine handhabbare Architektur überführen.
            Neuronale Netze im Trading: Das Temporal-Query-Modell (TQNet) Neuronale Netze im Trading: Das Temporal-Query-Modell (TQNet)
            Das TQNet-Framework eröffnet durch die Kombination von Modularität, Flexibilität und hoher Leistungsfähigkeit neue Möglichkeiten für die Modellierung und Prognose von Finanzzeitreihen. Der Artikel untersucht die Möglichkeit, komplexe Mechanismen zur Verarbeitung globaler Korrelationen zu implementieren, darunter auch fortgeschrittene Methoden zur Parameterinitialisierung.