Zum Inhalt

Algo-Registry

Wenn Sie über ein großes Portfolio an Algos verfügen, die Sie an Benutzer verteilen, möchten Sie möglicherweise auch ein benutzerdefiniertes Panel oder System anbieten, das es diesen Benutzern ermöglicht, Ihre Algos auf ihren lokalen Rechnern einfach zu verwalten. Ein solches System wäre besonders wertvoll, wenn Sie mehrere Produkte anbieten, die sich alle gegenseitig ergänzen (z. B. zwei cBots und einen benutzerdefinierten Indikator, die alle installiert werden müssen, um ordnungsgemäß zu funktionieren). Wenn ein Benutzer die Installation eines erforderlichen Produkts überspringt, können Sie ihn auf diese Tatsache aufmerksam machen.

Wenn ein Benutzer außerdem Zugriff auf viele Algorithmen hat, kann es manchmal schwierig sein, den Überblick über alle zu behalten. Beispielsweise kann ein Benutzer versehentlich einen wertvollen Algorithmus löschen, nur um später festzustellen, dass er ihn nicht mehr bedienen kann.

Um Ihnen und Ihren Benutzern zu helfen, stellt die Algo-API die Schnittstelle AlgoRegistry bereit, die eine bequeme Möglichkeit bietet, Statistiken über aktuell installierte und deinstallierte Algos verschiedener Typen dynamisch zu verfolgen.

Mit der Algo-Registry arbeiten

In der AlgoRegistry wird jeder Algo durch einen AlgoType dargestellt, der den eindeutigen Namen des Algorithmus und seine AlgoKind (z. B. einen AlgoKind.CustomIndicator) enthält.

Sie können einen bestimmten Algorithmus aus der Registry abrufen, indem Sie die folgende Methode aufrufen.

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

Um die Anzahl der Algorithmen einer bestimmten Art abzurufen, rufen Sie die folgende Methode auf.

1
AlgoRegistry.GetCount(AlgoKind algoKind)

Sie können auch benutzerdefinierte Handler zu den folgenden Ereignissen hinzufügen:

  • AlgoTypeInstalled – wird jedes Mal ausgelöst, wenn ein neuer Algo installiert wird.
  • AlgoTypeDeleted – wird jedes Mal ausgelöst, wenn ein neuer Algo gelöscht wird.
  • AlgoTypeChanged – wird jedes Mal ausgelöst, wenn ein installierter Algo geändert wird.

AlgoRegistry in verschiedenen Modi

AlgoRegistry funktioniert wie vorgesehen beim Backtesting und bei der Optimierung. Es funktioniert nicht bei Verwendung von cTrader CLI.

Ein Beispiel-Plugin erstellen

Die AlgoRegistry ist perfekt für die Erstellung eines Plugins, das Informationen über Algos direkt in der cTrader-Benutzeroberfläche anzeigt. Das folgende Plugin tut genau das.

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

    }
}

Nach dem Erstellen unseres Plugins sollten wir den folgenden Block im Bereich eines aktiven Symbols sehen. Die Daten im Block werden jede Sekunde dynamisch aktualisiert.

Einen Algo über einen anderen Algo installieren

Die Schnittstelle AlgoRegistry ermöglicht es Entwicklern, Algorithmen zu erstellen, die andere Algorithmen installieren können. Sie können beispielsweise einen cBot codieren, der (beim Start) automatisch einen anderen cBot, einen Indikator oder ein Plugin installiert.

Der folgende cBot ist so codiert, dass er einen anderen cBot installiert:

 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()
        {
        }
    }
}

Zusammenfassung

AlgoRegistry ist eine großartige Funktion für Plugin-Entwickler, kann aber auch mit anderen Arten von Algos verwendet werden. Sie können beispielsweise einen Indikator erstellen, der auf einen anderen benutzerdefinierten Indikator verweist. In diesem Fall müsste Ihr Algo zunächst prüfen, ob der erforderliche Indikator vom Benutzer installiert ist. Wir empfehlen außerdem, die AlgoRegistry zu Ihren vorhandenen Algos hinzuzufügen, um die Verwaltung von benutzerdefinierten Indikatoren und anderen Arten von Algos zu vereinfachen.