Перейти к содержанию

Реестр алгоритмов

Если у вас есть большой портфель алгоритмов, которые вы распространяете среди пользователей, вы можете также предложить пользовательскую панель или систему, которая позволит этим пользователям легко управлять вашими алгоритмами на своих локальных машинах. Такая система будет особенно ценной, если вы предлагаете несколько продуктов, которые дополняют друг друга (например, два сиБота и пользовательский индикатор, которые все должны быть установлены для правильной работы). Если пользователь пропустит установку необходимого продукта, вы сможете предупредить его об этом.

Кроме того, когда у пользователя есть доступ ко многим алгоритмам, иногда бывает сложно отслеживать их все. Например, пользователь может случайно удалить ценный алгоритм и лишь позже понять, что больше не может им пользоваться.

Чтобы помочь вам и вашим пользователям, 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. Следующий плагин делает именно это.

 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 позволяет разработчикам создавать алгоритмы, которые могут устанавливать другие алгоритмы. Например, вы можете запрограммировать сиБота (при запуске) автоматически устанавливать другого сиБота, индикатор или плагин.

Следующий сиБот запрограммирован на установку другого сиБота:

 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 к вашим существующим алгоритмам, чтобы упростить управление пользовательскими индикаторами и другими типами алгоритмов.