انتقل إلى المحتوى

الاختبار العكسي في الإضافات

يسمح cTrader Algo بإجراء اختبار عكسي لخوارزميات cBot مباشرة من إضافة، مما يفتح العديد من الإمكانيات لمطوري الخوارزميات. اقرأ ملخصنا لمدة دقيقة واحدة أدناه لمعرفة المزيد.

الاختبار العكسي في الإضافات في دقيقة واحدة!

  • قم بتشغيل الاختبار العكسي برمجيًا أو استجابة لتعليقات المستخدم وإخراج النتائج في أي مكان مناسب في واجهة مستخدم cTrader حيث يمكن وضع إضافة.
  • قم بتوسيع إمكانيات الاختبار العكسي المدمجة داخل cTrader عن طريق إضافة استراتيجيات اختبار عكسي جديدة مثل محاكاة مونت كارلو.
  • أضف إحصائيات مخصصة إلى نتائج الاختبار العكسي وأظهرها مباشرة في واجهة مستخدم cTrader.
  • قم بإنشاء طرق تحسين معقدة تتجاوز الخوارزمية الجينية القياسية.

كيف يعمل الاختبار العكسي في الإضافات

تمتلك الفئة الأساسية Plugin حق الوصول إلى واجهة Backtesting التي يمكنها من خلالها استدعاء طريقة Start() بالتوقيع التالي.

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

المعاملات

في مصفوفة parameterValues، يجب تمرير معاملات cBot بترتيب ثابت (الترتيب الذي يتم تحديده به في واجهة مستخدم cTrader). إذا كانت بعض المعاملات مفقودة، يتم إدراج القيم الافتراضية تلقائيًا.

عمليات الاختبار العكسي

عند إطلاق الاختبار العكسي برمجيًا، يمكنك إطلاق العديد من عمليات الاختبار العكسي بالتوازي، مما قد يوفر لك الكثير من الوقت.

بالإضافة إلى ذلك، تحتوي الواجهة أيضًا على حدثين، وهما ProgressChanged و Completed. تحتوي وسيطات الحدث Completed (BacktestingCompletedEventArgs) على كائن JSON لنتائج الاختبار العكسي النهائية (JsonReport)، مما يتيح لك تفسيرها حسب الحاجة وعرض الإحصائيات الناتجة للمستخدمين الجدد.

إنشاء إضافة مثال

تعرض الإضافة التالية كتلة جديدة في لوحة الرمز النشط (ASP). داخل الكتلة، تسمح الإضافة للمستخدمين باختيار أي خوارزمية cBot يمتلكونها واختبارها عكسيًا على EURUSD h1. بعد انتهاء الاختبار العكسي، تعرض الإضافة العائد على الاستثمار النهائي وصافي الربح.

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

    }
}

تتفاعل الإضافة ديناميكيًا مع حالة عملية الاختبار العكسي. بمجرد انتهاء الاختبار العكسي، تعرض الإضافة النتائج في TextBlock. يتم تعطيل _startBacktestingButton و _cBotsComboBox طوال فترة الاختبار العكسي.

الملخص

يُعد الاختبار العكسي عبر الإضافات ميزة قوية تتيح لك بناء امتدادات واجهة المستخدم فوق منطق الاختبار العكسي القوي بالفعل الذي توفره cTrader. إلى جانب أعضاء API الأخرى مثل AlgoRegistry، يوفر الاختبار العكسي في الإضافات العديد من الإمكانيات لأي شخص يبيع ويطور خوارزميات cTrader.

Image title