Zum Inhalt

Einen cBot optimieren

Der Befehl optimize testet verschiedene Parameterwerte eines cBots, um anhand der ausgewählten Kriterien die Kombinationen mit den besten Ergebnissen zu finden. Er führt dieselbe genetische Suche oder Rastersuche wie die cTrader-Desktopanwendung aus – allerdings über das Terminal und mithilfe einer JSON-Parameterdatei. Er ist das Gegenstück zum Backtesting-Befehl für die Optimierung.

Funktionsumfang

Der Befehl optimize optimiert cBot-Parameter. Indikatoren und Plugins verfügen über eigene Befehle (indicator calculate, indicator history, create, build) und sind nicht Teil der Optimierung.

Voraussetzungen

  • cTrader CLI ist installiert, und Sie können sich anmelden.
  • Der cBot wurde als .algo-Datei exportiert und für .NET 8 kompiliert.
  • Eine Parameterdatei, die festlegt, welche Parameter variiert werden sollen.

Hinweis

Der Befehl optimize ist nur in der lokalen Edition von cTrader CLI verfügbar. Er ist weder in der internen noch in der Cloud-Version enthalten.

Der Befehl optimize

ctrader-cli optimize <path-to-algo-file> --params=<path-to-params-file> [options]

Der Pfad zur .algo-Datei ist das erste Argument. Die Option --params ist erforderlich. Der Basis-Zeitrahmen muss entweder über --timeframe oder in der Parameterdatei festgelegt werden. Wenn er an keiner dieser Stellen definiert ist, bricht der Befehl mit einem Fehler ab.

Optimierungsoptionen

Nur --params ist erforderlich. Häufig verwendete optionale Parameter, die in den folgenden Beispielen vorkommen, sind --timeframe, --method, --criteria, --optres und --passes-dir.

Vor dem Start sollten Sie einige Optionen kennen:

  • --method – genetic (Standard) oder grid. Wählen Sie grid, wenn die Zahl der Parameterkombinationen gering ist und Sie alle testen möchten. Bei vielen Kombinationen ist genetic sinnvoll, da eine gezielte Suche schneller sein kann.
  • --cores – Anzahl paralleler Worker-Prozesse, die die Backtests der einzelnen Durchläufe ausführen. Jeder Worker nutzt einen CPU-Thread. Bei der Optimierung werden daher ungefähr so viele Threads beansprucht, wie hier angegeben. Zulässig sind ganze Zahlen ab 1. Standardmäßig entspricht die Anzahl der Hälfte der Prozessoranzahl plus eins. Verringern Sie den Wert auf einem kleinen VPS, damit Ressourcen für andere Aufgaben frei bleiben. Auf einem dedizierten Rechner können Sie ihn erhöhen, um die genetische Suche auf mehr Threads zu verteilen.
  • --auto-select-best – wählt am Ende der Optimierung automatisch den besten Durchlauf aus, sodass die .cbotset-Datei mit den besten Parametereinstellungen ohne zusätzlichen Schritt bereitsteht.

Hinweis

Der Befehl optimize verwendet --timeframe, nicht --period. Die Befehle run und backtest verwenden weiterhin --period. Bei optimize wird --period als unbekannte Option zurückgewiesen.

Die Parameterdatei

Die mit --params angegebene Datei ist ein JSON-Objekt mit einem Array namens parameters. Sie hat dieselbe Struktur wie eine Datei, die über die Optimierungsoberfläche der cTrader-Desktopanwendung exportiert wird. Daher können Sie eine solche exportierte Datei direkt verwenden.

{
  "parameters": [
    { "Name": "SlowPeriods",  "Optimize": true, "Min": "5",  "Max": "50", "Step": "5" },
    { "Name": "StopLossPips", "Optimize": true, "Min": "10", "Max": "60", "Step": "5" },
    { "Name": "MAType",       "Optimize": true, "Values": ["0", "1", "2"] },
    { "Name": "MySymbol",     "Optimize": true, "Values": ["EURUSD", "GBPUSD"] }
  ]
}

Regeln für die Felder

  • Name ist erforderlich und muss mit dem Namen einer cBot-Eigenschaft übereinstimmen. Führen Sie ctrader-cli metadata <path-to-algo> aus, um die verfügbaren Eigenschaftsnamen anzuzeigen. Ist ein Name nicht in den cBot-Metadaten vorhanden, wird dies protokolliert und der Parameter übersprungen. Die Optimierung wird mit den übrigen Parametern fortgesetzt.
  • Mit Optimize auf true wird der Parameter in die Suche einbezogen. Bei false bleibt sein Wert unverändert.
  • Für Bereichsparameter wie ganze Zahlen und Gleitkommazahlen sind Min, Max und Step erforderlich, wenn sie variiert werden sollen.
  • Für Parameter mit einzelnen zulässigen Werten, etwa Aufzählungen und Symbole, ist beim Variieren ein nicht leeres Array Values erforderlich.
  • ParameterType ist optional. Fehlt dieses Feld, wird der Typ anhand der cBot-Metadaten durch Abgleich mit Name ermittelt.

Einen Parameter auf einen einzelnen Wert festlegen

Um einen Wert festzulegen, nehmen Sie den Parameter mit Optimize: false und seinem Value in die Datei auf:

{ "Name": "MAType",      "Value": "1", "Optimize": false },
{ "Name": "FastPeriods", "Value": "5", "Optimize": false }

Warnung

Maßgeblich ist die Parameterdatei. Vor der Anwendung setzt cTrader CLI alle Parametereinstellungen zurück, sodass nur die mit Optimize: true gekennzeichneten Parameter durchsucht werden. Parameter, die gar nicht in der Datei stehen, behalten ihren Standardwert, selbst wenn der cBot sie standardmäßig für die Optimierung vorsieht. Nehmen Sie einen Parameter mit Optimize: true auf, damit er bei der Optimierung berücksichtigt wird.

Den Haupt-Zeitrahmen optimieren

Mit optimize können Sie neben den cBot-Parametern auch verschiedene Haupt-Zeitrahmen testen. Der Haupt-Zeitrahmen kann aus zwei Quellen stammen; --timeframe hat dabei Vorrang.

  • --timeframe <tf> – ein einzelner Wert legt den Haupt-Zeitrahmen fest; mehrere kommagetrennte Werte ermöglichen die Suche über mehrere Zeitrahmen.
  • Parameterdatei – eine aus der Desktopanwendung exportierte Datei enthält bereits einen dafür vorgesehenen synthetischen Zeitrahmen-Parameter.

Der Basis-Zeitrahmen der Daten entspricht dem einzigen angegebenen Wert, dem festgelegten Wert oder dem kleinsten Zeitrahmen der Suche.

Kompatibilität von Zeitrahmen und Datenmodi

Alle festgelegten oder getesteten Haupt-Zeitrahmen müssen mit dem ausgewählten --data-mode kompatibel sein.

Datenmodus Gültige Haupt-Zeitrahmen
open Zeitrahmen desselben Typs, die ganzzahlige Vielfache des kleinsten ausgewählten Zeitrahmens sind.
m1 oder m1-csv Jeder zeitbasierte Zeitrahmen; nicht zeitbasierte Typen wie Renko- oder Range-Bars werden zurückgewiesen.
ticks Jeder nicht benutzerdefinierte Zeitrahmen.

Hinweis

Eine ungültige Kombination beendet den Befehl bereits vor dem Laden von Daten und zeigt die dafür verantwortlichen Werte an.

Kriterien

Jeder Eintrag von --criteria verbindet eine Leistungskennzahl mit der Richtung max oder min, zum Beispiel NetProfit:max. Die folgende Tabelle enthält alle unterstützten Kennzahlennamen und erklärt, was sie messen.

Kennzahl Was sie misst
NetProfit Abschließender Nettogewinn oder Nettoverlust in der Kontowährung
ProfitFactor Bruttogewinn geteilt durch Bruttoverlust
MaxEquityDrawdownPercentages Größter prozentualer Rückgang des Eigenkapitals von einem Höchststand bis zu einem Tiefststand
MaxBalanceDrawdownPercentages Größter prozentualer Rückgang des Saldos von einem Höchststand bis zu einem Tiefststand
MaxEquityDrawdown Größter absoluter Rückgang des Eigenkapitals in der Kontowährung
MaxBalanceDrawdown Größter absoluter Rückgang des Saldos in der Kontowährung
WinningTrades Anzahl geschlossener Trades mit Gewinn
LosingTrades Anzahl geschlossener Trades mit Verlust
TotalTrades Gesamtzahl geschlossener Trades
AverageTrade Nettogewinn geteilt durch die Anzahl geschlossener Trades

So maximieren Sie den Nettogewinn und minimieren gleichzeitig den maximalen Rückgang des Eigenkapitals:

--criteria="NetProfit:max,MaxEquityDrawdownPercentages:min"

Für eine eigene Bewertung verwenden Sie stattdessen --fitness. Die cBot-Methode GetFitness gibt einen Bewertungswert zurück. Die Optimierung behält die Durchläufe mit den höchsten Werten bei. --fitness und --criteria schließen sich gegenseitig aus. Geben Sie nur eine der beiden Optionen an.

Optionen für die Testumgebung

optimize verwendet dieselben Testumgebungsoptionen wie backtest. Die folgende Tabelle zeigt die von der aktuellen CLI unterstützten Optionen, ihre Funktion und gegebenenfalls die Unterschiede zwischen den beiden Befehlen.

Option Zweck Verfügbarkeit
--account Nummer des Handelskontos. Beide
--symbol Symbol, für das der Test ausgeführt wird. Beide
--start Startdatum und -uhrzeit des Testzeitraums. Beide
--end Enddatum und -uhrzeit des Testzeitraums. Beide
--balance Anfangssaldo der Simulation. Beide
--data-mode open, m1, m1-csv, tick-csv oder ticks. Beide
--data-file Pfad zu einer CSV-Datei für m1-csv oder tick-csv. Beide
--commission Pro Trade berechnete Kommission. Beide
--spread Spread in Pips. Beide
--precise-conversion Präzise Umrechnung für Währungskreuzpaare verwenden. Beide
--timeframe Basis-Zeitrahmen für die Parametersuche. Nur optimize
--period Basis-Zeitrahmen für die Ausführung. Nur backtest
--report Pfad zum Speichern eines HTML-Berichts. Nur backtest
--report-json Pfad zum Speichern eines JSON-Berichts. Nur backtest

Hinweis

Die Berichtsoptionen gelten nicht für optimize. Verwenden Sie stattdessen --optres und --passes-dir, um Ergebnisse zu speichern.

Beispiel

ctrader-cli optimize "C:/test/Sample Trend cBot.algo" \
  --params=C:/test/optimize-params.json \
  --account=1234567 --symbol=EURUSD --timeframe=h1,h2 \
  --start="01/01/2025" --end="01/02/2025" \
  --balance=100000 --data-mode=open --commission=30 --spread=2 \
  --method=grid \
  --criteria="NetProfit:max,MaxEquityDrawdownPercentages:min" \
  --auto-select-best \
  --optres=C:/test/result.optres \
  --passes-dir=C:/test/result-passes \
  --ctid=letstrade --pwd-file=C:/test/password.pwd

Ausgabe

Während der Ausführung zeigt optimize den Fortschritt kontinuierlich im Terminal an:

Progress | Loading EURUSD, h1 | 42.00 % |
Progress | Optimization | 37.50 % |
  • Zusammenfassung – am Ende zeigt cTrader CLI im Terminal eine Zusammenfassung mit der Gesamtzahl der Durchläufe, der verstrichenen Zeit und dem besten Durchlauf samt Statistiken an.
  • Ergebnisdatei – mit --optres schreibt cTrader CLI die vollständigen Ergebnisse aller Durchläufe in eine JSON-Datei mit der Endung .optres. Diese Datei hat dasselbe Format wie die Optimierungsergebnisse der Desktopanwendung. Sie können sie daher über deren Optimierungsoberfläche öffnen oder importieren.
  • Berichte pro Durchlauf – mit --passes-dir speichert cTrader CLI die Berichtsdateien der einzelnen Durchläufe in diesem Verzeichnis. Jeder Durchlauf erhält einen Unterordner mit .html-, .txt-, .json- und .cbotset-Dateien. Die .cbotset-Datei enthält die genauen Parameterwerte, die bei diesem Durchlauf verwendet wurden.

Wenn Sie weder --optres noch --passes-dir angeben, wird zum Abschluss nur die Zusammenfassung ausgegeben.

Hinweis

Der Befehl optimize erstellt keinen globalen HTML-Bericht. Die HTML-Dateien der einzelnen Durchläufe werden jedoch unter --passes-dir gespeichert, wenn Sie diese Option angeben.

Prüfen, ob die Optimierung korrekt angewendet wurde

Prüfen Sie nach der Ausführung, ob tatsächlich die vorgesehenen Parameterkombinationen getestet wurden.

  1. Öffnen Sie eine .cbotset-Datei eines Durchlaufs unter --passes-dir. Kontrollieren Sie, ob sich die optimierten Parameter zwischen den Durchläufen ändern und die festgelegten oder ausgelassenen Parameter unverändert bleiben.
  2. Wenn Sie verschiedene Zeitrahmen getestet haben, prüfen Sie den Wert Chart.Period in der .cbotset-Datei jedes Durchlaufs. Der Wert muss einem der ausgewählten Zeitrahmen entsprechen.
  3. Öffnen Sie die .optres-Datei oder importieren Sie sie in die Optimierungsoberfläche der Desktopanwendung, um die Einstellungen und alle Durchläufe gemeinsam zu überprüfen.

Validierung und häufige Fehler

Jede Zeile der folgenden Tabelle nennt ein Symptom, seine wahrscheinliche Ursache, den von cTrader CLI bei einem Fehler zurückgegebenen Exit-Code und die empfohlene Maßnahme. Bei jedem Validierungsfehler gibt cTrader CLI einen Exit-Code ungleich null zurück. Ein Skript kann deshalb beim ersten Fehler abbrechen, ohne die Fehlermeldung auswerten zu müssen.

Der Exit-Code in der Tabelle ist der Wert, den cTrader CLI an die Shell zurückgibt. Die genauen numerischen Codes werden nicht veröffentlicht. non-zero kennzeichnet daher einen Fehler ohne eigenen veröffentlichten Code. unknown weist auf einen internen Fehler hin, bei dem Sie die Version wechseln oder den Support kontaktieren sollten.

Symptom Wahrscheinliche Ursache Exit-Code Nächster Schritt
Validierungsfehler: --params fehlt Die JSON-Parameterdatei wurde nicht angegeben. non-zero Geben Sie --params=<path> an.
Validierungsfehler: unbekannter Zeitrahmen Der Wert von --timeframe entspricht keiner erkannten Kennung. non-zero Führen Sie ctrader-cli periods aus und verwenden Sie eine der angezeigten Kennungen.
Validierungsfehler: ungültiger Haupt-Zeitrahmen Ein Zeitrahmen ist mit dem ausgewählten --data-mode nicht kompatibel. non-zero Wählen Sie einen anderen Zeitrahmen oder --data-mode.
Validierungsfehler: fehlerhaftes Kriterienpaar Ein Kennzahlenname ist falsch oder die Richtung ist weder max noch min. non-zero Verwenden Sie einen der unterstützten Kennzahlennamen mit max oder min.
Validierungsfehler: unbekannte Leistungskennzahl Ein in --criteria angegebener Name steht nicht in der Liste unterstützter Kennzahlen. non-zero Verwenden Sie einen der Kennzahlennamen aus dem Abschnitt Kriterien.
Validierungsfehler: unbekannter Wert für --method Der Wert von --method ist weder genetic noch grid. non-zero Verwenden Sie --method=genetic (Standard) oder --method=grid.
--fitness und --criteria wurden gleichzeitig angegeben Diese beiden Optionen schließen sich gegenseitig aus. non-zero Geben Sie entweder --fitness oder --criteria an, aber nicht beide.
optimize nicht verfügbar Es wird die interne oder die Cloud-Edition der CLI verwendet. unknown Wechseln Sie zur lokalen Edition für Benutzer.