ข้ามไปที่เนื้อหา

Backtest ในปลั๊กอิน

cTrader Algo อนุญาตให้ทำ backtesting cBot โดยตรงจากปลั๊กอิน ซึ่งเปิดโอกาสมากมายสำหรับนักพัฒนา algo อ่านบทสรุปหนึ่งนาทีของเราด้านล่างเพื่อเรียนรู้เพิ่มเติม

Backtest ในปลั๊กอินในหนึ่งนาที!

  • เริ่มต้น backtesting แบบโปรแกรมหรือตอบสนองต่อข้อเสนอแนะของผู้ใช้และแสดงผลลัพธ์ในสถานที่ที่เหมาะสมใดๆ ใน UI ของ cTrader ที่สามารถวางปลั๊กอินได้
  • ขยายความสามารถในการ backtesting ในตัวภายใน cTrader โดยเพิ่มกลยุทธ์การ backtesting ใหม่ๆ เช่น การจำลอง Monte Carlo
  • เพิ่มสถิติที่กำหนดเองในผลลัพธ์การ backtesting และแสดงโดยตรงใน UI ของ cTrader
  • สร้างวิธีการปรับให้เหมาะสมที่ซับซ้อนโดยไปไกลกว่าอัลกอริทึมพันธุกรรมมาตรฐาน

การ backtesting ในปลั๊กอินทำงานอย่างไร

คลาสพื้นฐาน Plugin สามารถเข้าถึงอินเทอร์เฟซ Backtesting ซึ่งสามารถเรียกเมธอด Start() ด้วยลายเซ็นต่อไปนี้

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

พารามิเตอร์

ในอาร์เรย์ parameterValues ต้องส่งพารามิเตอร์ของ cBot ในลำดับที่กำหนด (ลำดับที่ระบุใน UI ของ cTrader) หากพารามิเตอร์บางตัวหายไป ค่าเริ่มต้นจะถูกแทรกโดยอัตโนมัติ

กระบวนการ Backtest

เมื่อเริ่มการ backtesting ด้วยโปรแกรม คุณสามารถเริ่มกระบวนการ backtesting หลายกระบวนการพร้อมกันได้ ซึ่งอาจช่วยประหยัดเวลาได้มาก

นอกจากนี้ อินเทอร์เฟซยังมีอีเวนต์สองอย่าง ได้แก่ ProgressChanged และ Completed อาร์กิวเมนต์สำหรับอีเวนต์ Completed (BacktestingCompletedEventArgs) มีออบเจ็กต์ JSON ของผลลัพธ์ backtesting สุดท้าย (JsonReport) ซึ่งช่วยให้คุณตีความได้ตามต้องการและแสดงสถิติที่ได้ให้กับผู้ใช้ใหม่

สร้างปลั๊กอินตัวอย่าง

ปลั๊กอินต่อไปนี้แสดงบล็อกใหม่ในแผงสัญลักษณ์ที่ใช้งานอยู่ (ASP) ภายในบล็อก ปลั๊กอินช่วยให้ผู้ใช้สามารถเลือก cBot ที่พวกเขาเป็นเจ้าของและทำ backtest บน EURUSD h1 หลังจาก backtesting เสร็จสิ้น ปลั๊กอินจะแสดง ROI สุดท้ายและกำไรสุทธิ

  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;
        }

    }
}

ปลั๊กอินตอบสนองต่อสถานะของกระบวนการ backtesting แบบไดนามิก ทันทีที่ backtesting เสร็จสิ้น ปลั๊กอินจะแสดงผลลัพธ์ใน TextBlock _startBacktestingButton และ _cBotsComboBox จะถูกปิดใช้งานตลอดการ backtesting

สรุป

การ Backtesting ผ่านปลั๊กอินเป็นฟีเจอร์ที่ทรงพลัง ช่วยให้คุณสร้างส่วนขยาย UI บนตรรกะการ backtesting ที่ทรงพลังอยู่แล้วที่ cTrader มีให้ เมื่อใช้ร่วมกับสมาชิก API อื่นๆ เช่น AlgoRegistry การ backtesting ในปลั๊กอินมอบโอกาสมากมายสำหรับทุกคนที่ขายและพัฒนา algo ของ cTrader

Image title