Lewati ke isi

Backtesting dalam plugin

cTrader Algo memungkinkan backtesting cBot langsung dari plugin, yang membuka banyak kemungkinan bagi pengembang algo. Baca ringkasan satu menit kami di bawah ini untuk mempelajari lebih lanjut.

Backtesting dalam plugin dalam satu menit!

  • Jalankan backtesting secara terprogram atau sebagai respons terhadap umpan balik pengguna dan tampilkan hasilnya di tempat yang sesuai di UI cTrader di mana plugin dapat ditempatkan.
  • Perluas kemampuan backtesting bawaan di dalam cTrader dengan menambahkan strategi backtesting baru seperti simulasi Monte Carlo.
  • Tambahkan statistik kustom ke hasil backtesting dan tampilkan langsung di UI cTrader.
  • Buat metode optimisasi kompleks yang melampaui algoritma genetik standar.

Cara kerja backtesting dalam plugin

Kelas dasar Plugin memiliki akses ke antarmuka Backtesting dari mana ia dapat memanggil metode Start() dengan tanda tangan berikut.

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

Parameter

Dalam array parameterValues, parameter cBot harus dilewatkan dalam urutan tetap (urutan yang ditentukan dalam UI cTrader). Jika beberapa parameter tidak ada, nilai default akan disisipkan secara otomatis.

Proses backtesting

Saat menjalankan backtesting secara terprogram, Anda dapat menjalankan beberapa proses backtesting secara paralel, yang berpotensi menghemat banyak waktu.

Selain itu, antarmuka juga berisi dua event, yaitu ProgressChanged dan Completed. Argumen untuk event Completed (BacktestingCompletedEventArgs) berisi objek JSON dari hasil backtesting akhir (JsonReport), memungkinkan Anda untuk menafsirkannya sesuai kebutuhan dan menampilkan statistik yang dihasilkan kepada pengguna baru.

Buat plugin contoh

Plugin berikut menampilkan blok baru di Panel Simbol Aktif (ASP). Di dalam blok tersebut, plugin memungkinkan pengguna memilih cBot apa pun yang mereka miliki dan melakukan backtesting pada EURUSD h1. Setelah backtesting selesai, plugin menampilkan ROI dan laba bersih akhir.

  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 secara dinamis bereaksi terhadap status proses backtesting. Segera setelah backtesting selesai, plugin menampilkan hasilnya di TextBlock. _startBacktestingButton dan _cBotsComboBox dinonaktifkan selama backtesting berlangsung.

Ringkasan

Backtesting melalui plugin adalah fitur yang kuat yang memungkinkan Anda membangun ekstensi UI di atas logika backtesting yang sudah kuat yang disediakan oleh cTrader. Digabungkan dengan anggota API lainnya seperti AlgoRegistry, backtesting dalam plugin menawarkan banyak kemungkinan bagi siapa pun yang menjual dan mengembangkan algo cTrader.

Image title