Aller au contenu

Optimiser un cBot

La commande optimize explore différentes valeurs de paramètres d’un cBot afin de trouver les combinaisons offrant les meilleurs résultats selon les critères choisis. Elle effectue la même recherche par algorithme génétique ou par grille que l'application de bureau cTrader, mais depuis le terminal, à l’aide d’un fichier JSON contenant les paramètres. C’est l’équivalent, pour l’optimisation, de la commande de backtesting.

Périmètre

La commande optimize optimise les paramètres des cBots. Les indicateurs et les plugins disposent de leurs propres commandes (indicator calculate, indicator history, create, build) et ne font pas partie de l’optimisation.

Prérequis

  • cTrader CLI est installé et vous pouvez vous connecter.
  • Le cBot est exporté dans un fichier .algo et compilé pour .NET 8.
  • Un fichier de paramètres définissant les paramètres à faire varier.

Remarque

La commande optimize est uniquement disponible dans l’édition locale de cTrader CLI. Elle n’est pas incluse dans les versions internes ou cloud.

La commande optimize

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

Le chemin du fichier .algo est le premier argument. L’option --params est obligatoire. L’unité de temps de base doit être définie soit par --timeframe, soit dans le fichier de paramètres. Si elle n’est définie à aucun de ces endroits, la commande s’arrête avec une erreur.

Options d’optimisation

Seule l’option --params est obligatoire. Les options facultatives les plus courantes, utilisées dans les exemples ci-dessous, sont --timeframe, --method, --criteria, --optres et --passes-dir.

Quelques options méritent d’être connues avant de commencer :

  • --method – genetic (valeur par défaut) ou grid. Choisissez grid si le nombre de combinaisons de paramètres est limité et que vous souhaitez toutes les tester ; choisissez genetic si les possibilités sont nombreuses et qu’une recherche guidée est plus rapide.
  • --cores – nombre d’unités de traitement parallèles exécutant la phase de backtesting de chaque passe. Chaque unité de traitement utilise un thread du processeur. L’optimisation mobilise donc approximativement autant de threads que la valeur indiquée. Les valeurs acceptées sont les entiers supérieurs ou égaux à 1. Par défaut, ce nombre correspond à la moitié du nombre de processeurs, plus un. Réduisez cette valeur sur un petit VPS pour laisser des ressources aux autres tâches, ou augmentez-la sur une machine dédiée afin de répartir la recherche génétique sur davantage de threads.
  • --auto-select-best – sélectionne automatiquement la meilleure passe à la fin de l’optimisation, afin de disposer du fichier .cbotset le plus performant sans étape supplémentaire.

Remarque

La commande optimize utilise --timeframe, et non --period. Les commandes run et backtest continuent d’utiliser --period. L’option --period est rejetée par optimize comme une option inconnue.

Le fichier de paramètres

Le fichier indiqué par --params est un objet JSON contenant un tableau parameters. Il suit le même format que les fichiers exportés depuis l’interface d’optimisation de l’application de bureau cTrader. Vous pouvez donc utiliser directement un fichier exporté depuis cette application.

{
  "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"] }
  ]
}

Règles des champs

  • Le champ Name est obligatoire et doit correspondre au nom d’une propriété du cBot. Exécutez ctrader-cli metadata <path-to-algo> pour connaître les noms des propriétés disponibles. Si un nom n’est pas présent dans les métadonnées du cBot, il est consigné dans le journal puis ignoré ; l’optimisation se poursuit avec les autres paramètres.
  • La valeur true de Optimize inclut le paramètre dans l’exploration. La valeur false le maintient fixe.
  • Pour les paramètres de type plage de valeurs, comme les entiers et les nombres à virgule flottante, les champs Min, Max et Step sont nécessaires si le paramètre doit varier.
  • Pour les paramètres à valeurs discrètes, comme les énumérations et les symboles, un tableau Values non vide est nécessaire si le paramètre doit varier.
  • Le champ ParameterType est facultatif. En son absence, le type est déterminé à partir des métadonnées du cBot en faisant correspondre Name.

Fixer un paramètre à une seule valeur

Pour conserver une valeur fixe, ajoutez le paramètre avec Optimize: false et sa Value :

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

Avertissement

Le fichier de paramètres fait autorité. Avant de l’appliquer, cTrader CLI réinitialise tous les paramètres afin que seuls ceux indiqués avec Optimize: true soient explorés. Un paramètre entièrement absent du fichier conserve sa valeur par défaut, même si le cBot le définit par défaut comme étant à optimiser. Ajoutez un paramètre avec Optimize: true pour l’inclure dans l’optimisation.

Optimiser l’unité de temps principale

La commande optimize peut explorer plusieurs unités de temps principales en plus des paramètres du cBot. L’unité de temps principale peut provenir de deux sources, --timeframe étant prioritaire.

  • --timeframe <tf> – une seule valeur fixe l’unité de temps principale ; plusieurs valeurs séparées par des virgules permettent de la faire varier.
  • Fichier de paramètres – un fichier exporté depuis l’application de bureau contient déjà un paramètre synthétique représentant l’unité de temps à cet effet.

L’unité de temps de base des données correspond à la valeur unique, à la valeur fixe ou à la plus petite des valeurs explorées.

Compatibilité des unités de temps et des modes de données

Les unités de temps principales explorées ou fixées doivent être compatibles avec le --data-mode sélectionné.

Mode de données Unités de temps principales valides
open Unités de temps du même type et multiples exacts de la plus petite unité de temps sélectionnée.
m1 ou m1-csv Toute unité de temps basée sur le temps ; les unités non temporelles, comme Renko ou les barres de range, sont rejetées.
ticks Toute unité de temps non personnalisée.

Remarque

Une combinaison non valide arrête la commande avant tout chargement de données et affiche les valeurs responsables de l’échec.

Critères

Chaque élément de --criteria associe un indicateur de performance à une direction max ou min, par exemple NetProfit:max. Le tableau ci-dessous énumère tous les noms d’indicateurs pris en charge et précise ce qu’ils mesurent.

Indicateur Ce qu’il mesure
NetProfit Profit ou perte final, exprimé dans la devise du compte
ProfitFactor Profit brut divisé par la perte brute
MaxEquityDrawdownPercentages Plus forte baisse des fonds propres, en pourcentage, entre un sommet et un creux
MaxBalanceDrawdownPercentages Plus forte baisse du solde, en pourcentage, entre un sommet et un creux
MaxEquityDrawdown Plus forte baisse absolue des fonds propres, exprimée dans la devise du compte
MaxBalanceDrawdown Plus forte baisse absolue du solde, exprimée dans la devise du compte
WinningTrades Nombre de trades clôturés avec un profit
LosingTrades Nombre de trades clôturés avec une perte
TotalTrades Nombre total de trades clôturés
AverageTrade Profit net divisé par le nombre de trades clôturés

Pour maximiser le profit net tout en minimisant le drawdown maximal des fonds propres :

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

Pour définir votre propre classement, utilisez plutôt --fitness. La méthode GetFitness du cBot renvoie un score ; l’optimisation conserve les passes ayant obtenu les valeurs les plus élevées. Les options --fitness et --criteria sont incompatibles : indiquez-en une seule.

Options du contexte de test

optimize reprend les options de contexte de test de backtest. Le tableau ci-dessous répertorie les options acceptées par la CLI actuelle, leur fonction et, lorsque c’est pertinent, les différences entre les deux commandes.

Option Fonction Disponibilité
--account Numéro du compte de trading. Les deux
--symbol Symbole sur lequel effectuer le test. Les deux
--start Date et heure de début de la période de test. Les deux
--end Date et heure de fin de la période de test. Les deux
--balance Solde initial de la simulation. Les deux
--data-mode open, m1, m1-csv, tick-csv ou ticks. Les deux
--data-file Chemin d’un fichier CSV pour m1-csv ou tick-csv. Les deux
--commission Montant de la commission par trade. Les deux
--spread Spread en pips. Les deux
--precise-conversion Utiliser une conversion précise pour les paires de devises croisées. Les deux
--timeframe Unité de temps de base pour l’exploration des paramètres. optimize uniquement
--period Unité de temps de base pour l’exécution. backtest uniquement
--report Chemin d’enregistrement d’un rapport HTML. backtest uniquement
--report-json Chemin d’enregistrement d’un rapport JSON. backtest uniquement

Remarque

Les options de rapport ne s’appliquent pas à optimize : utilisez plutôt --optres et --passes-dir pour enregistrer les résultats.

Exemple

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

Résultat

Pendant l’exécution, optimize affiche la progression en continu dans le terminal :

Progress | Loading EURUSD, h1 | 42.00 % |
Progress | Optimization | 37.50 % |
  • Résumé – à la fin de l’optimisation, cTrader CLI affiche dans le terminal un récapitulatif comprenant le nombre total de passes, la durée écoulée et la meilleure passe avec ses statistiques.
  • Fichier de résultats – si vous indiquez --optres, cTrader CLI écrit les résultats complets dans un fichier JSON .optres répertoriant toutes les passes. Ce fichier utilise le même format que les résultats d’optimisation de l’application de bureau : vous pouvez donc l’ouvrir ou l’importer dans son interface d’optimisation.
  • Rapports par passe – si vous indiquez --passes-dir, cTrader CLI enregistre les rapports individuels dans ce répertoire, avec un sous-dossier par passe contenant des fichiers .html, .txt, .json et .cbotset. Le fichier .cbotset indique les valeurs exactes des paramètres utilisées lors de cette passe.

Si vous ne spécifiez ni --optres ni --passes-dir, l’optimisation se termine en affichant uniquement le résumé.

Remarque

La commande optimize ne génère pas de rapport HTML global. Les fichiers HTML de chaque passe sont néanmoins enregistrés dans --passes-dir si vous indiquez cette option.

Vérifier que l’optimisation a été correctement appliquée

Après l’exécution, vérifiez que l’exploration des paramètres correspond bien à ce que vous aviez prévu.

  1. Ouvrez le fichier .cbotset d’une passe dans --passes-dir et vérifiez que les paramètres optimisés changent d’une passe à l’autre, tandis que les paramètres fixés ou omis restent inchangés.
  2. Si vous avez fait varier l’unité de temps, vérifiez la valeur Chart.Period dans le fichier .cbotset de chaque passe. Elle doit correspondre à l’une des unités de temps sélectionnées.
  3. Ouvrez le fichier .optres ou importez-le dans l’interface d’optimisation de l’application de bureau pour examiner ensemble la configuration et toutes les passes.

Validation et erreurs courantes

Chaque ligne du tableau ci-dessous présente un symptôme, sa cause probable, le code de sortie renvoyé par cTrader CLI en cas d’échec et l’action à entreprendre. cTrader CLI renvoie un code de sortie non nul pour chaque erreur de validation. Un script peut donc s’arrêter dès la première erreur sans analyser le message.

Dans le tableau, le code de sortie correspond à la valeur renvoyée par cTrader CLI au shell. Les codes numériques précis ne sont pas publiés. La mention non-zero indique donc un échec sans code distinct ; unknown désigne une erreur interne, pour laquelle il faut changer de version ou contacter l’assistance.

Symptôme Cause probable Code de sortie Étape suivante
Erreur de validation : option --params manquante Le fichier JSON de paramètres n’a pas été fourni. non-zero Indiquez --params=<path>.
Erreur de validation : unité de temps inconnue La valeur de --timeframe ne correspond à aucun identifiant reconnu. non-zero Exécutez ctrader-cli periods et utilisez l’un des identifiants répertoriés.
Erreur de validation : unité de temps principale non valide Une unité de temps n’est pas compatible avec le --data-mode choisi. non-zero Choisissez une autre unité de temps ou un autre --data-mode.
Erreur de validation : paires de critères mal formées Un nom d’indicateur est incorrect ou la direction n’est ni max ni min. non-zero Utilisez l’un des noms d’indicateurs pris en charge avec max ou min.
Erreur de validation : indicateur de performance inconnu Un nom indiqué dans --criteria ne figure pas dans la liste des noms pris en charge. non-zero Utilisez l’un des noms d’indicateurs répertoriés dans la section Critères.
Erreur de validation : valeur de --method inconnue La valeur de --method n’est ni genetic ni grid. non-zero Utilisez --method=genetic (par défaut) ou --method=grid.
--fitness et --criteria indiqués simultanément Ces deux options sont incompatibles. non-zero Indiquez --fitness ou --criteria, mais pas les deux.
optimize indisponible La version de la CLI utilisée est l’édition interne ou cloud. unknown Passez à l’édition locale destinée aux utilisateurs.