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
.algoet 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) ougrid. Choisissezgridsi le nombre de combinaisons de paramètres est limité et que vous souhaitez toutes les tester ; choisissezgeneticsi 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.cbotsetle 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
Nameest obligatoire et doit correspondre au nom d’une propriété du cBot. Exécutezctrader-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
truedeOptimizeinclut le paramètre dans l’exploration. La valeurfalsele maintient fixe. - Pour les paramètres de type plage de valeurs, comme les entiers et les nombres à virgule flottante, les champs
Min,MaxetStepsont nécessaires si le paramètre doit varier. - Pour les paramètres à valeurs discrètes, comme les énumérations et les symboles, un tableau
Valuesnon vide est nécessaire si le paramètre doit varier. - Le champ
ParameterTypeest facultatif. En son absence, le type est déterminé à partir des métadonnées du cBot en faisant correspondreName.
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.optresré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,.jsonet.cbotset. Le fichier.cbotsetindique 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.
- Ouvrez le fichier
.cbotsetd’une passe dans--passes-diret 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. - Si vous avez fait varier l’unité de temps, vérifiez la valeur
Chart.Perioddans le fichier.cbotsetde chaque passe. Elle doit correspondre à l’une des unités de temps sélectionnées. - Ouvrez le fichier
.optresou 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. |