跳转至

算法注册表

如果您有大量算法分发给用户,您可能还想提供一个自定义面板或系统,让这些用户可以轻松管理他们本地机器上的算法。 如果您提供几个相互补充的产品(例如,两个 cBot 和一个需要一起安装才能正常运行的自定义指标),这样的系统将特别有价值。 如果用户跳过安装必需的产品,您将能够提醒他们这一事实。

此外,当用户可以访问许多算法时,有时可能难以跟踪所有算法。 例如,用户可能不小心删除了一个有价值的算法,后来才意识到他们无法再操作它。

为了帮助您和您的用户,Algo API 公开了 AlgoRegistry 接口,它提供了一种方便的方法来动态跟踪当前已安装和未安装的不同类型算法的统计信息。

使用算法注册表

AlgoRegistry 中,每个算法都由 AlgoType 表示,其中包含算法的唯一名称和 AlgoKind(如 AlgoKind.CustomIndicator)。

您可以通过调用以下方法从注册表中检索特定算法。

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

要检索特定类型算法的数量,请调用以下方法。

1
AlgoRegistry.GetCount(AlgoKind algoKind)

您还可以为以下事件添加自定义处理程序:

  • AlgoTypeInstalled - 每次安装新算法时触发。
  • AlgoTypeDeleted - 每次删除新算法时触发。
  • AlgoTypeChanged - 每次修改已安装算法时触发。

不同模式下的 AlgoRegistry

AlgoRegistry 在回测和优化中按预期工作。 在使用 cTrader CLI 时不起作用。

创建示例插件

AlgoRegistry 非常适合创建一个直接在 cTrader UI 中显示算法信息的插件。 以下插件就是这样做的。

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

    }
}

构建插件后,我们应该在活跃交易品种面板中看到以下模块。 模块中的数据将每秒动态更新。

通过另一个算法安装算法

AlgoRegistry 接口使开发人员能够创建可以安装其他算法的算法。 例如,您可以编写一个 cBot(在启动时)自动安装另一个 cBot、指标或插件。

以下 cBot 被编码为安装另一个 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()
        {
        }
    }
}

摘要

AlgoRegistry 是插件开发人员的一个很好的功能,但它也可以与其他类型的算法一起使用。 例如,您可以创建一个引用另一个自定义指标的指标,在这种情况下,您的算法首先需要检查用户是否安装了所需的指标。 我们还建议将 AlgoRegistry 添加到您现有的算法中,以简化自定义指标和其他类型算法的管理。