Aller au contenu

BacktestingInPlugins Sample

Présentation

Le plug-in BacktestingInPlugins Sample permet d'exécuter des tests de stratégie historiques directement depuis l'interface de la plateforme cTrader en utilisant les fonctionnalités clés suivantes :

  • Crée une disposition de panneau structurée avec un menu déroulant, un bouton d'action et un champ d'affichage des résultats.
  • Répertorie tous les cBots installés dans le menu déroulant pour une sélection facile.
  • Exécute un backtest sur le symbole défini en utilisant des données historiques lorsqu'il est déclenché.
  • Affiche le retour sur investissement (ROI) et le profit net à partir des résultats du backtest.

Ce plug-in s'exécute dans un panneau personnalisé au sein du Panneau de symbole actif et reste actif tant que cTrader Windows ou Mac est ouvert. Il s'arrête automatiquement lorsque la plateforme est fermée ou redémarrée.

Création de plug-in

Apprenez à créer des plug-ins, en utilisant C# ou Python, dans nos guides étape par étape.

Le code du plug-in BacktestingInPlugins Sample est disponible dans nos dépôts publics C# et Python. Le même code est fourni comme modèle dans l'assistant de création d'algorithme dans cTrader Windows ou Mac, ou vous pouvez simplement copier et utiliser l'extrait ci-dessous :

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
using System;
using cAlgo.API;
using cAlgo.API.Collections;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;
using System.Linq;
using System.Text.Json;
using System.Text.Json.Nodes;

namespace cAlgo.Plugins
{
    [Plugin(AccessRights = AccessRights.None)]
    public class BacktestingInPluginsSample : Plugin
    {
        // Declaring the necessary UI elements
        // and the cBot (RobotType) selected in the ComboBox
        private Grid _grid;
        private ComboBox _cBotsComboBox;
        private Button _startBacktestingButton;
        private TextBlock _resultsTextBlock;
        private RobotType _selectedRobotType;

        protected override void OnStart()
        {
            // Initialising and structuring the UI elements
            _grid = new Grid(3, 1);
            _cBotsComboBox = new ComboBox();
            _startBacktestingButton = new Button
            {
                BackgroundColor = Color.Green,
                CornerRadius = new CornerRadius(5),
                Text = "Start Backtesting",
            };
            _resultsTextBlock = new TextBlock
            {
                HorizontalAlignment = HorizontalAlignment.Center,
                VerticalAlignment = VerticalAlignment.Center,
                Text = "Select a cBot...",
            };

            _grid.AddChild(_cBotsComboBox, 0, 0);
            _grid.AddChild(_startBacktestingButton, 1, 0);
            _grid.AddChild(_resultsTextBlock, 2, 0);

            var block = Asp.SymbolTab.AddBlock("Backtesting Plugin");
            block.Child = _grid;

            // Populating the ComboBox with existing cBots
            PopulateCBotsComboBox();

            // Assigning event handlers to the Button.Click,
            // ComboBox.SelectedItemChanged, and Backtesting.Completed events
            _startBacktestingButton.Click += StartBacktestingButton_Click;
            _cBotsComboBox.SelectedItemChanged += CBotsComboBox_SelectedItemChanged;
            Backtesting.Completed += Backtesting_Completed;
        }

        protected void StartBacktestingButton_Click(ButtonClickEventArgs obj)
        {
            // Initialising and configuring the backtesting settings
            var backtestingSettings = new BacktestingSettings 
            {
                DataMode = BacktestingDataMode.M1,
                StartTimeUtc = new DateTime(2023, 6, 1),
                EndTimeUtc = DateTime.UtcNow,
                Balance = 10000,
            };

            // Starting backtesting on EURUSD h1
            Backtesting.Start(_selectedRobotType, "EURUSD", TimeFrame.Hour, backtestingSettings);

            // Disabling other controls and changing
            // the text inside the TextBlock
            _cBotsComboBox.IsEnabled = false;
            _startBacktestingButton.IsEnabled = false;
            _resultsTextBlock.Text = "Backtesting in progress...";
        }

        protected void PopulateCBotsComboBox()
        {
            // Iterating over the AlgoRegistry and
            // getting the names of all installed cBots
            foreach (var robotType in AlgoRegistry.OfType<RobotType>())
            {
                _cBotsComboBox.AddItem(robotType.Name);
            }
        }

        protected void Backtesting_Completed(BacktestingCompletedEventArgs obj)
        {
            // Attaining the JSON results of backtesting
            string jsonResults = obj.JsonReport;

            // Converting the JSON string into a JsonNode
            JsonNode resultsNode = JsonNode.Parse(jsonResults);

            // Attaining the ROI and net profit from backtesting results
            _resultsTextBlock.Text = $"ROI: {resultsNode["main"]["roi"]}\nNet Profit: {resultsNode["main"]["netProfit"]}";

            // Re-enabling controls after backtesting is finished
            _cBotsComboBox.IsEnabled = true;
            _startBacktestingButton.IsEnabled = true;
        }

        protected void CBotsComboBox_SelectedItemChanged(ComboBoxSelectedItemChangedEventArgs obj)
        {
            // Updating the variable to always contain
            // the cBot selected in the ComboBox
            _selectedRobotType = AlgoRegistry.Get(obj.SelectedItem) as RobotType;
        }
    }
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
import clr
clr.AddReference("cAlgo.API")

from cAlgo.API import *

from System import DateTime
from System.Text.Json.Nodes import JsonNode
from System.Text.Json import JsonDocumentOptions
import json

class BacktestingInPluginsSample():
    def on_start(self):
        self.grid = Grid(3, 1)

        self.cBotsComboBox = ComboBox()

        self.startBacktestingButton = Button()
        self.startBacktestingButton.BackgroundColor = Color.Green
        self.startBacktestingButton.CornerRadius = CornerRadius(5)
        self.startBacktestingButton.Text = "Start Backtesting"

        self.resultsTextBlock = TextBlock()
        self.resultsTextBlock.HorizontalAlignment = HorizontalAlignment.Center
        self.resultsTextBlock.VerticalAlignment = VerticalAlignment.Center
        self.resultsTextBlock.Text = "Select a cBot..."

        self.grid.AddChild(self.cBotsComboBox, 0, 0)
        self.grid.AddChild(self.startBacktestingButton, 1, 0)
        self.grid.AddChild(self.resultsTextBlock, 2, 0)

        block = api.Asp.SymbolTab.AddBlock("Backtesting Plugin")
        block.Child = self.grid

        # Populating the ComboBox with existing cBots
        self.populate_cbots_combobox();

        self.startBacktestingButton.Click += self.on_start_backtesting_button_click;
        self.cBotsComboBox.SelectedItemChanged += self.on_cbots_combobox_selected_item_changed;
        api.Backtesting.Completed += self.on_backtesting_completed;

    def populate_cbots_combobox(self):
        # Iterating over the AlgoRegistry and getting the names of all installed cBots
        for robotType in api.AlgoRegistry.Robots:
            self.cBotsComboBox.AddItem(robotType.Name)

    def on_start_backtesting_button_click(self, args):
        backtestingSettings = BacktestingSettings()
        backtestingSettings.DataMode = BacktestingDataMode.M1
        backtestingSettings.StartTimeUtc = DateTime(DateTime.UtcNow.Year - 2, DateTime.UtcNow.Month, DateTime.UtcNow.Day)
        backtestingSettings.EndTimeUtc = DateTime.UtcNow
        backtestingSettings.Balance = 10000

        # Starting backtesting on EURUSD h1
        self.backtestingProcess = api.Backtesting.Start(self.selectedRobotType, "EURUSD", TimeFrame.Hour, backtestingSettings)

        # Disabling other controls and changing the text inside the TextBlock
        self.cBotsComboBox.IsEnabled = False
        self.startBacktestingButton.IsEnabled = False
        self.resultsTextBlock.Text = "Backtesting in progress..."

    def on_cbots_combobox_selected_item_changed(self, args):
        self.selectedRobotType = RobotType(api.AlgoRegistry.Get(args.SelectedItem))

    def on_backtesting_completed(self, args):
        if int(args.Process.BacktestingError) > 0:
            api.Print(f"Backtesting failed with error {args.Process.BacktestingError}")
            return

        jsonResults = json.loads(args.JsonReport)

        # # Attaining the ROI and net profit from backtesting results
        self.resultsTextBlock.Text = f"ROI: {jsonResults["main"]["roi"]}\nNet Profit: {jsonResults["main"]["netProfit"]}"

        # Re-enabling controls after backteting is finished
        self.cBotsComboBox.IsEnabled = True;
        self.startBacktestingButton.IsEnabled = True;

Options de personnalisation

Ce plug-in fournit une interface directe pour lancer des backtests et visualiser les résultats de base. Le tableau ci-dessous décrit ses composants clés et leurs fonctions :

Paramètre Description Valeurs possibles
_grid Définit la disposition de l'interface du plug-in. (3, 1), (2, 2), etc.
_startBacktestingButton Personnalise l'apparence et l'étiquette du bouton de démarrage. Start Backtesting, Color.Green, new CornerRadius(5)
_cBotsComboBox.AddItem Remplit la ComboBox avec les cBots du registre. robottype.name
_resultsTextBlock.Text Affiche des messages pendant le cycle de backtest. Sélectionnez un cBot..., Backtest en cours..., Résumé des résultats du backtest, etc.
CBotsComboBox_SelectedItemChanged Met à jour le cBot sélectionné pour les tests. obj.selecteditem
StartTimeUtc Date et heure de début du backtest en UTC. new datetime(2023, 6, 1)
EndTimeUtc Date et heure de fin du backtest en UTC. datetime.utcnow
DataMode Définit ce que représente chaque mouvement de point de données (1 minute, 1 heure ou 1 jour). backtestingdatamode.m1
Balance Solde de compte virtuel de départ. 10000, 20000, etc.
Backtesting.Start Définit sur quel symbole et quelle période exécuter les backtests. eurusd, timeframe.hour
Backtesting_Completed Extrait et affiche les résultats des tests dans l'interface utilisateur. resultsnode[main][roi], resultsnode[main][netprofit], etc.

Remarque

Assurez-vous qu'au moins un cBot est installé dans cTrader pour que le menu déroulant se remplisse correctement.

Cas d'usage

Ce plug-in offre un moyen d'exécuter des tests de stratégie historiques dans le Panneau de symbole actif. Il simplifie la sélection et le test des cBots, ce qui le rend idéal pour l'évaluation de stratégies. Vous trouverez ci-dessous des cas d'utilisation pratiques qui montrent comment le plug-in peut être appliqué à des scénarios de trading réels.

Cas d'utilisation Scénario Valeur
Comparaison de stratégies Exécutez des backtests sur plusieurs cBots en utilisant des conditions de test identiques. Permet une comparaison directe des performances au cours d'une seule session.
Examen rapide des performances Testez n'importe quel cBot installé sur une configuration de marché standard. Vous aide à évaluer les performances d'un cBot avant de l'exécuter sur un compte réel.
Backtest à règles fixes Validez les modifications d'algorithme en lançant un backtest prédéfini. Garantit la cohérence des conditions de test lors du débogage ou du test de version des stratégies.
Outil d'informations rapides Visualisez le ROI et les retours de profit immédiatement après avoir testé les cBots installés. Permet de gagner du temps par rapport au lancement de sessions de test séparées.

Résumé

Ce plug-in fournit une interface simplifiée pour sélectionner un cBot et exécuter un backtest historique en utilisant des paramètres prédéfinis. Il exécute le test sur un symbole et une période choisis, puis affiche des indicateurs de performance clés tels que le ROI et le profit net. La structure prend en charge la validation rapide de stratégie et est adaptable à divers scénarios de trading.

Pour plus de détails sur le développement, consultez notre documentation sur les plug-ins.