Indikator erstellen
Das Erstellen eines eigenen Indikators in der API wird im Abschnitt Benutzerdefinierter Indikator beschrieben. Solche Indikatoren sind vollständig mit Designer kompatibel.
Um einen Indikator zu erstellen, wählen Sie im Panel Schemata den Ordner Indikatoren aus, klicken mit der rechten Maustaste und wählen im Kontextmenü Hinzufügen:

Der Indikatorcode sieht folgendermaßen aus:
import clr
import random
clr.AddReference("StockSharp.BusinessEntities")
clr.AddReference("StockSharp.Algo")
from StockSharp.Algo.Indicators import BaseIndicator, DecimalIndicatorValue
from indicator_extensions import *
class empty_indicator(BaseIndicator):
"""
Beispielindikator zum Speichern und Laden von Parametern.
Dokumentation https://doc.stocksharp.com/topics/designer/strategies/using_code/python/create_own_indicator.html
Ändert den Eingangspreis um +20 % oder -20 %.
"""
def __init__(self):
super(empty_indicator, self).__init__()
self._change = 20
self._counter = 0
self._isFormed = False
@property
def Change(self) -> int:
return self._change
@Change.setter
def Change(self, value):
self._change = value
self.Reset()
def CalcIsFormed(self):
"""Bestimmt, ob der Indikator genug Eingaben erhalten hat, um als gebildet zu gelten."""
return self._isFormed
def Reset(self):
"""Setzt den Zustand des Indikators und interne Zähler zurück."""
super(empty_indicator, self).Reset()
self._isFormed = False
self._counter = 0
def OnProcess(self, input):
"""
Verarbeitet den eingehenden Indikatorwert und wendet eine zufällige Änderung an.
:param input: Der eingehende Indikatorwert.
:return: Ein neuer DecimalIndicatorValue nach Anwendung der Änderungen.
"""
# Bei jedem 10. Aufruf versuchen, einen leeren Wert zurückzugeben
if random.randint(0, 10) == 0:
return DecimalIndicatorValue(self, input.Time)
if self._counter == 5:
# Zum Beispiel benötigt unser Indikator 5 Eingaben, um gebildet zu werden
self._isFormed = True
self._counter += 1
value = to_decimal(input)
# Zufällige Änderung um +/- _change Prozent auf den aktuellen Wert anwenden
value += value * random.randint(-self._change, self._change) / 100.0
result = DecimalIndicatorValue(self, value, input.Time)
# Wert auf Basis einer zufälligen Entscheidung als final markieren
result.IsFinal = bool(random.getrandbits(1))
return result
def Load(self, storage):
"""
Lädt die Indikatorparameter aus dem persistenten Speicher.
:param storage: Der Einstellungsspeicher, aus dem geladen wird.
"""
super(empty_indicator, self).Load(storage)
self.Change = storage.GetValue("Change", self.Change)
def Save(self, storage):
"""
Speichert die Indikatorparameter im persistenten Speicher.
:param storage: Der Einstellungsspeicher, in den gespeichert wird.
"""
super(empty_indicator, self).Save(storage)
storage.SetValue("Change", self.Change)
def __str__(self):
return f"Change: {self.Change}"
def ToString(self):
return str(self)
Dieser Indikator empfängt einen eingehenden Wert und erzeugt auf Basis des angegebenen Parameterwerts Änderung eine zufällige Abweichung.
Die Beschreibung der Indikatormethoden finden Sie im Abschnitt Benutzerdefinierter Indikator.
Um den erstellten Indikator zum Schema hinzuzufügen, verwenden Sie den Würfel Indikator und legen darin den gewünschten Indikator fest:

Der Parameter Änderung, der zuvor im Indikatorcode festgelegt wurde, wird im Eigenschaftenpanel angezeigt.
Warning
Indikatoren aus Python-Code können nicht in Strategien verwendet werden, die in Python-Code erstellt wurden. Sie können nur in Strategien verwendet werden, die aus Würfeln erstellt wurden.