Zum Inhalt

BacktestingInPlugins Sample

Übersicht

Das BacktestingInPlugins Sample-Plugin ermöglicht das Ausführen historischer Strategietests direkt über die cTrader-Plattformoberfläche mithilfe der folgenden Hauptfunktionen:

  • Erstellt ein strukturiertes Panel-Layout mit einem Dropdown-Menü, einer Aktionsschaltfläche und einem Ergebnisanzeigefeld.
  • Listet alle installierten cBots im Dropdown zur einfachen Auswahl auf.
  • Führt einen Backtest für das festgelegte Symbol mithilfe historischer Daten aus, wenn er ausgelöst wird.
  • Zeigt die Kapitalrendite (ROI) und den Nettogewinn aus den Backtest-Ergebnissen an.

Dieses Plugin läuft in einem benutzerdefinierten Panel im Bereich eines aktiven Symbols und bleibt aktiv, während cTrader Windows oder Mac geöffnet ist. Es stoppt automatisch, wenn die Plattform geschlossen oder neu gestartet wird.

Plugin-Erstellung

Erfahren Sie, wie Sie Plugins erstellen, entweder mit C# oder Python, in unseren schrittweisen Anleitungen.

Der BacktestingInPlugins Sample-Plugin-Code ist in unseren öffentlichen C#- und Python-Repositories verfügbar. Derselbe Code wird als Vorlage im Algorithmen-Erstellungsassistenten in cTrader Windows oder Mac bereitgestellt, oder Sie können einfach den folgenden Ausschnitt kopieren und verwenden:

  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;

Anpassungsoptionen

Dieses Plugin bietet eine direkte Schnittstelle zum Initiieren von Backtests und zum Anzeigen grundlegender Ergebnisse. Die folgende Tabelle beschreibt seine Hauptkomponenten und deren Funktionen:

Parameter Beschreibung Mögliche Werte
_grid Definiert das Layout für die Plugin-Oberfläche. (3, 1), (2, 2), usw.
_startBacktestingButton Passt das Erscheinungsbild und die Beschriftung der Startschaltfläche an. Start Backtesting, Color.Green, new CornerRadius(5)
_cBotsComboBox.AddItem Füllt die ComboBox mit cBots aus der Registry. robottype.name
_resultsTextBlock.Text Zeigt Meldungen während des Backtest-Zyklus an. Wählen Sie einen cBot aus..., Backtesting läuft..., Backtesting-Ergebniszusammenfassung, usw.
CBotsComboBox_SelectedItemChanged Aktualisiert den ausgewählten cBot zum Testen. obj.selecteditem
StartTimeUtc Backtest-Startdatum und -zeit in UTC. new datetime(2023, 6, 1)
EndTimeUtc Backtest-Enddatum und -zeit in UTC. datetime.utcnow
DataMode Definiert, was jede Datenpunktbewegung darstellt (1 Minute, 1 Stunde oder 1 Tag). backtestingdatamode.m1
Balance Virtueller Startkontosaldo. 10000, 20000, usw.
Backtesting.Start Definiert, auf welchem Symbol und Zeitrahmen Backtests ausgeführt werden sollen. eurusd, timeframe.hour
Backtesting_Completed Extrahiert und zeigt Testergebnisse in der Benutzeroberfläche an. resultsnode[main][roi], resultsnode[main][netprofit], usw.

Hinweis

Stellen Sie sicher, dass mindestens ein cBot in cTrader installiert ist, damit das Dropdown korrekt gefüllt wird.

Anwendungsfälle

Dieses Plugin bietet eine Möglichkeit, historische Strategietests im Bereich eines aktiven Symbols auszuführen. Es vereinfacht die Auswahl und das Testen von cBots und ist ideal für die Strategiebewertung. Nachfolgend finden Sie praktische Anwendungsfälle, die zeigen, wie das Plugin auf reale Handelsszenarien angewendet werden kann.

Anwendungsfall Szenario Wert
Strategievergleich Führen Sie Backtests auf mehreren cBots mit identischen Testbedingungen aus. Ermöglicht einen direkten Leistungsvergleich innerhalb einer einzigen Sitzung.
Schnelle Leistungsüberprüfung Testen Sie jeden installierten cBot auf einem Standard-Markt-Setup. Hilft Ihnen, die Leistung eines cBots zu bewerten, bevor Sie ihn auf einem Live-Konto ausführen.
Backtest mit festen Regeln Validieren Sie Algorithmusänderungen durch Starten eines vordefinierten Backtests. Gewährleistet Konsistenz der Testbedingungen beim Debuggen oder Versionstesten von Strategien.
Schnelles Einblicke-Tool Zeigen Sie ROI- und Gewinn-Feedback sofort nach dem Testen installierter cBots an. Spart Zeit im Vergleich zum Starten separater Testsitzungen.

Zusammenfassung

Dieses Plugin bietet eine optimierte Oberfläche zur Auswahl eines cBots und zum Ausführen eines historischen Backtests mit vordefinierten Einstellungen. Es führt den Test auf einem ausgewählten Symbol und Zeitrahmen aus und zeigt dann wichtige Leistungskennzahlen wie ROI und Nettogewinn an. Die Struktur unterstützt eine schnelle Strategievalidierung und ist für verschiedene Handelsszenarien anpassbar.

Weitere Entwicklungsdetails finden Sie in unserer Plugin-Dokumentation.