Ir para o conteúdo

Testes de verificação em plugins

O cTrader Algo permite fazer testes de verificação de cBots diretamente a partir de um plugin, o que abre muitas possibilidades para os programadores de algos. Leia o nosso resumo de um minuto abaixo para saber mais.

Testes de verificação em plugins em um minuto!

  • Lance testes de verificação programaticamente ou em resposta ao feedback do utilizador e apresente os resultados em qualquer lugar adequado na interface do utilizador do cTrader onde um plugin possa ser colocado.
  • Estenda as capacidades de testes de verificação integradas no cTrader adicionando novas estratégias de testes de verificação, como a simulação de Monte Carlo.
  • Adicione estatísticas personalizadas aos resultados dos testes de verificação e mostre-as diretamente na interface do utilizador do cTrader.
  • Crie métodos de otimização complexos que vão além do algoritmo genético padrão.

Como funcionam os testes de verificação em plugins

A classe base Plugin tem acesso à interface Backtesting a partir da qual pode chamar o método Start() com a seguinte assinatura.

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

Parâmetros

Na matriz parameterValues, os parâmetros do cBot devem ser passados numa ordem fixa (a ordem em que são especificados na interface do utilizador do cTrader). Se alguns parâmetros estiverem em falta, os valores predefinidos são inseridos automaticamente.

Processos de testes de verificação

Ao lançar testes de verificação programaticamente, pode lançar vários processos de testes de verificação em paralelo, o que potencialmente pode poupar-lhe bastante tempo.

Além disso, a interface também contém dois eventos, nomeadamente ProgressChanged e Completed. Os argumentos para o evento Completed (BacktestingCompletedEventArgs) contêm um objeto JSON dos resultados finais dos testes de verificação (JsonReport), permitindo-lhe interpretá-los conforme necessário e exibir as estatísticas resultantes aos novos utilizadores.

Criar um plugin de exemplo

O seguinte plugin exibe um novo bloco no Painel de símbolo ativo (ASP). Dentro do bloco, o plugin permite aos utilizadores escolher qualquer cBot que possuam e fazer testes de verificação no EURUSD h1. Após a conclusão dos testes de verificação, o plugin exibe o ROI final e o lucro líquido.

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

    }
}

O plugin reage dinamicamente ao estado do processo de testes de verificação. Assim que os testes de verificação terminam, o plugin mostra os resultados no TextBlock. O _startBacktestingButton e o _cBotsComboBox são desativados durante os testes de verificação.

Resumo

Os testes de verificação através de plugins são uma funcionalidade poderosa que lhe permite construir extensões de interface do utilizador sobre a já poderosa lógica de testes de verificação fornecida pelo cTrader. Juntamente com outros membros da API como AlgoRegistry, os testes de verificação em plugins oferecem muitas possibilidades para qualquer pessoa que venda e desenvolva algos do cTrader.

Image title