يسمح cTrader Algo بإجراء اختبار عكسي لخوارزميات cBot مباشرة من إضافة، مما يفتح العديد من الإمكانيات لمطوري الخوارزميات. اقرأ ملخصنا لمدة دقيقة واحدة أدناه لمعرفة المزيد.
الاختبار العكسي في الإضافات في دقيقة واحدة!
قم بتشغيل الاختبار العكسي برمجيًا أو استجابة لتعليقات المستخدم وإخراج النتائج في أي مكان مناسب في واجهة مستخدم cTrader حيث يمكن وضع إضافة.
قم بتوسيع إمكانيات الاختبار العكسي المدمجة داخل cTrader عن طريق إضافة استراتيجيات اختبار عكسي جديدة مثل محاكاة مونت كارلو.
أضف إحصائيات مخصصة إلى نتائج الاختبار العكسي وأظهرها مباشرة في واجهة مستخدم cTrader.
قم بإنشاء طرق تحسين معقدة تتجاوز الخوارزمية الجينية القياسية.
كيف يعمل الاختبار العكسي في الإضافات
تمتلك الفئة الأساسية Plugin حق الوصول إلى واجهة Backtesting التي يمكنها من خلالها استدعاء طريقة Start() بالتوقيع التالي.
في مصفوفة parameterValues، يجب تمرير معاملات cBot بترتيب ثابت (الترتيب الذي يتم تحديده به في واجهة مستخدم cTrader). إذا كانت بعض المعاملات مفقودة، يتم إدراج القيم الافتراضية تلقائيًا.
عمليات الاختبار العكسي
عند إطلاق الاختبار العكسي برمجيًا، يمكنك إطلاق العديد من عمليات الاختبار العكسي بالتوازي، مما قد يوفر لك الكثير من الوقت.
بالإضافة إلى ذلك، تحتوي الواجهة أيضًا على حدثين، وهما ProgressChanged و Completed. تحتوي وسيطات الحدث Completed (BacktestingCompletedEventArgs) على كائن JSON لنتائج الاختبار العكسي النهائية (JsonReport)، مما يتيح لك تفسيرها حسب الحاجة وعرض الإحصائيات الناتجة للمستخدمين الجدد.
إنشاء إضافة مثال
تعرض الإضافة التالية كتلة جديدة في لوحة الرمز النشط (ASP). داخل الكتلة، تسمح الإضافة للمستخدمين باختيار أي خوارزمية cBot يمتلكونها واختبارها عكسيًا على EURUSD h1. بعد انتهاء الاختبار العكسي، تعرض الإضافة العائد على الاستثمار النهائي وصافي الربح.
usingSystem;usingcAlgo.API;usingcAlgo.API.Collections;usingcAlgo.API.Indicators;usingcAlgo.API.Internals;usingSystem.Linq;usingSystem.Text.Json;usingSystem.Text.Json.Nodes;namespacecAlgo.Plugins{[Plugin(AccessRights = AccessRights.None)]publicclassBacktestingInPluginsSample:Plugin{// Declaring the necessary UI elements// and the cBot (RobotType) selected in the ComboBoxprivateGrid_grid;privateComboBox_cBotsComboBox;privateButton_startBacktestingButton;privateTextBlock_resultsTextBlock;privateRobotType_selectedRobotType;protectedoverridevoidOnStart(){// Initialising and structuring the UI elements_grid=newGrid(3,1);_cBotsComboBox=newComboBox();_startBacktestingButton=newButton{BackgroundColor=Color.Green,CornerRadius=newCornerRadius(5),Text="Start Backtesting",};_resultsTextBlock=newTextBlock{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);varblock=Asp.SymbolTab.AddBlock("Backtesting Plugin");block.Child=_grid;// Populating the ComboBox with existing cBotsPopulateCBotsComboBox();// 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;}protectedvoidStartBacktestingButton_Click(ButtonClickEventArgsobj){// Initialising and configuring the backtesting settingsvarbacktestingSettings=newBacktestingSettings{DataMode=BacktestingDataMode.M1,StartTimeUtc=newDateTime(2023,6,1),EndTimeUtc=DateTime.UtcNow,Balance=10000,};// Starting backtesting on EURUSD h1Backtesting.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...";}protectedvoidPopulateCBotsComboBox(){// Iterating over the AlgoRegistry and// getting the names of all installed cBotsforeach(varrobotTypeinAlgoRegistry.OfType<RobotType>()){_cBotsComboBox.AddItem(robotType.Name);}}protectedvoidBacktesting_Completed(BacktestingCompletedEventArgsobj){// Attaining the JSON results of backtestingstringjsonResults=obj.JsonReport;// Converting the JSON string into a JsonNodeJsonNoderesultsNode=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;}protectedvoidCBotsComboBox_SelectedItemChanged(ComboBoxSelectedItemChangedEventArgsobj){// Updading the variable to always contain// the cBot selected in the ComboBox_selectedRobotType=AlgoRegistry.Get(obj.SelectedItem)asRobotType;}}}
تتفاعل الإضافة ديناميكيًا مع حالة عملية الاختبار العكسي. بمجرد انتهاء الاختبار العكسي، تعرض الإضافة النتائج في TextBlock. يتم تعطيل _startBacktestingButton و _cBotsComboBox طوال فترة الاختبار العكسي.
الملخص
يُعد الاختبار العكسي عبر الإضافات ميزة قوية تتيح لك بناء امتدادات واجهة المستخدم فوق منطق الاختبار العكسي القوي بالفعل الذي توفره cTrader. إلى جانب أعضاء API الأخرى مثل AlgoRegistry، يوفر الاختبار العكسي في الإضافات العديد من الإمكانيات لأي شخص يبيع ويطور خوارزميات cTrader.