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.
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:
usingSystem;usingcAlgo.API;usingcAlgo.API.Collections;usingcAlgo.API.Indicators;usingcAlgo.API.Internals;usingSystem.Linq;usingSystem.Text.Json;usingSystem.Text.Json.Nodes;namespacecAlgo.Plugins{[Plugin(AccessRights = AccessRights.None)]publicclassBacktestingInPluginsSample:Plugin{// Declaring the necessary UI elements// and the cBot (RobotType) selected in the ComboBoxprivateGrid_grid;privateComboBox_cBotsComboBox;privateButton_startBacktestingButton;privateTextBlock_resultsTextBlock;privateRobotType_selectedRobotType;protectedoverridevoidOnStart(){// Initialising and structuring the UI elements_grid=newGrid(3,1);_cBotsComboBox=newComboBox();_startBacktestingButton=newButton{BackgroundColor=Color.Green,CornerRadius=newCornerRadius(5),Text="Start Backtesting",};_resultsTextBlock=newTextBlock{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);varblock=Asp.SymbolTab.AddBlock("Backtesting Plugin");block.Child=_grid;// Populating the ComboBox with existing cBotsPopulateCBotsComboBox();// 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;}protectedvoidStartBacktestingButton_Click(ButtonClickEventArgsobj){// Initialising and configuring the backtesting settingsvarbacktestingSettings=newBacktestingSettings{DataMode=BacktestingDataMode.M1,StartTimeUtc=newDateTime(2023,6,1),EndTimeUtc=DateTime.UtcNow,Balance=10000,};// Starting backtesting on EURUSD h1Backtesting.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...";}protectedvoidPopulateCBotsComboBox(){// Iterating over the AlgoRegistry and// getting the names of all installed cBotsforeach(varrobotTypeinAlgoRegistry.OfType<RobotType>()){_cBotsComboBox.AddItem(robotType.Name);}}protectedvoidBacktesting_Completed(BacktestingCompletedEventArgsobj){// Attaining the JSON results of backtestingstringjsonResults=obj.JsonReport;// Converting the JSON string into a JsonNodeJsonNoderesultsNode=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;}protectedvoidCBotsComboBox_SelectedItemChanged(ComboBoxSelectedItemChangedEventArgsobj){// Updating the variable to always contain// the cBot selected in the ComboBox_selectedRobotType=AlgoRegistry.Get(obj.SelectedItem)asRobotType;}}}
importclrclr.AddReference("cAlgo.API")fromcAlgo.APIimport*fromSystemimportDateTimefromSystem.Text.Json.NodesimportJsonNodefromSystem.Text.JsonimportJsonDocumentOptionsimportjsonclassBacktestingInPluginsSample():defon_start(self):self.grid=Grid(3,1)self.cBotsComboBox=ComboBox()self.startBacktestingButton=Button()self.startBacktestingButton.BackgroundColor=Color.Greenself.startBacktestingButton.CornerRadius=CornerRadius(5)self.startBacktestingButton.Text="Start Backtesting"self.resultsTextBlock=TextBlock()self.resultsTextBlock.HorizontalAlignment=HorizontalAlignment.Centerself.resultsTextBlock.VerticalAlignment=VerticalAlignment.Centerself.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 cBotsself.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;defpopulate_cbots_combobox(self):# Iterating over the AlgoRegistry and getting the names of all installed cBotsforrobotTypeinapi.AlgoRegistry.Robots:self.cBotsComboBox.AddItem(robotType.Name)defon_start_backtesting_button_click(self,args):backtestingSettings=BacktestingSettings()backtestingSettings.DataMode=BacktestingDataMode.M1backtestingSettings.StartTimeUtc=DateTime(DateTime.UtcNow.Year-2,DateTime.UtcNow.Month,DateTime.UtcNow.Day)backtestingSettings.EndTimeUtc=DateTime.UtcNowbacktestingSettings.Balance=10000# Starting backtesting on EURUSD h1self.backtestingProcess=api.Backtesting.Start(self.selectedRobotType,"EURUSD",TimeFrame.Hour,backtestingSettings)# Disabling other controls and changing the text inside the TextBlockself.cBotsComboBox.IsEnabled=Falseself.startBacktestingButton.IsEnabled=Falseself.resultsTextBlock.Text="Backtesting in progress..."defon_cbots_combobox_selected_item_changed(self,args):self.selectedRobotType=RobotType(api.AlgoRegistry.Get(args.SelectedItem))defon_backtesting_completed(self,args):ifint(args.Process.BacktestingError)>0:api.Print(f"Backtesting failed with error {args.Process.BacktestingError}")returnjsonResults=json.loads(args.JsonReport)# # Attaining the ROI and net profit from backtesting resultsself.resultsTextBlock.Text=f"ROI: {jsonResults["main"]["roi"]}\nNet Profit: {jsonResults["main"]["netProfit"]}"# Re-enabling controls after backteting is finishedself.cBotsComboBox.IsEnabled=True;self.startBacktestingButton.IsEnabled=True;
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.
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.
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.