Vai al contenuto

BacktestingInPlugins Sample

Panoramica

Il plugin BacktestingInPlugins Sample consente di eseguire test di strategie storiche direttamente dall'interfaccia della piattaforma cTrader utilizzando le seguenti funzionalità chiave:

  • Crea un layout di pannello strutturato con un menu a discesa, un pulsante di azione e un campo di visualizzazione dei risultati.
  • Elenca tutti i cBot installati nel menu a discesa per una selezione facile.
  • Esegue un backtest sul simbolo impostato utilizzando dati storici quando attivato.
  • Visualizza la redditività del capitale investito (ROI) e il profitto netto dai risultati del backtest.

Questo plugin viene eseguito in un pannello personalizzato all'interno del Pannello del simbolo attivo e rimane attivo mentre cTrader Windows o Mac è aperto. Si arresta automaticamente quando la piattaforma viene chiusa o riavviata.

Creazione del plugin

Scopri come creare plugin, utilizzando C# o Python, nelle nostre guide passo dopo passo.

Il codice del plugin BacktestingInPlugins Sample è disponibile nei nostri repository pubblici C# e Python. Lo stesso codice è fornito come modello nella procedura guidata di creazione dell'algoritmo in cTrader Windows o Mac, oppure puoi semplicemente copiare e utilizzare lo snippet qui sotto:

  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;

Opzioni di personalizzazione

Questo plugin fornisce un'interfaccia diretta per avviare backtest e visualizzare i risultati di base. La tabella seguente illustra i suoi componenti chiave e le relative funzioni:

Parametro Descrizione Valori possibili
_grid Definisce il layout dell'interfaccia del plugin. (3, 1), (2, 2), ecc.
_startBacktestingButton Personalizza l'aspetto e l'etichetta del pulsante di avvio. Start Backtesting, Color.Green, new CornerRadius(5)
_cBotsComboBox.AddItem Popola il ComboBox con i cBot dal registro. robottype.name
_resultsTextBlock.Text Visualizza messaggi durante il ciclo di backtesting. Seleziona un cBot..., Backtesting in corso..., Riepilogo risultati backtesting, ecc.
CBotsComboBox_SelectedItemChanged Aggiorna il cBot selezionato per il test. obj.selecteditem
StartTimeUtc Data e ora di inizio del backtesting in UTC. new datetime(2023, 6, 1)
EndTimeUtc Data e ora di fine del backtesting in UTC. datetime.utcnow
DataMode Definisce cosa rappresenta ogni movimento del punto dati (1 minuto, 1 ora o 1 giorno). backtestingdatamode.m1
Balance Saldo iniziale del conto virtuale. 10000, 20000, ecc.
Backtesting.Start Definisce su quale simbolo e periodo di tempo eseguire i backtesting. eurusd, timeframe.hour
Backtesting_Completed Estrae e mostra i risultati del test nell'interfaccia. resultsnode[main][roi], resultsnode[main][netprofit], ecc.

Nota

Assicurati che almeno un cBot sia installato in cTrader affinché il menu a discesa si popoli correttamente.

Casi d'uso

Questo plugin fornisce un modo per eseguire test di strategia storici nel Pannello del simbolo attivo. Semplifica la selezione e il test dei cBot, rendendolo ideale per la valutazione delle strategie. Di seguito sono riportati casi d'uso pratici che mostrano come il plugin può essere applicato a scenari di trading reali.

Caso d'uso Scenario Valore
Confronto di strategie Esegui backtesting su più cBot utilizzando condizioni di test identiche. Consente il confronto diretto delle prestazioni all'interno di una singola sessione.
Revisione rapida delle prestazioni Testa qualsiasi cBot installato su una configurazione di mercato standard. Ti aiuta a valutare le prestazioni di un cBot prima di eseguirlo su un conto reale.
Backtesting con regole fisse Convalida le modifiche dell'algoritmo avviando un backtesting predefinito. Garantisce coerenza nelle condizioni di test durante il debug o il test di versione delle strategie.
Strumento per informazioni rapide Visualizza il feedback su ROI e profitto immediatamente dopo aver testato i cBot installati. Fa risparmiare tempo rispetto all'avvio di sessioni di test separate.

Questo plugin fornisce un'interfaccia semplificata per selezionare un cBot ed eseguire un backtesting storico utilizzando impostazioni predefinite. Esegue il test su un simbolo e un periodo di tempo scelti, quindi visualizza metriche di prestazione chiave come ROI e profitto netto. La struttura supporta una rapida convalida della strategia ed è adattabile a vari scenari di trading.

Per ulteriori dettagli sullo sviluppo, consulta la nostra documentazione sui plugin.