Dokumentation
Anwendungen
Zuletzt aktualisiert am 28. 11. 2021 von clonex / Ivan Hudec
Aufrufen eines anderen Indikators aus einem Indikator-Snippet
Inhalt der Seite
Bei der Programmierung von Indikatoren in Strategy Quant X kann es vorkommen, dass Sie einen anderen Indikator aufrufen und auf dessen Werte zugreifen möchten. Im nächsten Artikel werden wir zeigen, wie man Indikatoren korrekt importiert und aufruft.
Schritt 1 - Erstellen eines neuen benutzerdefinierten Indikators im Code-Editor
Öffnen Sie den Code-Editor, erstellen Sie ein neues Snippet und nennen Sie es IndicatorCalling. Dieser Artikel setzt voraus, dass Sie wissen, wie man Indikatoren erstellt. In der Dokumentation finden Sie zwei Beispiele
Schritt 2 - Importieren von Indikatoren und Einstellen des Indikatortyps
In diesem Schritt importieren wir 3 Indikatoren. ATR, RSI und DPO. Die Indicators-Klasse ist eine Cache-Klasse, die alle in einem Handels-Setup verwendeten Indikatoren zwischenspeichert.
ATR und RSI sind Indikatoren, die direkt in StrategyQuantX erstellt werden, und DPO ist ein Indikator, den Sie vom Sharing Server herunterladen können. hier.
Paket SQ.Blocks.Indicators.IndicatorCalling; import com.strategyquant.lib.*; importieren com.strategyquant.datalib.*; import com.strategyquant.tradinglib.*; import com.strategyquant.tradinglib.*; import SQ.Internal.IndicatorBlock; importieren SQ.Internal.IndicatorBlock; // Indikatoren importieren import SQ.Blocks.Indicators.ATR.ATR; importieren SQ.Blocks.Indicators.RSI.RSI; // importieren SQ.Blocks.Indicators.RSI; importieren SQ.Blocks.Indicators.DPO.DPO;
Schritt 3 - Parametereinstellungen
Der erste Parameter ist wichtig. Es gibt zwei Optionen:
- Parameter mit Typ DataSeries .Dies gilt für einen großen Teil der Indikatoren, die nur aus einem Preis berechnet werden. Zum Beispiel CCI, RSI, etc. Indikatoren sind in der Regel von Close Preis berechnet. Sie können sie so konfigurieren, dass sie von einem anderen Preis berechnet werden, z. B. vom Eröffnungskurs, aber es handelt sich immer noch um ein einziges Preisfeld.
- Parameter mit Typ ChartData ist ein Objekt, das das gesamte Diagramm darstellt - Sie haben Zugang zu den Preisen Open, High, Low, Close, Volume im gegebenen Diagramm.
In diesem Fall müssen wir, wenn wir einen anderen Indikator von einem Indikator aus aufrufen wollen, den Parametertyp ChartData Input wählen.
Ein Indikator kann mehrere Parameter haben. In unserem Fall werden wir die Parameter der Indikatoren definieren, die wir aufrufen werden. Die Parameter DPOPeriod, ATRPeriode, RSIPeriod werden verwendet, um die Zeiträume der Indikatoren zu definieren. Auch die genetische Maschine oder der Optimierer werden mit ihnen arbeiten.
Die dritte Variable ist Wertbeachten Sie, dass es eine andere Anmerkung hat @Output. Das bedeutet, dass es sich bei dieser Variablen nicht um einen Indikatorparameter, sondern um seinen Ausgabepuffer handelt. Indikatoren haben in der Regel nur einen Ausgabepuffer, aber sie können auch mehrere haben - zum Beispiel hat das Bollinger Band einen oberen und einen unteren Puffer.
Parameter public ChartData Input; @Parameter(defaultValue="10", isPeriod=true, minValue=2, maxValue=1000, step=1) public int DPOPeriod; @Parameter(defaultValue="10", isPeriod=true, minValue=2, maxValue=1000, step=1) public int ATRPeriod; @Parameter(defaultValue="10", isPeriod=true, minValue=2, maxValue=1000, step=1) public int RSIPeriod; @Output public DataSeries Value;
Schritt 4 - Implementierung der Methode OnBarUpdate()
In dieser Methode rufen wir Instanzen von Indikatoren auf und berechnen den resultierenden Wert, den wir in dem Objekt Dataserien Wert.
protected void OnBarUpdate() throws TradingException { ATR aTRIndicator = Indicators.ATR(Input, ATRPeriod); double atrValue = aTRIndicator.Value.getRounded(0); RSI rsiIndicator = Indicators.RSI(Input.Close, RSIPeriod); double rsiValue = rsiIndicator.Value.getRounded(0); DPO dpoIndicator = Indicators.DPO(Input, DPOPeriod); double dpoValue = dpoIndicator.Value.getRounded(0); if (CurrentBar < Math.max(ATRPeriod,RSIPeriod)) { // was gesetzt werden soll, wenn es weniger Balken als den Indikator-Periodenparameter gibt Value.set(0, 0); } else { double value = rsiValue/atrValue*dpoValue/atrValue; Value.set(0, value); }
double value = rsiValue/atrValue*dpoValue/atrValue, um den Endwert des Indikators zu erhalten. Es handelt sich um ein Beispiel, daher hat die Berechnung keine tiefere Bedeutung.
Vollständiger Code
Paket SQ.Blocks.Indicators.IndicatorCalling; import com.strategyquant.lib.*; importieren com.strategyquant.datalib.*; import com.strategyquant.tradinglib.*; import com.strategyquant.tradinglib.*; import SQ.Internal.IndicatorBlock; import SQ.Blocks.Indicators.ATR.ATR; import SQ.Blocks.Indicators.RSI.RSI; import SQ.Blocks.Indicators.RSI; import SQ.Blocks.Indicators.DPO.DPO; import SQ.Blocks.Indicators.DPO; import SQ.Internal.IndicatorBlock; @BuildingBlock(name="(IC) IndicatorCalling", display="IndicatorCalling(#ATRPeriod#,#RSIPeriod#)[#Shift#]", returnType = ReturnTypes.Number) @Help("IndicatorCalling Hilfetext") public class IndicatorCalling extends IndicatorBlock { @Parameter public ChartData Input; @Parameter(defaultValue="10", isPeriod=true, minValue=2, maxValue=1000, step=1) public int DPOPeriod; @Parameter(defaultValue="10", isPeriod=true, minValue=2, maxValue=1000, step=1) public int ATRPeriod; @Parameter(defaultValue="10", isPeriod=true, minValue=2, maxValue=1000, step=1) public int RSIPeriod; @Output public DataSeries Value; //------------------------------------------------------------------------ //------------------------------------------------------------------------ //------------------------------------------------------------------------ @Override protected void OnBarUpdate() throws TradingException { ATR aTRIndicator = Indicators.ATR(Input, ATRPeriod); double atrValue = aTRIndicator.Value.getRounded(0); RSI rsiIndicator = Indicators.RSI(Input.Close, RSIPeriod); double rsiValue = rsiIndicator.Value.getRounded(0); DPO dpoIndicator = Indicators.DPO(Input, DPOPeriod); double dpoValue = dpoIndicator.Value.getRounded(0); if (CurrentBar < Math.max(ATRPeriod,RSIPeriod)) { // was gesetzt werden soll, wenn es weniger Balken als den Indikator-Periodenparameter gibt Value.set(0, 0); } else { double value = rsiValue/atrValue+dpoValue/atrValue; Value.set(0, value); } } }
War dieser Artikel hilfreich? Der Artikel war nützlich Der Artikel war nicht nützlich
Dies ist sehr hilfreich !!!! Vielen Dank !!!!
Das ist erstaunlich, diese Lösung eröffnet viele Möglichkeiten
Wie kann ich einen Indikator wie SessionHigh innerhalb eines anderen Indikators verwenden? Bei den Preisindikatoren, die in SQ.Blocks.Price enthalten sind, scheint es nicht möglich zu sein, das gleiche Muster wie im obigen Beispiel zu verwenden.
Meinen Sie damit, dass Sie z. B. den SessionHigh-Preis für einen gleitenden Durchschnitt erhalten möchten? Oder einen anderen Indikator?