Bỏ qua

Backtest trong plugin

cTrader Algo cho phép backtest cBot trực tiếp từ một plugin, mở ra nhiều khả năng cho các nhà phát triển thuật toán. Đọc tóm tắt một phút của chúng tôi bên dưới để tìm hiểu thêm.

Backtest trong plugin trong một phút!

  • Khởi chạy backtest theo chương trình hoặc để phản hồi phản hồi của người dùng và xuất kết quả ở bất kỳ vị trí phù hợp nào trong giao diện người dùng cTrader nơi có thể đặt plugin.
  • Mở rộng khả năng backtest tích hợp sẵn trong cTrader bằng cách thêm các chiến lược backtest mới như mô phỏng Monte Carlo.
  • Thêm thống kê tùy chỉnh vào kết quả backtest và hiển thị chúng trực tiếp trong giao diện người dùng cTrader.
  • Tạo các phương pháp tối ưu hóa phức tạp vượt xa thuật toán di truyền tiêu chuẩn.

Cách thức hoạt động của backtest trong plugin

Lớp cơ sở Plugin có quyền truy cập vào giao diện Backtesting từ đó có thể gọi phương thức Start() với chữ ký sau.

1
BacktestingProcess Start(RobotType robotType, string symbolName, TimeFrame timeFrame, BacktestingSettings settings, params object[] parameterValues);

Tham số

Trong mảng parameterValues, các tham số cBot phải được truyền theo thứ tự cố định (thứ tự được chỉ định trong giao diện người dùng cTrader). Nếu một số tham số bị thiếu, các giá trị mặc định sẽ được chèn tự động.

Quy trình backtest

Khi khởi chạy backtest theo chương trình, bạn có thể khởi chạy nhiều quy trình backtest song song, điều này có thể tiết kiệm cho bạn rất nhiều thời gian.

Ngoài ra, giao diện cũng chứa hai sự kiện, cụ thể là ProgressChangedCompleted. Các đối số cho sự kiện Completed (BacktestingCompletedEventArgs) chứa một đối tượng JSON của kết quả backtest cuối cùng (JsonReport), cho phép bạn diễn giải chúng theo nhu cầu và hiển thị thống kê kết quả cho người dùng mới.

Tạo một plugin ví dụ

Plugin sau đây hiển thị một khối mới trong Bảng ký hiệu đang hoạt động (ASP). Bên trong khối, plugin cho phép người dùng chọn bất kỳ cBot nào họ sở hữu và backtest nó trên EURUSD h1. Sau khi backtest kết thúc, plugin hiển thị ROI và lợi nhuận ròng cuối cùng.

  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
113
114
115
116
117
118
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)
        {
            // Updading the variable to always contain
            // the cBot selected in the ComboBox
            _selectedRobotType = AlgoRegistry.Get(obj.SelectedItem) as RobotType;
        }

    }
}

Plugin phản ứng động với trạng thái của quá trình backtest. Ngay khi backtest hoàn tất, plugin hiển thị kết quả trong TextBlock. _startBacktestingButton_cBotsComboBox bị vô hiệu hóa trong suốt quá trình backtest.

Tổng quan

Backtest thông qua plugin là một tính năng mạnh mẽ cho phép bạn xây dựng các tiện ích mở rộng giao diện người dùng trên nền tảng logic backtest mạnh mẽ đã có sẵn của cTrader. Kết hợp với các thành viên API khác như AlgoRegistry, backtest trong plugin mang đến nhiều khả năng cho bất kỳ ai bán và phát triển thuật toán cTrader.

Image title