跳转至

BacktestingInPlugins Sample

概述

BacktestingInPlugins Sample 插件支持直接从 cTrader 平台界面运行历史策略测试,使用以下关键功能:

  • 创建一个结构化面板布局,包含下拉菜单、操作按钮和结果显示字段。
  • 在下拉菜单中列出所有已安装的 cBot,以便轻松选择。
  • 触发时使用历史数据对设定的交易品种进行回测。
  • 显示回测结果中的投资回报率 (ROI) 和净利润。

该插件在活跃交易品种面板中的自定义面板中运行,并在 cTrader Windows 或 Mac 打开时保持活动状态。 当平台关闭或重启时,它会自动停止。

插件创建

了解如何通过我们的分步指南创建、编辑和构建插件,无论是从模板还是从头开始。

您可以在 GitHub 上找到 BacktestingInPlugins Sample 插件的代码,或直接复制以下内容。

示例代码
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;
        }
    }
}

自定义选项

该插件提供了一个直接界面,用于启动回测并查看基本结果。 下表概述了其关键组件及其功能:

参数 描述 可选值
_grid 定义插件界面的布局。 (3, 1), (2, 2) 等。
_startBacktestingButton 自定义开始按钮的外观和标签。 Start Backtesting, Color.Green, new CornerRadius(5)
_cBotsComboBox.AddItem 用注册表中的 cBots 填充 ComboBox。 robottype.name
_resultsTextBlock.Text 在回测周期中显示消息。 Select a cBot..., Backtesting in progress..., Backtesting results summary, 等。
CBotsComboBox_SelectedItemChanged 更新用于测试的选定 cBot。 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 中至少安装一个 cBot,以便下拉菜单正确填充。

用例

该插件提供了一种在活跃交易品种面板中运行历史策略测试的方式。 它简化了选择和测试 cBots 的过程,非常适合策略评估。 以下是实际用例,展示了如何将该插件应用于真实交易场景。

使用场景 场景 值
策略比较 在多个 cBot 上使用相同的测试条件运行回测。 支持在单个会话内直接进行性能比较。
快速性能审查 在标准市场设置下测试任何已安装的 cBot。 帮助您在实盘账户上运行 cBot 之前评估其性能。
固定规则回测 通过启动预定义的回测来验证算法更改。 在调试或版本测试策略时确保测试条件的一致性。
快速洞察工具 测试已安装的 cBot 后立即查看 ROI 和盈利反馈。 与启动单独的测试会话相比,节省时间。

总结

该插件提供了一个简化的界面,用于选择 cBot 并使用预定义设置运行历史回测。 它在选定的交易品种和时间周期上运行测试,然后显示关键性能指标,如 ROI 和净利润。 该结构支持快速策略验证,并适用于各种交易场景。

有关进一步的开发细节,请参阅我们的插件文档。