Ir para o conteúdo

Registo de algoritmos

Se tiver um grande portfólio de algoritmos que está a distribuir aos utilizadores, poderá querer oferecer também um painel ou sistema personalizado que permita a estes utilizadores gerir facilmente os seus algoritmos nas suas máquinas locais. Tal sistema seria especialmente valioso se oferecer vários produtos que se complementam entre si (por exemplo, dois cBots e um indicador personalizado que precisam de ser todos instalados para funcionar corretamente). Se um utilizador se esquecer de instalar um produto necessário, poderá alertá-lo para este facto.

Além disso, quando um utilizador tem acesso a muitos algoritmos, por vezes pode ser difícil manter o controlo de todos eles. Por exemplo, um utilizador pode acidentalmente apagar um algoritmo valioso apenas para perceber mais tarde que já não o pode operar.

Para o ajudar a si e aos seus utilizadores, a API Algo expõe a interface AlgoRegistry, que oferece um meio conveniente de rastrear dinamicamente estatísticas sobre algoritmos atualmente instalados e desinstalados de diferentes tipos.

Trabalhar com o registo de algoritmos

No AlgoRegistry, cada algoritmo é representado por um AlgoType, que contém o nome único do algoritmo e o seu AlgoKind (como um AlgoKind.CustomIndicator).

Pode recuperar um algoritmo específico do registo chamando o seguinte método.

1
AlgoRegistry.Get(string name, AlgoKind algoKind);

Para recuperar uma contagem de algoritmos de um tipo particular, chame o seguinte método.

1
AlgoRegistry.GetCount(AlgoKind algoKind)

Também pode adicionar manipuladores personalizados aos seguintes eventos:

  • AlgoTypeInstalled - acionado sempre que um novo algoritmo é instalado.
  • AlgoTypeDeleted - acionado sempre que um novo algoritmo é apagado.
  • AlgoTypeChanged - acionado sempre que um algoritmo instalado é modificado.

AlgoRegistry em diferentes modos

AlgoRegistry funciona como pretendido em backtesting e otimização. Não funciona ao usar o cTrader CLI.

Criar um plugin de exemplo

O AlgoRegistry é perfeito para criar um plugin que irá exibir informações sobre algoritmos diretamente na interface do cTrader. O seguinte plugin faz exatamente isso.

 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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using cAlgo.API;
using cAlgo.API.Collections;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;

namespace cAlgo.Plugins
{
    [Plugin(AccessRights = AccessRights.None)]
    public class AlgoStatsPlugin : Plugin
    {
        private TextBlock _customIndicatorsBlock = new TextBlock
        {
            FontSize = 12,
            FontWeight = FontWeight.Bold,
            TextAlignment = TextAlignment.Left,
            Padding = new Thickness(5, 5, 5, 5),
        };

        private TextBlock _indicatorsBlock = new TextBlock
        {
            FontSize = 12,
            FontWeight = FontWeight.Bold,
            TextAlignment = TextAlignment.Left,
            Padding = new Thickness(5, 5, 5, 5),
        };

        private TextBlock _robotsBlock = new TextBlock
        {
            FontSize = 12,
            FontWeight = FontWeight.Bold,
            TextAlignment = TextAlignment.Left,
            Padding = new Thickness(5, 5, 5, 5),
        };

        private TextBlock _pluginsBlock = new TextBlock
        {
            FontSize = 12,
            FontWeight = FontWeight.Bold,
            TextAlignment = TextAlignment.Left,
            Padding = new Thickness(5, 5, 5, 5),
        };

        private Grid _grid = new Grid(4, 1);

        protected override void OnStart()
        {
            var aspBlock = Asp.SymbolTab.AddBlock("Algo Registry");
            aspBlock.IsExpanded = true;
            aspBlock.Height = 200;

            _grid.AddChild(_robotsBlock, 0, 0);
            _grid.AddChild(_indicatorsBlock, 1, 0);
            _grid.AddChild(_customIndicatorsBlock, 2, 0);
            _grid.AddChild(_pluginsBlock, 3, 0);

            aspBlock.Child = _grid;

            Timer.Start(TimeSpan.FromSeconds(1));
        }

        protected override void OnTimer() 
        {
            _robotsBlock.Text = $"cBots: {AlgoRegistry.GetCount(AlgoKind.Robot)}";
            _customIndicatorsBlock.Text = $"Custom indicators: {AlgoRegistry.GetCount(AlgoKind.CustomIndicator)}";
            _indicatorsBlock.Text = $"Indicators: {AlgoRegistry.GetCount(AlgoKind.StandardIndicator)}";
            _pluginsBlock.Text = $"Plugins: {AlgoRegistry.GetCount(AlgoKind.Plugin)}";
        }

    }
}

Após compilar o nosso plugin, deveremos ver o seguinte bloco no Painel de símbolo ativo. Os dados no bloco serão atualizados dinamicamente a cada segundo.

Instalar um algo através de outro algo

A interface AlgoRegistry permite aos programadores criar algoritmos que podem instalar outros algoritmos. Por exemplo, pode programar um cBot (ao iniciar) para instalar automaticamente outro cBot, um indicador ou um plugin.

O seguinte cBot está programado para instalar outro cBot:

 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
using System;
using cAlgo.API;
using cAlgo.API.Collections;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;

namespace cAlgo.Robots
{
    [Robot(AccessRights = AccessRights.None, AddIndicators = true)]
    public class Installation : Robot
    {
        protected override void OnStart()
        {
            InstallationResult result = AlgoRegistry.Install("https://ctrader.com/algos/download/4392/");
            Print(result.Succeeded);
        }

        protected override void OnTick()
        {
        }

        protected override void OnStop()
        {
        }
    }
}

Resumo

AlgoRegistry é uma excelente funcionalidade para programadores de plugins, mas também pode ser utilizada com outros tipos de algos. Por exemplo, pode criar um indicador que faça referência a outro indicador personalizado, caso em que o seu algo teria primeiro de verificar se o indicador necessário está instalado pelo utilizador. Também recomendamos adicionar o AlgoRegistry aos seus algos existentes para simplificar a gestão de indicadores personalizados e outros tipos de algos.