Zum Inhalt

Lebenszyklus eines benutzerdefinierten Indikators

Beispielcodestruktur

Dieser Artikel führt Sie durch die Codestruktur und erklärt die Logik hinter Ereignissen und dem Lebenszyklus für einen cTrader-Indikator. Um auf benutzerdefinierte Indikatoren zuzugreifen, öffnen Sie die Registerkarte Lokal in der Algo-App.

Image title

Als Beispiel können Sie einen neuen Indikator mit dem Namen „LifeCycle Test" erstellen, wobei der folgende Beispielcode im Code-Editor-Fenster verfügbar ist.

Image title

Um zur Boilerplate-Version zurückzukehren, kopieren Sie den folgenden Code.

 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
{
    [Indicator(AccessRights = AccessRights.None)]
    public class LifeCycleTest : Indicator
    {
        [Parameter(DefaultValue = "Hello world!")]
        public string Message { get; set; }

        [Output("Main")]
        public IndicatorDataSeries Result { get; set; }

        protected override void Initialize()
        {
            // To learn more about cTrader Algo visit our Help Center:
            // https://help.ctrader.com/ctrader-algo/


            Print(Message);
        }

        public override void Calculate(int index)
        {
            // Calculate value at specified index
            // Result[index] = 
        }
    }
}

Auf den ersten Blick umfasst die Codestruktur nur zwei Methoden, die Methode Initialize() und die Methode Calculate(). Klicken Sie auf Erstellen, um mit dem Testen dieses Indikators fortzufahren. Wir werden eine zusätzliche Methode namens OnDestroy() hinzufügen und ihren Zweck später erklären.

Das Initialisierungsereignis

Wenn ein cTrader-Indikator zum ersten Mal an einen Chart angehängt wird oder wenn der Benutzer eine der Parametereinstellungen ändert, wird eine Indikatorinstanz neu erstellt und die Methode Initialize() aufgerufen. Sie wird verwendet, um alle Variablen zu initialisieren, die Sie in Ihrem Indikator verwenden möchten. Sie können auch zusätzliche Indikatoren definieren und referenzieren, um einen einzelnen Indikator mit Formeln aus anderen Indikatoren zu erstellen.

Standardmäßig enthält die neue Code-Vorlage eine Parametereinstellung namens Message mit dem Wert „Hello world!".

1
2
[Parameter(DefaultValue = "Hello world!")]
public string Message { get; set; }

In der Methode Initialize() befindet sich eine Codezeile, um diese Nachricht im Protokoll auszugeben.

1
Print(Message);

Um die Methode Initialize() zu demonstrieren, fügen Sie eine Indikatorinstanz hinzu, indem Sie auf das Symbol Plus neben dem Symbol Erstellen klicken und ein Währungspaar auswählen. Wenn Sie in der Indikatorzeile auf Mehr klicken und Instanz hinzufügen wählen, wird das Währungspaar EURUSD mit dem Zeitrahmen h1 automatisch hinzugefügt.

Image title

Hinweis

Das Hinzufügen einer Instanz in cTrader Algo entspricht dem Anhängen eines Indikators an einen Chart in der Trade-Anwendung.

Öffnen Sie nun die Registerkarte Protokoll im Bereich Handelsüberwachung unter dem Chart. Wie Sie sehen können, wurde die Nachricht „Hello world" ausgegeben.

Image title

Jedes Mal, wenn der Indikator zum ersten Mal einem Chart hinzugefügt wird oder wenn ein Parameter geändert wird, wird der Chart aktualisiert und die Methode Initialize() erneut aufgerufen. Geben Sie eine andere Nachricht im Abschnitt Parameter ein, um zu sehen, wie sich der Protokolleintrag entsprechend aktualisiert.

Image title

Indikatorausgabe berechnen

Die Methode Calculate() wird für jeden Index historischer Daten und bei jedem eingehenden Tick aufgerufen. Wenn der aktuelle Chart beispielsweise 1000 Balken hat, wird die Methode Calculate() für Index 0, 1, 2 und so weiter bis maximal 999 aufgerufen.

1
public override void Calculate(int index)

Die Methode Calculate() kann während Phasen hoher Volatilität mehrmals pro Sekunde aufgerufen werden oder seltener, wenn der Markt flach ist. Um zu testen, wie es funktioniert, können Sie dem Körper der Methode Calculate() eine Codezeile hinzufügen, um den Indexwert auszugeben, der für jeden neuen Daten-Tick an die Methode übergeben wird. Vergessen Sie nicht, nach dem Hinzufügen von Änderungen im Code-Editor-Fenster jedes Mal auf Erstellen zu klicken.

1
Print("Index: " + index);

Um vom Code-Editor-Fenster zum Chart zu wechseln, klicken Sie auf die hinzugefügte Indikatorinstanz. Wenn Sie die Registerkarte Protokoll im Bereich Handelsüberwachung öffnen, sehen Sie die für jeden Index ausgegebenen Werte, der an die Methode übergeben wurde.

Image title

Die Methode OnDestroy()

Die Methode OnDestroy() wird aufgerufen, wenn der Indikator von einem Chart entfernt wird und nicht mehr benötigt wird. Sie müssen diese Methode implementieren, da sie nicht standardmäßig hinzugefügt wird, wenn Sie einen neuen Indikator erstellen.

1
2
3
4
protected override void OnDestroy()
        {
            base.OnDestroy();            
        }

Diese Methode ist für Programmierer nützlich, da sie es ihnen ermöglicht, nicht verwaltete Ressourcen freizugeben und Abschlussaufgaben durchzuführen. Sie hilft, Speicherlecks zu verhindern und stellt sicher, dass der Indikator nach dem Entfernen keine Ressourcen behält. Beispiele hierfür sind das Schließen von Verbindungen zu externen Datenfeeds, das Freigeben großer Datenobjekte und andere Vorgänge, die Speicher freigeben.

Zusammenfassung

Zusammenfassend veranschaulichen die Methoden Initialize(), Calculate() und OnDestroy() verschiedene Phasen des Lebenszyklus des benutzerdefinierten Indikators. Durch Anpassen des Beispielcodes in der Algo-App können Sie frei entscheiden, wie Sie Indikatorvariablen initialisieren, die Indikatorausgabe berechnen und Abschlussaufgaben ausführen.

Image title