Плагин BacktestingInPlugins Sample позволяет запускать тестирование исторических стратегий непосредственно из интерфейса платформы cTrader, используя следующие ключевые функции:
Создает структурированный макет панели с выпадающим меню, кнопкой действия и полем отображения результатов.
Перечисляет все установленные сиБоты в выпадающем списке для удобного выбора.
Запускает бэктестинг на заданном инструменте с использованием исторических данных при активации.
Отображает окупаемость инвестиций (ROI) и чистую прибыль из результатов бэктестинга.
Этот плагин работает в пользовательской панели на Панели активного инструмента и остается активным, пока открыт cTrader Windows или Mac. Он останавливается автоматически при закрытии или перезапуске платформы.
Код плагина BacktestingInPlugins Sample доступен в наших публичных репозиториях C# и Python. Тот же код предоставляется в качестве шаблона в мастере создания алгоритмов в cTrader Windows или Mac, или вы можете просто скопировать и использовать фрагмент ниже:
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){// Updating the variable to always contain// the cBot selected in the ComboBox_selectedRobotType=AlgoRegistry.Get(obj.SelectedItem)asRobotType;}}}
importclrclr.AddReference("cAlgo.API")fromcAlgo.APIimport*fromSystemimportDateTimefromSystem.Text.Json.NodesimportJsonNodefromSystem.Text.JsonimportJsonDocumentOptionsimportjsonclassBacktestingInPluginsSample():defon_start(self):self.grid=Grid(3,1)self.cBotsComboBox=ComboBox()self.startBacktestingButton=Button()self.startBacktestingButton.BackgroundColor=Color.Greenself.startBacktestingButton.CornerRadius=CornerRadius(5)self.startBacktestingButton.Text="Start Backtesting"self.resultsTextBlock=TextBlock()self.resultsTextBlock.HorizontalAlignment=HorizontalAlignment.Centerself.resultsTextBlock.VerticalAlignment=VerticalAlignment.Centerself.resultsTextBlock.Text="Select a cBot..."self.grid.AddChild(self.cBotsComboBox,0,0)self.grid.AddChild(self.startBacktestingButton,1,0)self.grid.AddChild(self.resultsTextBlock,2,0)block=api.Asp.SymbolTab.AddBlock("Backtesting Plugin")block.Child=self.grid# Populating the ComboBox with existing cBotsself.populate_cbots_combobox();self.startBacktestingButton.Click+=self.on_start_backtesting_button_click;self.cBotsComboBox.SelectedItemChanged+=self.on_cbots_combobox_selected_item_changed;api.Backtesting.Completed+=self.on_backtesting_completed;defpopulate_cbots_combobox(self):# Iterating over the AlgoRegistry and getting the names of all installed cBotsforrobotTypeinapi.AlgoRegistry.Robots:self.cBotsComboBox.AddItem(robotType.Name)defon_start_backtesting_button_click(self,args):backtestingSettings=BacktestingSettings()backtestingSettings.DataMode=BacktestingDataMode.M1backtestingSettings.StartTimeUtc=DateTime(DateTime.UtcNow.Year-2,DateTime.UtcNow.Month,DateTime.UtcNow.Day)backtestingSettings.EndTimeUtc=DateTime.UtcNowbacktestingSettings.Balance=10000# Starting backtesting on EURUSD h1self.backtestingProcess=api.Backtesting.Start(self.selectedRobotType,"EURUSD",TimeFrame.Hour,backtestingSettings)# Disabling other controls and changing the text inside the TextBlockself.cBotsComboBox.IsEnabled=Falseself.startBacktestingButton.IsEnabled=Falseself.resultsTextBlock.Text="Backtesting in progress..."defon_cbots_combobox_selected_item_changed(self,args):self.selectedRobotType=RobotType(api.AlgoRegistry.Get(args.SelectedItem))defon_backtesting_completed(self,args):ifint(args.Process.BacktestingError)>0:api.Print(f"Backtesting failed with error {args.Process.BacktestingError}")returnjsonResults=json.loads(args.JsonReport)# # Attaining the ROI and net profit from backtesting resultsself.resultsTextBlock.Text=f"ROI: {jsonResults["main"]["roi"]}\nNet Profit: {jsonResults["main"]["netProfit"]}"# Re-enabling controls after backteting is finishedself.cBotsComboBox.IsEnabled=True;self.startBacktestingButton.IsEnabled=True;
Этот плагин предоставляет прямой интерфейс для запуска бэктестинга и просмотра базовых результатов. В таблице ниже описаны его ключевые компоненты и их функции:
Параметр
Описание
Возможные значения
_grid
Определяет макет интерфейса плагина.
(3, 1), (2, 2) и т. д.
_startBacktestingButton
Настраивает внешний вид и надпись кнопки запуска.
Start Backtesting, Color.Green, new CornerRadius(5)
_cBotsComboBox.AddItem
Заполняет ComboBox сиБотами из реестра.
robottype.name
_resultsTextBlock.Text
Отображает сообщения во время цикла бэктестинга.
Select a cBot..., Backtesting in progress..., Backtesting results summary и т. д.
CBotsComboBox_SelectedItemChanged
Обновляет выбранный сиБот для тестирования.
obj.selecteditem
StartTimeUtc
Дата и время начала бэктестинга в UTC.
new datetime(2023, 6, 1)
EndTimeUtc
Дата и время окончания бэктестинга в UTC.
datetime.utcnow
DataMode
Определяет, что представляет каждое движение точки данных (1 минута, 1 час или 1 день).
backtestingdatamode.m1
Balance
Начальный виртуальный баланс счета.
10000, 20000 и т. д.
Backtesting.Start
Определяет, на каком инструменте и таймфрейме запускать бэктестинг.
eurusd, timeframe.hour
Backtesting_Completed
Извлекает и отображает результаты тестирования в интерфейсе.
resultsnode[main][roi], resultsnode[main][netprofit] и т. д.
Примечание
Убедитесь, что в cTrader установлен хотя бы один сиБот, чтобы выпадающий список заполнялся корректно.
Этот плагин предоставляет способ запуска тестирования исторических стратегий на Панели активного инструмента. Он упрощает выбор и тестирование сиБотов, что делает его идеальным для оценки стратегий. Ниже приведены практические примеры использования, которые показывают, как плагин может применяться в реальных торговых сценариях.
Пример использования
Сценарий
Значение
Сравнение стратегий
Запускайте бэктестинг на нескольких сиБотах с идентичными условиями тестирования.
Позволяет напрямую сравнивать производительность в рамках одной сессии.
Быстрая проверка производительности
Тестируйте любой установленный сиБот на стандартной рыночной настройке.
Помогает оценить производительность сиБота перед запуском на реальном счете.
Бэктестинг с фиксированными правилами
Проверяйте изменения в алгоритме, запуская предопределенный бэктестинг.
Обеспечивает согласованность условий тестирования при отладке или версионном тестировании стратегий.
Инструмент быстрой аналитики
Просматривайте ROI и обратную связь по прибыли сразу после тестирования установленных сиБотов.
Экономит время по сравнению с запуском отдельных тестовых сессий.
Этот плагин предоставляет упрощенный интерфейс для выбора сиБота и запуска исторического бэктестинга с использованием предопределенных настроек. Он запускает тестирование на выбранном инструменте и таймфрейме, затем отображает ключевые показатели производительности, такие как ROI и чистая прибыль. Структура поддерживает быструю проверку стратегий и адаптируется для различных торговых сценариев.
Для получения дополнительной информации о разработке обратитесь к нашей документации по плагинам.