跳转至

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 和净利润。 该结构支持快速策略验证,并适用于各种交易场景。

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