English Русский 中文 Español 日本語 Português
preview
Chaos-Optimierungsalgorithmus (COA): Fortsetzung

Chaos-Optimierungsalgorithmus (COA): Fortsetzung

MetaTrader 5Tester |
30 2
Andrey Dik
Andrey Dik

Inhalt

  1. Einführung
  2. Implementierung des Algorithmus
  3. Testergebnisse
  4. Zusammenfassung


Einführung

Im vorangegangenen Artikel haben wir die chaotische Optimierungsmethode vorgestellt und einige der in diesem Algorithmus enthaltenen Methoden analysiert. In diesem Artikel werden wir die Analyse der übrigen Methoden abschließen und direkt zum Testen des Algorithmus mit Testfunktionen übergehen. 

Bei dieser Implementierung verwendet die chaotische Optimierungsmethode deterministisches Chaos, um den Lösungsraum zu erkunden. Das Schlüsselprinzip ist die Verwendung von drei verschiedenen chaotischen Abbildungen (logistische, Sinus- und Tent-Abbildung), um Sequenzen zu erzeugen, die Pseudo-Zufälligkeit und Ergodizität aufweisen. Der Algorithmus läuft in drei Phasen ab: eine anfängliche chaotische Suche, eine Verfeinerung der Lösung mithilfe der gewichteten Gradientenmethode und eine abschließende lokale Suche mit adaptiver Eingrenzung des Bereichs.

Die Verwendung von Geschwindigkeitsvektoren mit Trägheit und Mechanismen zur Erkennung von Stagnation hilft dem Algorithmus, lokale Extremwerte zu vermeiden. Eine dynamische Anpassung der Parameter und verschiedene Arten von Mutationen sorgen für ein Gleichgewicht zwischen globaler Erkundung und lokaler Verfeinerung der gefundenen Lösungen. Schauen wir uns nun die übrigen Methoden an.



Implementierung des Algorithmus

Die Methode ApplyMutation dient dazu, bei einem Agenten Mutationen vorzunehmen. Ihre Hauptaufgabe besteht darin, die Parameter eines bestimmten Agenten zufällig zu ändern.

Zunächst soll die Gültigkeit des Agentenindex sichergestellt werden. Liegt der Index außerhalb des Bereichs, bricht die Methode ab. Als Nächstes werden Informationen über die Größe verschiedener mit dem Agenten verbundener Felder gesammelt, z. B. die Größe seiner Parameter und seine Geschwindigkeit. Dadurch wird verhindert, dass die Methode die Grenzen dieser Arrays überschreitet.

Die Methode berechnet die maximale Anzahl der Koordinaten, die geändert werden können, auf der Grundlage der Größe der verfügbaren Arrays, um die Sicherheit der Operationen zu gewährleisten. Es wird eine Zufallszahl gewählt, um zu bestimmen, wie viele Koordinaten mutiert werden sollen. Dieser Wert liegt zwischen 1 und 30 % der maximalen Anzahl der verfügbaren Koordinaten. Es wird ein Array von Indizes gebildet, die die Koordinaten darstellen, die geändert werden können. Dieses Feld wird gemischt, um eine zufällige Auswahl bei der Anwendung von Mutationen zu gewährleisten.

In der Schleife werden die Koordinaten für die Mutation aus dem gemischten Array ausgewählt. Für jede ausgewählte Koordinate wird ein Mutationstyp auf der Grundlage eines Zufallswertes bestimmt. Zu den möglichen Arten gehören die vollständige Zufallsmutation (bei der ein neuer Wert innerhalb eines bestimmten Bereichs zufällig ausgewählt wird), die Mutation in Bezug auf die global beste Lösung und die Mutation mittels chaotischer Abbildungen.

Nach dem Ändern der Werte für die einzelnen Koordinaten wird die Geschwindigkeit des Agenten zurückgesetzt, sodass der neue Wert nicht von früheren Geschwindigkeiten beeinflusst wird. Schließlich wird der neue Wert für die entsprechende Agentenkoordinate unter Berücksichtigung der Spannen und Stufen festgelegt, wodurch sichergestellt wird, dass die Werte innerhalb des zulässigen Bereichs bleiben.

//——————————————————————————————————————————————————————————————————————————————
void C_AO_COA_chaos::ApplyMutation (int agentIdx)
{
  // Determine the number of coordinates for mutation (from 1 to 30% of coordinates)
  int mutationCount = 1 + (int)(u.RNDprobab () * coords * 0.3);
  mutationCount = MathMin (mutationCount, coords);

  // Create an array of indices for mutation without repetitions
  int mutationIndices [];
  ArrayResize (mutationIndices, coords);

  // Fill the array with indices
  for (int i = 0; i < coords; i++)
  {
    mutationIndices [i] = i;
  }

  // Shuffle the indices
  for (int i = coords - 1; i > 0; i--)
  {
    int j = (int)(u.RNDprobab () * (i + 1));
    if (j <= i) // Additional security check
    {
      int temp = mutationIndices [i];
      mutationIndices [i] = mutationIndices [j];
      mutationIndices [j] = temp;
    }
  }

  // Apply mutations to the selected coordinates
  for (int m = 0; m < mutationCount; m++)
  {
    int c = mutationIndices [m];

    // Different types of mutations for variety
    double r = u.RNDprobab ();
    double x;

    if (r < 0.3)
    {
      // Complete random mutation
      x = rangeMin [c] + u.RNDprobab () * (rangeMax [c] - rangeMin [c]);
    }
    else
      if (r < 0.6)
      {
        // Mutation relative to global best
        double offset = (u.RNDprobab () - 0.5) * (rangeMax [c] - rangeMin [c]) * 0.2;
        x = cB [c] + offset;
      }
      else
      {
        // Mutation using chaotic map
        agent [agentIdx].gamma [c] = SelectChaosMap (agent [agentIdx].gamma [c], (epochNow + c) % 3);
        x = rangeMin [c] + agent [agentIdx].gamma [c] * (rangeMax [c] - rangeMin [c]);
      }

    // Reset velocity
    agent [agentIdx].velocity [c] = 0.0;

    // Apply the new value with range check
    a [agentIdx].c [c] = u.SeInDiSp (x, rangeMin [c], rangeMax [c], rangeStep [c]);
  }
}
//——————————————————————————————————————————————————————————————————————————————

Die UpdateSigma-Methode der Klasse ist für die dynamische Anpassung des bei der Optimierung verwendeten Strafparameters zuständig. Sie regelt den Strafwert in Abhängigkeit von der Anzahl der zulässigen Lösungen in der Agentenpopulation.

Wenn die Methode zum ersten Mal aufgerufen wird (Epoche ist 1), wird der aktuelle Strafwert (currentSigma) auf die Hälfte des Basiswertes (sigma) gesetzt. Die Methode durchläuft die gesamte Agentenpopulation und berechnet die Anzahl der zulässigen Lösungen. Zu diesem Zweck wird eine Hilfsfunktion verwendet, um festzustellen, ob der Agent zulässig ist. Hier wird eine Iteration über alle Agenten durchgeführt, sodass wir feststellen können, wie viele von ihnen die vorgegebenen Kriterien erfüllen.

Anschließend berechnet die Methode den Anteil der zulässigen Lösungen an der Gesamtpopulation, indem sie die Anzahl der zulässigen Lösungen durch die Gesamtzahl der Agenten teilt. Dieses Verhältnis hilft uns zu verstehen, wie gut unsere derzeitige Strategie funktioniert. Auf der Grundlage des berechneten Verhältnisses der zulässigen Lösungen trifft die Methode Entscheidungen über die Anpassung der Strafe: Liegt der Anteil zulässiger Lösungen unter 30 %, deutet dies darauf hin, dass der Algorithmus zu restriktiv vorgeht; daher wird die Strafe erhöht, um die Suchdynamik zu verändern und eine größere Diversität im Verhalten der Agenten zu fördern. Wenn der Anteil 70 % übersteigt, deutet dies darauf hin, dass zu viele Agenten zulässige Lösungen finden, und die Strafe wird verringert, um eine vorzeitige Konvergenz zu vermeiden.

Letztlich sorgt die Methode dafür, dass der Wert der aktuellen Strafe innerhalb der zulässigen Grenzen bleibt. Wird er zu klein (weniger als 10 % des Basiswerts), erhöht sich die Strafe auf diesen Wert. Übersteigt die Strafe 500 % des Basiswerts, so wird sie auf diesen Wert gedeckelt.

//——————————————————————————————————————————————————————————————————————————————
void C_AO_COA_chaos::UpdateSigma ()
{
  // Dynamic adaptation of the penalty parameter
  // Start with a small value and increase it if necessary

  if (epochNow == 1)
  {
    currentSigma = sigma * 0.5;
    return;
  }

  // Calculate the number of feasible solutions
  int feasibleCount = 0;
  for (int i = 0; i < popSize; i++)
  {
    if (IsFeasible (i))
    {
      feasibleCount++;
    }
  }

  double feasibleRatio = (double)feasibleCount / MathMax (1, popSize);

  // Adapt the penalty parameter depending on the proportion of feasible solutions
  if (feasibleRatio < 0.3)
  {
    // Too few feasible solutions - increase the penalty
    currentSigma *= 1.2;
  }
  else
    if (feasibleRatio > 0.7)
    {
      // Too many feasible solutions - reduce the penalty
      currentSigma *= 0.9;
    }

  // Limit the sigma value
  if (currentSigma < sigma * 0.1) currentSigma = sigma * 0.1;
  else
    if (currentSigma > sigma * 5.0) currentSigma = sigma * 5.0;
}
//——————————————————————————————————————————————————————————————————————————————

Die IsFeasible-Methode bestimmt, ob eine bestimmte Lösung, die durch einen Agenten mit einem gegebenen Index agentIdx repräsentiert wird, unter Berücksichtigung der gegebenen Nebenbedingungen zulässig ist.

Zunächst prüft die Methode, ob der angegebene Agentenindex (agentIdx) innerhalb des zulässigen Bereichs liegt, d. h. größer oder gleich 0 und kleiner als die Populationsgröße (popSize). Wenn der Index unzulässig ist, gibt die Methode „false“ zurück und signalisiert damit, dass die Lösung unzulässig ist. Wenn der Agentenindex zulässig ist, beginnt die Methode mit der Überprüfung der Nebenbedingungen für die gegebene Lösung. Es durchläuft alle Koordinaten der Lösung und berechnet den Wert der Verletzung der Nebenbedingung für jede Koordinate mit der Funktion CalculateConstraintValue.

Die Funktion CalculateConstraintValue gibt einen Wert zurück, der den Grad der Verletzung der Nebenbedingung für eine bestimmte Lösungskoordinate angibt. Wenn nach der Überprüfung aller Koordinaten keine Nebenbedingung verletzt wird, d. h. alle Werte der Verletzung kleiner oder gleich „eps“ sind, dann wird die Lösung als zulässig angesehen und die Methode gibt „true“ zurück.

//——————————————————————————————————————————————————————————————————————————————
bool C_AO_COA_chaos::IsFeasible (int agentIdx)
{
  // Check if the solution is within the feasible region
  for (int c = 0; c < coords; c++)
  {
    double violation = CalculateConstraintValue (agentIdx, c);
    if (violation > eps)
    {
      return false;
    }
  }
  return true;
}
//——————————————————————————————————————————————————————————————————————————————

Die Methode UpdateBestHistory speichert den aktuell besten Wert in der Suchhistorie. Sie nimmt den neuen besten Wert und prüft zunächst, ob er korrekt oder zulässig ist. Wenn der Wert korrekt ist, wird er in dem Array, das die Historie der besten Ergebnisse speichert, an der aktuellen indizierten Position gespeichert. Danach wird der Index für die nächste Speicherung mit einer zyklischen Aktualisierung aktualisiert, wobei die Rest-Operation der Division durch die Größe des History-Arrays verwendet wird, wodurch sichergestellt wird, dass die History immer mit den letzten 10 Werten gefüllt wird, ohne dass die Array-Grenzen überschritten werden.

Die Methode ermöglicht es, den Suchfortschritt zu verfolgen und die Historie der besten Lösungen für die Analyse zu nutzen.

//——————————————————————————————————————————————————————————————————————————————
void C_AO_COA_chaos::UpdateBestHistory (double newBest)
{
  // Protection against invalid values
  if (!MathIsValidNumber (newBest)) return;

  // Update the history of the best values
  globalBestHistory [historyIndex] = newBest;
  historyIndex = (historyIndex + 1) % 10;
}
//——————————————————————————————————————————————————————————————————————————————

Die Methode IsConverged wird verwendet, um festzustellen, ob der Algorithmus Konvergenz erreicht hat. Sie analysiert die Historie der besten globalen Lösungen, um zu beurteilen, wie stark sich diese Lösungen im Laufe der Zeit verbessern. Wenn die Verbesserungen unbedeutend werden, gilt der Algorithmus als konvergiert.

Die Methode initialisiert Variablen, um die Anzahl der erlaubten (zulässigen) Werte, die Summe der Werte, die Minimal- und Maximalwerte aus der Historie der besten globalen Lösungen (globalBestHistory) zu zählen. Die Variablen minVal und maxVal werden mit den größtmöglichen bzw. kleinstmöglichen Double-Werten initialisiert, um das Minimum und Maximum in Zukunft korrekt zu bestimmen.

Die Methode iteriert über das Array globalBestHistory und führt für jeden Wert in der Historie Gültigkeits-, Datenvollständigkeits- und Diversitätsprüfungen durch, berechnet den Mittelwert und die relative Differenz und prüft auf Konvergenz. Im Allgemeinen bietet die IsConverged-Methode eine Möglichkeit, die Konvergenz eines Optimierungsalgorithmus zu bestimmen, indem die Historie der besten Lösungen analysiert und bewertet wird, wie signifikant die Verbesserungen im Laufe der Zeit sind. 

//——————————————————————————————————————————————————————————————————————————————
bool C_AO_COA_chaos::IsConverged ()
{
  // Check if there is enough data in the history
  int validValues = 0;
  double sum      = 0.0;
  double minVal   = DBL_MAX;
  double maxVal   = -DBL_MAX;

  // Find min, max, and sum of values in history
  for (int i = 0; i < 10; i++)
  {
    if (globalBestHistory [i] == -DBL_MAX || !MathIsValidNumber (globalBestHistory [i])) continue;

    minVal = MathMin (minVal, globalBestHistory [i]);
    maxVal = MathMax (maxVal, globalBestHistory [i]);
    sum += globalBestHistory [i];
    validValues++;
  }

  // If there is not enough data or all values are the same
  if (validValues < 5 || minVal == maxVal) return false;

  // Calculate the average value
  double average = sum / validValues;

  // Check the case when the mean is close to zero
  if (MathAbs (average) < eps) return MathAbs (maxVal - minVal) < eps * 10.0;

  // Relative difference for convergence testing
  double relDiff = MathAbs (maxVal - minVal) / MathAbs (average);

  return relDiff < 0.001; // Convergence threshold - 0.1%
}
//——————————————————————————————————————————————————————————————————————————————

Die Methode ResetStagnatingAgents wurde entwickelt, um Agenten während der Optimierung zu verwalten, insbesondere um Fälle zu behandeln, in denen Agenten keine Verbesserung ihrer Ergebnisse mehr zeigen. Sie überwacht den Zustand der Stagnation der Agenten und wendet gegebenenfalls Mutation auf diejenigen von ihnen an, die in lokalen Extremen feststecken.

Für jeden Agenten wird geprüft, ob sich sein aktueller Fitnessfunktionswert (a[i].f) im Vergleich zu seinem vorherigen Wert (a[i].fB) verbessert hat. Hat sich der aktuelle Wert nicht verbessert oder verschlechtert, wird der stagnationCounter des Agenten erhöht, was signalisiert, dass sich der Agent in einem Zustand der Stagnation befindet. Wenn sich der Wert verbessert hat, wird der Stagnationszähler zurückgesetzt.

Wenn der Agent für mehr als 5 Iterationen stagniert, berechnet die Methode die Reset-Wahrscheinlichkeit (resetProb). Diese Wahrscheinlichkeit ist proportional zum aktuellen Wert des Stagnationszählers, d. h. je länger der Agent stagniert, desto höher ist die Wahrscheinlichkeit, dass er zurückgesetzt wird. Die Gleichung zur Berechnung der Wahrscheinlichkeit berücksichtigt einen festen Wert (0,2) und den relativen Wert des Stagnationszählers. Ist der zufällig erzeugte Wert kleiner als die berechnete resetProb-Wahrscheinlichkeit, wird mit der Funktion ApplyMutation eine Mutation auf den Agenten angewendet. Nach Anwendung einer Mutation wird der Stagnationszähler des Agenten zurückgesetzt und der resetCount-Zähler erhöht.

Die Methode endet nach der Bearbeitung aller Agenten, die die Stagnationsschwelle überschritten und die Mutationsbedingung erfüllt haben.

//——————————————————————————————————————————————————————————————————————————————
void C_AO_COA_chaos::ResetStagnatingAgents ()
{
  int resetCount = 0;

  for (int i = 0; i < popSize; i++)
  {
    // Increase the stagnation counter if there is no improvement
    if (a [i].f <= a [i].fB)
    {
      agent [i].stagnationCounter++;
    }
    else
    {
      agent [i].stagnationCounter = 0;
    }

    // Reset the agent if it has been stagnating for too long
    if (agent [i].stagnationCounter > 5)
    {
      // Reset only some of the agents with a probability depending on stagnation
      double resetProb = 0.2 * (1.0 + (double)agent [i].stagnationCounter / 10.0);

      if (u.RNDprobab () < resetProb)
      {
        ApplyMutation (i);
        agent [i].stagnationCounter = 0;
        resetCount++;
      }
    }
  }
}
//——————————————————————————————————————————————————————————————————————————————

Die Methode CalculateWeightedGradient wird verwendet, um den Gradienten einer Nebenbedingung für einen bestimmten Agenten und eine bestimmte Koordinate zu schätzen, wobei der Grad der Verletzung dieser Nebenbedingungen berücksichtigt wird. Sie hilft zu bestimmen, in welche Richtung und in welchem Ausmaß die Lösung angepasst werden sollte, um die Verletzung zu beseitigen, wobei der Gradient nach dem Ausmaß der Verletzung gewichtet wird.

Zunächst werden die Indizes und Koordinaten des Agenten überprüft, um sicherzustellen, dass sie innerhalb akzeptabler Grenzen liegen. Wenn die Indizes unzulässig sind, wird ein Nullwert zurückgegeben, was bedeutet, dass es keine Richtung für die Anpassung gibt. Die Methode durchläuft dann in einer Schleife alle Koordinaten, die mit dem aktuellen Agenten verbunden sind, und berechnet für jede den Wert der Verletzung. Während dieses Prozesses wird nach der größten Verletzung gesucht. Ist die Verletzung für eine bestimmte Koordinate größer als der Schwellenwert „eps“, wird es als sinnvoll erachtet, Korrekturmaßnahmen zu ergreifen; andernfalls wird Null zurückgegeben – eine Bewegung in diese Richtung ist sinnlos oder nicht erforderlich.

Ist die Verletzung signifikant, wird für die Koordinate der Gradient der Nebenbedingung berechnet – ein Maß für die Richtung und Stärke der Änderung der Nebenbedingung im Verhältnis zu Änderungen in dieser Koordinate. Der Gradient wird mit einer Gewichtung multipliziert, die als das Verhältnis zwischen der Verletzung der aktuellen Koordinate und der maximalen Verletzung aller Nebenbedingungen definiert ist. Dadurch wird sichergestellt, dass eine größere Verletzung einen stärkeren Einfluss auf die Richtung der Anpassung hat. Der sich daraus ergebende Wert ist ein gewichteter Nebenbedingungsgradient, der angibt, wie stark und in welche Richtung die Lösung angepasst werden muss, um die Verletzung in einer bestimmten Koordinate zu beseitigen, und zwar proportional zu ihrem Grad.

//——————————————————————————————————————————————————————————————————————————————
double C_AO_COA_chaos::CalculateWeightedGradient (int agentIdx, int coordIdx)
{
  // Calculate the maximum value of the constraint violation
  double maxViolation = eps;

  for (int c = 0; c < coords; c++)
  {
    double violation = CalculateConstraintValue (agentIdx, c);
    maxViolation = MathMax (maxViolation, violation);
  }

  // Violation for the current coordinate
  double violation = CalculateConstraintValue (agentIdx, coordIdx);

  // If there is no significant violation, return 0
  if (violation <= eps) return 0.0;

  // Calculate the gradient
  double gradient = CalculateConstraintGradient (agentIdx, coordIdx);

  // Normalize the impact depending on the degree of violation
  double weight = violation / maxViolation;

  return gradient * weight;
}
//——————————————————————————————————————————————————————————————————————————————

Die Methode CalculateConstraintValue wird verwendet, um den Grad der Verletzung der Nebenbedingung für eine bestimmte Koordinate eines bestimmten Agenten abzuschätzen. Sie bestimmt, wie weit der aktuelle Koordinatenwert außerhalb der zulässigen Grenzen liegt und gibt einen numerischen Wert zurück, der das Ausmaß dieser Verletzung widerspiegelt.

Zunächst prüft die Methode die Agentenindizes (agentIdx) und die Koordinaten (coordIdx) auf Gültigkeit. Die Methode holt sich den aktuellen Wert der „x“-Koordinate aus dem Zustand des Agenten und bestimmt auch die minimalen (min) und maximalen (max) akzeptablen Grenzen für diese Koordinate. Anschließend wird geprüft, ob der „x“-Wert innerhalb des zulässigen Bereichs (min und max) liegt. Schließlich gibt die Methode einen Wert von „violation“ zurück, der den Gesamtumfang der Verletzung gegen die Nebenbedingung für die gegebene Koordinate des gegebenen Agenten angibt.

Die wichtigsten Merkmale sind:

  • Die Methode gibt einen positiven Wert zurück, wenn die Nebenbedingung verletzt wird, und 0, wenn sie erfüllt ist.
  • Das Ausmaß der Verletzung ist proportional zu dem Ausmaß, in dem der Koordinatenwert die zulässigen Grenzen überschreitet.

Letztendlich liefert die CalculateConstraintValue-Methode wichtige Informationen darüber, wie gut jeder Agent in der Population die Problemeinschränkungen erfüllt. Sie misst das Ausmaß der Verletzung, was dem Algorithmus hilft zu verstehen, wie stark die Position des Agenten angepasst werden muss.

//——————————————————————————————————————————————————————————————————————————————
double C_AO_COA_chaos::CalculateConstraintValue (int agentIdx, int coordIdx)
{
  double x = a [agentIdx].c [coordIdx];
  double min = rangeMin [coordIdx];
  double max = rangeMax [coordIdx];

  // Smoothed constraint violation function with a smooth transition at the boundary
  double violation = 0.0;

  // Check the lower bound
  if (x < min)
  {
    violation += min - x;
  }
  // Check the upper bound
  else
    if (x > max)
    {
      violation += x - max;
    }

  return violation;
}
//——————————————————————————————————————————————————————————————————————————————

Die Methode CalculateConstraintGradient berechnet den Nebenbedingungsgradienten für eine bestimmte Koordinate eines bestimmten Agenten. Diese Methode bestimmt, in welche Richtung und in welchem Ausmaß der Koordinatenwert aufgrund einer Verletzung der Nebenbedingung geändert werden soll.

Die Methode überprüft zunächst die eingegebenen Agentenindizes (agentIdx) und Koordinaten (coordIdx), um sicherzustellen, dass sie korrekt sind. Liegt mindestens einer der Indizes außerhalb des zulässigen Bereichs, gibt die Methode 0,0 zurück, was bedeutet, dass der Gradient nicht berechnet werden kann. Die Methode ermittelt den aktuellen Wert der Koordinate des Agenten sowie die Mindest- und Höchstgrenzen, die für diese Koordinate festgelegt wurden. Diese Werte werden für weitere Auswertungen benötigt. Anschließend wird geprüft, ob der aktuelle Wert der „x“-Koordinate außerhalb der festgelegten Grenzen liegt.

Der von der Methode zurückgegebene Endwert spiegelt die Richtung und die Notwendigkeit der Änderung des aktuellen Koordinatenwerts des Agenten unter Berücksichtigung der angegebenen Nebenbedingungen wider.

//——————————————————————————————————————————————————————————————————————————————
double C_AO_COA_chaos::CalculateConstraintGradient (int agentIdx, int coordIdx)
{
  double x = a [agentIdx].c [coordIdx];
  double min = rangeMin [coordIdx];
  double max = rangeMax [coordIdx];

  // Smoothed gradient for better stability
  if (x < min) return -1.0; // Need to increase the value
  else
    if (x > max) return 1.0;  // Need to decrease the value

  return 0.0;
}
//——————————————————————————————————————————————————————————————————————————————

Die Methode CalculatePenaltyFunction berechnet die Werte der Zielfunktion unter Berücksichtigung der Strafe für die Verletzung von Nebenbedingungen für einen bestimmten Agenten. Es kombiniert einen Basiswert der Zielfunktion mit einer Strafe, die auf dem Ausmaß der Verletzung von Nebenbedingungen basiert.

Die Methode beginnt mit der Überprüfung der Gültigkeit des Agentenindex (agentIdx), und wenn der Index zulässig ist, erhält die Methode den (nicht bestraften) Basiswert der Zielfunktion dieses Agenten (a[agentIdx].f) und speichert ihn in der Variablen baseValue. Die Methode durchläuft dann in einer Schleife alle Koordinaten (coords) der einzelnen Agenten. Für jede Koordinate wird das Ausmaß der Verletzung der Nebenbedingung berechnet. Wenn das Ausmaß der Verletzung einen bestimmten kleinen Wert „eps“ überschreitet, wird das Quadrat des Ausmaßes des Verstoßes zur penaltySum-Summe der Strafen hinzugefügt.

Eine quadratische Strafe wird verwendet, um eine „weiche“ Bewertung für geringfügige Verletzungen und eine „harte“ Bewertung für schwerwiegende Verletzungen vorzunehmen. Nachdem alle Strafen für Verletzungen gegen die Nebenbedingungen addiert wurden, wird die gesamte „Strafe“ berechnet.

Schließlich berechnet die Methode den „bestraften“ Wert der Zielfunktion durch Subtraktion der „Strafe“ vom Basiswert der Zielfunktion baseValue. Der bestrafte Wert der Zielfunktion wird zurückgegeben.

//——————————————————————————————————————————————————————————————————————————————
double C_AO_COA_chaos::CalculatePenaltyFunction (int agentIdx)
{
  // Base value of the objective function
  double baseValue = a [agentIdx].f;

  // Penalty term
  double penaltySum = 0.0;

  for (int c = 0; c < coords; c++)
  {
    double violation = CalculateConstraintValue (agentIdx, c);

    // Quadratic penalty for better resolution of solutions close to the boundary
    if (violation > eps)
    {
      penaltySum += violation * violation;
    }
  }

  // Apply a dynamic penalty ratio
  double penalty = currentSigma * penaltySum;

  // For the maximization problem: f_penalty = f - penalty
  return baseValue - penalty;
}
//——————————————————————————————————————————————————————————————————————————————

Die Methode Moving ist das das zentrale Verfahren zur Steuerung des Optimierungsablaufs. Es führt sequentielle Schritte durch, die darauf abzielen, den aktuellen Zustand des Systems zu aktualisieren, die Parameter anzupassen und die Suchphasen zu verwalten.

Zunächst wird der aktuelle Epochenzähler inkrementiert. Beim ersten Aufruf initialisiert die Methode die Population und kehrt zurück. Anschließend wird der Strafparameter (sigma) dynamisch aktualisiert, um den Einfluss der Straffunktionen während des Suchprozesses zu regulieren. Eine wichtige Aufgabe besteht darin, Agenten, die feststecken oder keine Fortschritte machen, regelmäßig zu überprüfen und zurückzusetzen, um eine Stagnation in lokalen Fallen zu verhindern.

Die aktuelle Phase der Suche wird dann durch den Wert des Epochenzählers bestimmt – in den ersten Phasen wird eine globale Suche durchgeführt, danach geht es weiter zu einer engeren, lokalen Suche. Je nach Phase werden die entsprechenden Suchstrategien aufgerufen, die die Bewegung der Agenten steuern.

//——————————————————————————————————————————————————————————————————————————————
void C_AO_COA_chaos::Moving ()
{
  epochNow++;

  if (!revision)
  {
    InitialPopulation ();

    revision = true;
    return;
  }

  // Dynamically update the penalty parameter
  UpdateSigma ();

  // Reset stagnating agents
  if (epochNow % 5 == 0)
  {
    ResetStagnatingAgents ();
  }

  // Determine the search phase
  if (epochNow <= S1)
  {
    FirstCarrierWaveSearch ();
  }
  else
    if (epochNow <= S1 + S2)
    {
      SecondCarrierWaveSearch ();
    }
}
//——————————————————————————————————————————————————————————————————————————————

Die Revisionsmethode ist für die Verbesserung der Lösungen und die Anpassung der Suchparameter während der iterativen Optimierung zuständig. Sie wertet den aktuellen Zustand der Population erneut aus, aktualisiert die besten Lösungen und passt die Suchparameter auf der Grundlage der Leistung der letzten Schritte an.

Die Methode durchläuft alle Lösungen in der Population und berechnet ihren neuen Strafterm (penalty) mithilfe der Straffunktion, die es ermöglicht, die Verletzungen der Nebenbedingungen zu berücksichtigen. Der sich daraus ergebende Wert wird dann überprüft, und wenn er zulässig ist, wird er als aktueller Wert der Funktion gespeichert. Für jeden Agenten, dessen neuer Funktionswert besser ist als der vorherige, werden seine persönlichen Daten aktualisiert: Der neue Wert wird gespeichert, und die aktuellen Koordinaten werden ebenfalls kopiert. Hier wird die persönlich beste Lösung jedes Agenten gespeichert. Stellt sich heraus, dass ein Agent eine bessere Lösung als die aktuelle globale Lösung hat, wird die globale beste Lösung aktualisiert und die entsprechenden Koordinaten werden gespeichert. Die Historie der besten Lösungen wird ebenfalls aktualisiert.

Nach der ersten Stufe von Iterationen (epochNow > 1) wird der Erfolg der Suche bewertet – der Anteil der Verbesserungen unter allen Agenten wird ermittelt. Auf der Grundlage dieser Bewertung werden die Parameter angepasst, insbesondere „alpha“ (der Suchbereich für jede Koordinate). Je nach aktueller Suchphase (global oder lokal) können die Regeln für die Anpassung von „alpha“ unterschiedlich sein: In der globalen Suchphase wird bei geringer Verbesserung der Suchumfang vergrößert, um die Möglichkeiten zu erweitern; in der lokalen Suchphase wird bei unzureichender Verbesserung der Suchumfang ebenfalls vergrößert. Im Falle eines signifikanten Erfolgs verringert sich der Suchumfang, was zur Lokalisierung der optimalen Lösung beiträgt. Der Parameter „alpha“ wird durch Höchst- und Mindestwerte begrenzt, die auf dem Bereich der akzeptablen Werte für die Koordinate basieren.

Dieser Ansatz ermöglicht ein dynamisches Gleichgewicht zwischen der Erkundung neuer Lösungen und der Lokalisierung optimaler Lösungen unter Verwendung von Informationen über die Leistung früherer Iterationen.

//——————————————————————————————————————————————————————————————————————————————
void C_AO_COA_chaos::Revision ()
{
  int    improvementCount = 0;
  double bestImprovement  = 0.0;

  // Evaluate all solutions
  for (int i = 0; i < popSize; i++)
  {
    double newValue = CalculatePenaltyFunction (i);

    // Check the validity of the new value
    if (!MathIsValidNumber (newValue)) continue;

    // Save the current value for the next iteration
    a [i].f = newValue;

    // Update the personal best solution (before a global one for efficiency)
    if (newValue > a [i].fB)
    {
      a [i].fB = newValue;
      ArrayCopy (a [i].cB, a [i].c, 0, 0, WHOLE_ARRAY);
      improvementCount++;
    }

    // Update the global best solution
    if (newValue > fB)
    {
      double improvement = newValue - fB;
      fB = newValue;
      ArrayCopy (cB, a [i].c, 0, 0, WHOLE_ARRAY);

      // Update the history of the best values
      UpdateBestHistory (fB);

      bestImprovement = MathMax (bestImprovement, improvement);
      improvementCount++;
    }
  }

  // Adapt search parameters depending on the phase and success
  if (epochNow > 1)
  {
    // Search success rate (prevention of zero divide)
    double successRate = (double)improvementCount / MathMax (1, 2 * popSize);

    // Adaptation of the alpha parameter
    for (int c = 0; c < coords; c++)
    {
      double oldAlpha = alpha [c];

      if (epochNow <= S1)
      {
        // In the global search phase
        if (successRate < 0.1)
        {
          // Very few improvements - increasing the search scope
          alpha [c] *= t3;
        }
        else
          if (successRate < 0.3)
          {
            // Few improvements - slightly expanding the scope
            alpha [c] *= 1.2;
          }
          else
            if (successRate > 0.7)
            {
              // Many improvements - narrowing the scope
              alpha [c] *= 0.9;
            }
      }
      else
      {
        // In the local search phase
        if (successRate < 0.05)
        {
          // Very few improvements - increasing the search scope
          alpha [c] *= t3;
        }
        else
          if (successRate > 0.2)
          {
            // Enough improvements - narrowing the scope
            alpha [c] *= 0.8;
          }
      }

      // Limits on alpha range with safe bounds verification
      if (c < ArraySize (rangeMax) && c < ArraySize (rangeMin))
      {
        double maxAlpha = 0.2 * (rangeMax [c] - rangeMin [c]);
        double minAlpha = 0.0001 * (rangeMax [c] - rangeMin [c]);

        if (alpha [c] > maxAlpha)
        {
          alpha [c] = maxAlpha;
        }
        else
          if (alpha [c] < minAlpha)
          {
            alpha [c] = minAlpha;
          }
      }
    }
  }
}
//——————————————————————————————————————————————————————————————————————————————

Nachdem wir nun alle Methoden untersucht haben, können wir direkt mit dem Testen des Algorithmus fortfahren.


Testergebnisse

Die Ergebnisse sprechen für sich: Die externen Parameter wurden leicht optimiert, während die internen Parameter unverändert blieben und wie oben in den Methoden beschrieben dargestellt werden.

COA(CHAOS)|Chaos Optimization Algorithm|50.0|10.0|40.0|2.0|1.2|0.0001|
=============================
5 Hilly's; Func runs: 10000; result: 0.6083668756744218
25 Hilly's; Func runs: 10000; result: 0.4079413401686229
500 Hilly's; Func runs: 10000; result: 0.2678056430575926
=============================
5 Forest's; Func runs: 10000; result: 0.668343763134901
25 Forest's; Func runs: 10000; result: 0.38894787694645416
500 Forest's; Func runs: 10000; result: 0.2198998763835145
=============================
5 Megacity's; Func runs: 10000; result: 0.32307692307692304
25 Megacity's; Func runs: 10000; result: 0.1987692307692308
500 Megacity's; Func runs: 10000; result: 0.10598461538461638
=============================
All score: 3.18914 (35.43%)

Ich möchte besonders auf die Visualisierung der Funktionsweise des Algorithmus aufmerksam machen: Die Kombination der verschiedenen verwendeten Suchmethoden erzeugt einen ungewöhnlichen visuellen Effekt.

Hilly

COA(CHAOS) mit der Testfunktion Hilly

Forest

COA(CHAOS) mit der Testfunktion Forest

Megacity

COA(CHAOS) mit der Testfunktion Megacity

Auf der Grundlage der Testergebnisse wird der COA(CHAOS)-Algorithmus in unserer Bewertungstabelle vorgestellt.

# AO Beschreibung Hilly Hilly
Final
Forest Forest
Final
Megacity (discrete) Megacity
Final
Final
Result
% of
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)
1ANSSuche über die gesamte Nachbarschaft0.949480.847760.438572.235811.000000.923340.399882.323230.709230.634770.230911.574916.13468.15
2CLACode-Sperr-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
6TETAZeit-Evolutions-Reise-Algorithmus (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
9AAmAlgorithmus für das Bogenschießen 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 Annealing (Joo)0.957840.842640.414652.215130.982390.795860.205071.983320.686670.493000.090531.270205.46960.76
12ACSkünstliche, kooperative Suche0.755470.747440.304071.806981.000000.888610.224132.112740.690770.481850.133221.305835.22658.06
13DAdialektischer Algorithmus0.861830.700330.337241.899400.981630.727720.287181.996530.703080.452920.163671.319675.21657.95
14BHAmAlgorithmus für schwarze Löcher M0.752360.766750.345831.864930.935930.801520.271772.009230.650770.516460.154721.321955.19657.73
15ASOAnarchische Gesellschaftsoptimierung0.848720.746460.314651.909830.961480.791500.238031.991010.570770.540620.166141.277525.17857.54
16RFOOptimierung des Royal Flush (joo)0.833610.737420.346291.917330.894240.738240.240981.873460.631540.502920.164211.298675.08956.55
17AOSmSuche nach atomaren Orbitalen M0.802320.704490.310211.817020.856600.694510.219961.771070.746150.528620.143581.418355.00655.63
18TSEASchildkrötenpanzer-Evolutionsalgorithmus (joo)0.967980.644800.296721.909490.994490.619810.227081.841390.690770.426460.135981.253225.00455.60
19DEdifferentielle Evolution0.950440.616740.303081.870260.953170.788960.166521.908650.786670.360330.029531.176534.95555.06
20SRAAlgorithmus für erfolgreiche Gastronomen (joo)0.968830.634550.292171.895550.946370.555060.191241.692670.749230.440310.125261.314804.90354.48
21CROOptimierung chemischer Reaktionen0.946290.661120.298531.905930.879060.584220.211461.674730.758460.426460.126861.311784.89254.36
22BIOOptimierung der Blutvererbung (joo)0.815680.653360.308771.777810.899370.653190.217601.770160.678460.476310.139021.293784.84253.80
23BSAVogelschwarm-Algorithmus0.893060.649000.262501.804550.924200.711210.249391.884790.693850.326150.100121.120124.80953.44
24HSHarmoniesuche0.865090.687820.325271.878180.999990.680020.095901.775920.620000.422670.054581.097254.75152.79
25SSGSetzen, Säen und Wachsen0.778390.649250.395431.823080.859730.624670.174291.658690.646670.441330.105981.193984.67651.95
26BCOmOptimierung mit der bakteriellen Chemotaxis M0.759530.622680.314831.697040.893780.613390.225421.732590.653850.420920.144351.219124.64951.65
27ABOOptimierung des afrikanischen Büffels0.833370.622470.299641.755480.921700.586180.197231.705110.610000.431540.132251.173784.63451.49
28(PO)ES(PO) Evolutionsstrategien0.790250.626470.429351.846060.876160.609430.195911.681510.590000.379330.113221.082554.61051.22
29TSmTabu-Suche M0.877950.614310.291041.783300.928850.518440.190541.637830.610770.382150.121571.114494.53650.40
30BSOBrainstorming-Optimierung0.937360.576160.296881.810410.931310.558660.235371.725340.552310.290770.119140.962224.49849.98
31WOAmWal-Optimierungsalgorithmus M0.845210.562980.262631.670810.931000.522780.163651.617430.663080.411380.113571.188034.47649.74
32AEFAAlgorithmus für künstliche elektrische Felder0.877000.617530.252351.746880.927290.726980.180641.834900.666150.116310.095080.877544.45949.55
33AEOAlgorithmus zur Optimierung auf der Grundlage künstlicher Ökosysteme0.913800.467130.264701.645630.902230.437050.214001.553270.661540.308000.285631.255174.45449.49
34ACOmAmeisen-Kolonie-Optimierung M0.881900.661270.303771.846930.858730.586800.150511.596040.596670.373330.024720.994724.43849.31
35BFO-GAOptimierung der bakteriellen Futtersuche — ga0.891500.551110.315291.757900.969820.396120.063051.428990.726670.275000.035251.036924.22446.93
36SOAeinfacher Optimierungsalgorithmus0.915200.469760.270891.655850.896750.374010.169841.440600.695380.280310.108521.084224.18146.45
37ABHAAlgorithmus für künstliche Bienenstöcke0.841310.542270.263041.646630.878580.477790.171811.528180.509230.338770.103970.951974.12745.85
38ACMOOptimierung atmosphärischer Wolkenmodelle0.903210.485460.304031.692700.802680.378570.191781.373030.623080.244000.107950.975034.04144.90
39ADAMmadaptive Momentabschätzung M0.886350.447660.266131.600140.844970.384930.168891.398800.661540.270460.105941.037944.03744.85
40CGOChaos Game Optimization0.572560.371580.320181.264320.611760.619310.621611.852670.375380.219230.190280.784903.90243.35
41ATAmAlgorithmus für künstliche Stämme M0.717710.553040.252351.523100.824910.559040.204731.588670.440000.186150.094110.720263.83242.58
42CROmKorallenriff-Optimierung M0.785120.460320.259581.505020.866880.352970.162671.382520.632310.267380.107341.007033.89543.27
43CFOSchwerkraftoptimierung0.609610.549580.278311.437500.634180.468330.225411.327920.572310.234770.095860.902943.66840.76
44ASHAAlgorithmus für künstliches Duschen0.896860.404330.256171.557370.803600.355260.191601.350460.476920.181230.097740.755893.66440.71
45ASBOOptimierung des adaptiven Sozialverhaltens0.763310.492530.326191.582020.795460.400350.260971.456770.264620.171690.182000.618313.65740.63
CHAOSChaos-Optimierungsalgorithmus0.608370.407940.267811.284120.668340.388950.219901.277190.323080.198770.105980.627833.18935.43
RWNeuroboids Optimierungsalgorithmus 2(joo)0.487540.321590.257811.066940.375540.219440.158770.753750.279690.149170.098470.527342.34826.09


Zusammenfassung

Das Ergebnis von 35 % nach den Tests zeigt ein gutes Potenzial des COA(CHAOS)-Algorithmus, insbesondere in Anbetracht seiner Komplexität und der Anzahl der konfigurierbaren externen Parameter, einschließlich der internen Parameter, die nicht optimiert wurden. Der Algorithmus hat einfach noch nicht seine maximale Leistung gezeigt.

Die interessantesten und vielversprechendsten Aspekte des Algorithmus sind die folgenden: die Verwendung von drei verschiedenen Abbildungen (logistisch, sinusförmige und Tent-Abbildungen) für die Suchfähigkeiten des Algorithmus; die Hinzufügung von Trägheit hilft dem Algorithmus, den Schwung beizubehalten, während er lokale Fallen überwindet; dynamische Parameteränderungen, abhängig vom Erfolg und der Phase der Optimierung, erhöhen seine Flexibilität; die Verfolgung des Entscheidungshistorie und das Zurücksetzen von „steckengebliebenen“ Agenten ermöglicht es dem Algorithmus, die Verschwendung von Rechenressourcen auf nicht vielversprechenden Gebieten zu vermeiden. Darüber hinaus gewährleistet die Verwendung des lateinischen Hyperwürfels und verschiedener Ansätze für die anfängliche Platzierung von Agenten von Anfang an eine gute Abdeckung des Suchraums. Um den Algorithmus weiter zu verbessern, wäre es sinnvoll, eine gründlichere Optimierung der internen Parameter vorzunehmen.

Dieser Algorithmus bietet eine reichhaltige Quelle für Ideen zur Verbesserung anderer Optimierungsmethoden, insbesondere seine adaptiven Mechanismen und Methoden zur Behandlung von Stagnation, die erfolgreich auf andere Algorithmen für maschinelles Lernen und Optimierung von Finanzmärkten übertragen werden könnten.

Tabelle

Abbildung 1. Farbskala der Algorithmen nach den entsprechenden Tests

Histogramm

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

COA(CHAOS) Pro und Kontra:

Vorteile:

  1. Eine Vielzahl von Suchmethoden.
  2. Vielversprechende Entwicklung.
  3. Stabile Ergebnisse.

Nachteile:

  1. Eine große Anzahl von externen Parametern.
  2. Eine große Anzahl interner, nicht optimierbarer Parameter.

Dem Artikel ist ein Archiv mit den aktuellen Versionen des Algorithmuscodes beigefügt. Der Autor des Artikels übernimmt keine Verantwortung für die absolute Richtigkeit der Beschreibung der kanonischen Algorithmen. An vielen von ihnen wurden Änderungen vorgenommen, um die Suchmöglichkeiten zu verbessern. Die in den Artikeln dargelegten Schlussfolgerungen und Urteile beruhen auf den Ergebnissen der Versuche.


Programme, die in diesem Artikel verwendet werden

#NameTypBeschreibung
1#C_AO.mqh
Include
Übergeordnete Klasse von Populationsoptimierungsalgorithmen
2#C_AO_enum.mqh
Include
Enumeration der Algorithmen zur Populationsoptimierung
3TestFunctions.mqh
Include
Bibliothek mit Testfunktionen
4
TestStandFunctions.mqh
Include
Bibliothek mit Funktionen für die Testumgebung
5
Utilities.mqh
Include
Bibliothek mit Hilfsfunktionen
6
CalculationTestResults.mqh
Include
Skript zur Berechnung der Ergebnisse in der Vergleichstabelle
7
Testing AOs.mq5
SkriptDie einheitliche Testumgebung für alle Algorithmen zur Populationsoptimierung
8
Simple use of population optimization algorithms.mq5
Skript
Ein einfaches Beispiel für die Verwendung von Algorithmen zur Populationsoptimierung ohne Visualisierung
9
Test_AO_COA_chaos.mq5
SkriptCOA(CHAOS)-Testumgebung

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

Beigefügte Dateien |
COAcCHAOSd.zip (203.55 KB)
Letzte Kommentare | Zur Diskussion im Händlerforum (2)
Jesus Manzur
Jesus Manzur | 12 Feb. 2026 in 21:04
MetaQuotes:

Veröffentlichter Artikel Chaos-Optimierungsalgorithmus (COA): Fortsetzung:

Autor: Andrey Dik

Es ist überraschend zu sehen, dass, wenn die verschiedenen Methoden kombiniert werden, es erzeugt eine Art von statischen wie die der alten Fernseher, und dass wie sie in gewisser Weise diese zeigt eine Art von "Lärm" oder Chaos, die in ja aufgezeichnet bleibt, muss durch die gleiche Tatsache, wie die kleinen anfänglichen Variationen durch die Empfindlichkeit bestimmt am Ende verändern völlig das Endergebnis, in Wahrheit, dass wir unbedeutend sind, sehr guter Artikel sein.
Andrey Dik
Andrey Dik | 13 Feb. 2026 in 05:22
Jesus Manzur #:
...
Ich danke Ihnen!
Python + MetaTrader 5: Schnelles Forschungs-Framework für Daten, Merkmale und Prototypen Python + MetaTrader 5: Schnelles Forschungs-Framework für Daten, Merkmale und Prototypen
Der Artikel zeigt, wie die Integration von Python und MetaTrader 5 die Flexibilität der Forschung und die Handelsoperationen in einem einzigen Arbeitsablauf vereint. Python wird für die Datenanalyse, die Merkmalsauswahl und das Modelltraining verwendet, während MetaTrader 5 für Tests und die Handelsautomatisierung eingesetzt wird. Dieser Ansatz vereinfacht die Übertragung von Lösungen in die Praxis, erhöht die Reproduzierbarkeit und macht die Entwicklung von Handelssystemen schneller und strukturierter.
Forex-Arbitragehandel: Panel zur Bewertung von Wechselkursbeziehungen Forex-Arbitragehandel: Panel zur Bewertung von Wechselkursbeziehungen
In diesem Artikel wird die Entwicklung eines Arbitrage-Analyse-Panels in MQL5 vorgestellt. Wie kann man auf verschiedene Weise faire Devisenkurse auf dem Forex erhalten? Erstellung eines Indikators zur Ermittlung von Abweichungen der Marktpreise von den fairen Wechselkursen sowie zur Bewertung der Vorteile von Arbitragemöglichkeiten beim Umtausch einer Währung in eine andere (wie bei der Dreiecksarbitrage).
Einsatz spieltheoretischer Ansätze in Handelsalgorithmen Einsatz spieltheoretischer Ansätze in Handelsalgorithmen
Wir entwickeln einen adaptiven, selbstlernenden Expert Advisor für den algorithmischen Handel, der auf Deep-Q-Learning (DQN) mit mehrdimensionaler kausaler Inferenz basiert. Der EA kann erfolgreich mit 7 Währungspaaren gleichzeitig handeln, und die Agenten verschiedener Paare tauschen untereinander Informationen aus.
Algorithmischer Handel ohne Routine: Schnelle Handelsanalyse im MetaTrader 5 mit SQLite Algorithmischer Handel ohne Routine: Schnelle Handelsanalyse im MetaTrader 5 mit SQLite
Der Artikel stellt eine minimale arbeitsfähige Grundausstattung für die Führung eines Handelsjournals in MQL5 unter Verwendung von SQLite vor: eine Tabellenstruktur für Trades, Signale und Ereignisse, Indizes, vorbereitete Anweisungen und Trades sowie analytische Standard-SQL-Abfragen. Die Integration mit dem Statistik-Dashboard in MetaTrader 5 und das Arbeiten mit der Datenbank über MetaEditor werden demonstriert. Dieser Ansatz ermöglicht es, das Journal zu automatisieren, Berechnungen zu beschleunigen und Analysen durchzuführen, ohne den EA-Code zu verkomplizieren.