Перейти к содержанию

BacktestingInPlugins Sample

Обзор

Плагин BacktestingInPlugins Sample позволяет запускать тестирование исторических стратегий непосредственно из интерфейса платформы cTrader, используя следующие ключевые функции:

  • Создает структурированный макет панели с выпадающим меню, кнопкой действия и полем отображения результатов.
  • Перечисляет все установленные сиБоты в выпадающем списке для удобного выбора.
  • Запускает бэктестинг на заданном инструменте с использованием исторических данных при активации.
  • Отображает окупаемость инвестиций (ROI) и чистую прибыль из результатов бэктестинга.

Этот плагин работает в пользовательской панели на Панели активного инструмента и остается активным, пока открыт cTrader Windows или Mac. Он останавливается автоматически при закрытии или перезапуске платформы.

Создание плагина

Узнайте, как создавать плагины на C# или Python, в наших пошаговых руководствах.

Код плагина BacktestingInPlugins Sample доступен в наших публичных репозиториях C# и Python. Тот же код предоставляется в качестве шаблона в мастере создания алгоритмов в cTrader Windows или Mac, или вы можете просто скопировать и использовать фрагмент ниже:

  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;

Параметры настройки

Этот плагин предоставляет прямой интерфейс для запуска бэктестинга и просмотра базовых результатов. В таблице ниже описаны его ключевые компоненты и их функции:

Параметр Описание Возможные значения
_grid Определяет макет интерфейса плагина. (3, 1), (2, 2) и т. д.
_startBacktestingButton Настраивает внешний вид и надпись кнопки запуска. Start Backtesting, Color.Green, new CornerRadius(5)
_cBotsComboBox.AddItem Заполняет ComboBox сиБотами из реестра. robottype.name
_resultsTextBlock.Text Отображает сообщения во время цикла бэктестинга. Select a cBot..., Backtesting in progress..., Backtesting results summary и т. д.
CBotsComboBox_SelectedItemChanged Обновляет выбранный сиБот для тестирования. obj.selecteditem
StartTimeUtc Дата и время начала бэктестинга в UTC. new datetime(2023, 6, 1)
EndTimeUtc Дата и время окончания бэктестинга в UTC. datetime.utcnow
DataMode Определяет, что представляет каждое движение точки данных (1 минута, 1 час или 1 день). backtestingdatamode.m1
Balance Начальный виртуальный баланс счета. 10000, 20000 и т. д.
Backtesting.Start Определяет, на каком инструменте и таймфрейме запускать бэктестинг. eurusd, timeframe.hour
Backtesting_Completed Извлекает и отображает результаты тестирования в интерфейсе. resultsnode[main][roi], resultsnode[main][netprofit] и т. д.

Примечание

Убедитесь, что в cTrader установлен хотя бы один сиБот, чтобы выпадающий список заполнялся корректно.

Варианты использования

Этот плагин предоставляет способ запуска тестирования исторических стратегий на Панели активного инструмента. Он упрощает выбор и тестирование сиБотов, что делает его идеальным для оценки стратегий. Ниже приведены практические примеры использования, которые показывают, как плагин может применяться в реальных торговых сценариях.

Пример использования Сценарий Значение
Сравнение стратегий Запускайте бэктестинг на нескольких сиБотах с идентичными условиями тестирования. Позволяет напрямую сравнивать производительность в рамках одной сессии.
Быстрая проверка производительности Тестируйте любой установленный сиБот на стандартной рыночной настройке. Помогает оценить производительность сиБота перед запуском на реальном счете.
Бэктестинг с фиксированными правилами Проверяйте изменения в алгоритме, запуская предопределенный бэктестинг. Обеспечивает согласованность условий тестирования при отладке или версионном тестировании стратегий.
Инструмент быстрой аналитики Просматривайте ROI и обратную связь по прибыли сразу после тестирования установленных сиБотов. Экономит время по сравнению с запуском отдельных тестовых сессий.

Обзор

Этот плагин предоставляет упрощенный интерфейс для выбора сиБота и запуска исторического бэктестинга с использованием предопределенных настроек. Он запускает тестирование на выбранном инструменте и таймфрейме, затем отображает ключевые показатели производительности, такие как ROI и чистая прибыль. Структура поддерживает быструю проверку стратегий и адаптируется для различных торговых сценариев.

Для получения дополнительной информации о разработке обратитесь к нашей документации по плагинам.