Dokumentation

Anwendungen

Zuletzt aktualisiert am 28. 11. 2021 von clonex / Ivan Hudec

Aufrufen eines anderen Indikators aus einem Indikator-Snippet

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

Abonnieren
Benachrichtigen Sie mich bei
4 Kommentare
Älteste
Neuestes Meistgewählt
Inline-Rückmeldungen
Alle Kommentare anzeigen
Emmanuel
23. 12. 2021 12:18 Uhr

Dies ist sehr hilfreich !!!! Vielen Dank !!!!

Emmanuel
23. 12. 2021 12:27 Uhr

Das ist erstaunlich, diese Lösung eröffnet viele Möglichkeiten

Neil Farmer
15. 1. 2022 9:31 Uhr

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.

tomas262
Verwaltung
Antwort an  Neil Farmer
20. 1. 2022 10:56 Uhr

Meinen Sie damit, dass Sie z. B. den SessionHigh-Preis für einen gleitenden Durchschnitt erhalten möchten? Oder einen anderen Indikator?

Zuletzt geändert 3 Jahre zuvor von tomas262