Przejdź do treści

BacktestingInPlugins Sample

Przegląd

Wtyczka BacktestingInPlugins Sample umożliwia uruchamianie testów strategii historycznych bezpośrednio z interfejsu platformy cTrader przy użyciu następujących kluczowych funkcji:

  • Tworzy ustrukturyzowany układ panelu z menu rozwijanym, przyciskiem akcji i polem wyświetlania wyników.
  • Wyświetla wszystkie zainstalowane cBoty w menu rozwijanym w celu łatwego wyboru.
  • Uruchamia backtest na ustawionym symbolu przy użyciu danych historycznych po uruchomieniu.
  • Wyświetla zwrot z inwestycji (ROI) i zysk netto z wyników backtestingu.

Ta wtyczka działa w niestandardowym panelu w Panelu aktywnego symbolu i pozostaje aktywna, gdy cTrader Windows lub Mac jest otwarty. Zatrzymuje się automatycznie, gdy platforma jest zamknięta lub uruchomiona ponownie.

Tworzenie wtyczki

Dowiedz się, jak tworzyć wtyczki, używając C# lub Pythona, w naszych krok po kroku przewodnikach.

Kod wtyczki BacktestingInPlugins Sample jest dostępny w naszych publicznych repozytoriach C# i Python. Ten sam kod jest dostarczany jako szablon w kreatorze tworzenia algorytmu w cTrader Windows lub Mac, lub możesz po prostu skopiować i użyć poniższego fragmentu:

  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;

Opcje dostosowywania

Ta wtyczka zapewnia bezpośredni interfejs do inicjowania backtestów i przeglądania podstawowych wyników. Poniższa tabela przedstawia jej kluczowe komponenty i ich funkcje:

Parametr Opis Możliwe wartości
_grid Definiuje układ interfejsu wtyczki. (3, 1), (2, 2), itd.
_startBacktestingButton Dostosowuje wygląd i etykietę przycisku startu. Start Backtesting, Color.Green, new CornerRadius(5)
_cBotsComboBox.AddItem Wypełnia ComboBox cBotami z rejestru. robottype.name
_resultsTextBlock.Text Wyświetla komunikaty podczas cyklu backtestingu. Wybierz cBota..., Backtesting w toku..., Podsumowanie wyników backtestingu, itd.
CBotsComboBox_SelectedItemChanged Aktualizuje wybranego cBota do testowania. obj.selecteditem
StartTimeUtc Data i godzina rozpoczęcia backtestingu w UTC. new datetime(2023, 6, 1)
EndTimeUtc Data i godzina zakończenia backtestingu w UTC. datetime.utcnow
DataMode Definiuje, co reprezentuje każdy ruch punktu danych (1 minuta, 1 godzina lub 1 dzień). backtestingdatamode.m1
Balance Początkowe saldo konta wirtualnego. 10000, 20000, itd.
Backtesting.Start Definiuje, na jakim symbolu i ramach czasowych uruchamiać backtesty. eurusd, timeframe.hour
Backtesting_Completed Wyodrębnia i pokazuje wyniki testów w interfejsie użytkownika. resultsnode[main][roi], resultsnode[main][netprofit], itd.

Uwaga

Upewnij się, że w cTrader jest zainstalowany co najmniej jeden cBot, aby menu rozwijane zostało poprawnie wypełnione.

Przypadki użycia

Ta wtyczka zapewnia sposób na uruchamianie testów strategii historycznych w Panelu aktywnego symbolu. Upraszcza wybieranie i testowanie cBotów, co czyni ją idealną do oceny strategii. Poniżej przedstawiono praktyczne przypadki użycia, które pokazują, jak wtyczka może być zastosowana w rzeczywistych scenariuszach handlowych.

Przypadek użycia Scenariusz Wartość
Porównanie strategii Uruchamiaj backtesting na wielu cBotach przy użyciu identycznych warunków testowych. Umożliwia bezpośrednie porównanie wydajności w ramach jednej sesji.
Szybki przegląd wydajności Testuj dowolnego zainstalowanego cBota na standardowej konfiguracji rynkowej. Pomaga ocenić wydajność cBota przed uruchomieniem go na koncie rzeczywistym.
Backtesting ze stałymi regułami Weryfikuj zmiany w algorytmie, uruchamiając wstępnie zdefiniowany backtesting. Zapewnia spójność warunków testowych podczas debugowania lub testowania wersji strategii.
Narzędzie szybkiego wglądu Wyświetlaj ROI i informacje zwrotne dotyczące zysku natychmiast po przetestowaniu zainstalowanych cBotów. Oszczędza czas w porównaniu z uruchamianiem oddzielnych sesji testowych.

Podsumowanie

Ta wtyczka zapewnia usprawniony interfejs do wybierania cBota i uruchamiania backtestingu historycznego przy użyciu wstępnie zdefiniowanych ustawień. Uruchamia test na wybranym symbolu i przedziale czasowym, a następnie wyświetla kluczowe wskaźniki wydajności, takie jak ROI i zysk netto. Struktura wspiera szybką walidację strategii i jest adaptowalna do różnych scenariuszy handlowych.

Aby uzyskać więcej szczegółów dotyczących rozwoju, zapoznaj się z naszą dokumentacją wtyczek.