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:

Designer_Source_Code_Indicator_00

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:

Designer_Source_Code_Indicator_01

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.