Dokumentation

Anwendungen

Zuletzt aktualisiert am 27. 5. 2020 von Mark Fric

Hinzufügen von Indikatoren und Signalen

Neue Indikatoren und Signalblöcke können zu StrategyQuant mit Hilfe eines eingebauten Code-Editor.

SQ-Code-Editor

 

Jeder Indikator und jedes Signal in StrategyQuant ist als Java-Snippet implementiert, wobei der vollständige Quellcode sichtbar ist.

Ganz allgemein gesprochen:

  • muss jeder Indikator eine OnBarUpdate() Methode - hier befindet sich der eigentliche Indikatoralgorithmus.
  • jedes Signal muss eine OnBlockEvaluate()-Methode implementieren, die true oder false zurückgibt

Diese Methoden werden bei jedem Balken aufgerufen, und der Indikator oder das Signal muss nur seine neuesten Werte berechnen und in seinen Ausgabepuffern speichern.

Indikator- und Signalblöcke haben Parameter - wie Periode oder Diagramm. SQ Snippets verwenden dafür die @-Annotation, diese Parameter werden als Standard-Java-Klassenvariablen definiert.

 

Beispiele für Blockanmerkungen

Die Anmerkungen legen den Namen und den Typ des Blocks fest und bestimmen, welche der Variablen Indikatorparameter und welche Puffer für berechnete Werte sind.

Momentum

@BuildingBlock(name="(MO) Momentum", display="Momentum(#Period#)[#Shift#]", returnType = ReturnTypes.Number)
@Indicator(oscillator=true, middleValue=100, min=96, max=104, step=0.1)
public class Momentum extends IndicatorBlock {

    @Parameter(defaultChartIndex=0)
    public DataSeries Input;
    
    @Parameter(defaultValue="14")
    public int Zeitraum;

    @Output(name ="Momentum", color = Colors.Red)
    public DataSeries Value;

 

Momentum ist niedriger als Level (Signalblock)

@BuildingBlock(name="Momentum ist kleiner als Level", display="Momentum(#Period#) < #Level#", returnType = ReturnTypes.Boolean)
public class MomLower extends ConditionBlock {
    
    @Parameter
    public DataSeries Input;
    
    @Parameter(defaultValue="14", minValue=2, maxValue=10000, step=1)
    public int Zeitraum;

    @Parameter(defaultValue="0", minValue=0, maxValue=200, step=0.01, builderMinValue=96, builderMaxValue=104, builderStep=0.1)
    public double Level;

    @Parameter
    public int Shift;

 

 

Beispiele für die OnBarUpdate()-Methode von Indikatoren

Nachfolgend sehen Sie ein Beispiel für einige Indikatoren. In den meisten Fällen sind die Codes dank der SQ-Architektur sehr einfach - Sie müssen nicht alle Werte auf allen Balken berechnen, sondern nur den Wert auf dem allerletzten Balken.

Momentum

protected void OnBarUpdate() throws TradingException {
    if(CurrentBar == 0) {
        Value.set(0, 0);
    } else {
        Value.set(0, Input.get(0) * 100.0 / Input.get(Math.min(Period, CurrentBar)));
    }
}

 

ATR

protected void OnBarUpdate() throws TradingException {
    double curHigh = Chart.High.get(0);
    double curLow = Chart.Low.get(0);
    double trueRange = curHigh - curLow;
    
    if (CurrentBar == 0){
        Value.set(0, trueRange);
    }
    sonst {
        double prevClose = Chart.Close.get(1);
        trueRange = Math.max(Math.abs(curLow - prevClose), Math.max(trueRange, Math.abs(curHigh - prevClose)));
        
        Value.set(0, ((Math.min(CurrentBar + 1, Period) - 1 ) * Value.get(1) + trueRange) / Math.min(CurrentBar + 1, Period));
    }
}

 

CCI

protected void OnBarUpdate() throws TradingException {
    averageCalculator.onBarUpdate(Input.get(0), CurrentBar);
    
    if (AktuellerBalken == 0) {
        Value.set(0, 0);
    }
    sonst {
        double mean = 0;
        double sma = averageCalculator.getValue();
        
        for (int idx = Math.min(CurrentBar, Period - 1); idx >= 0; idx--) {
            mean += Math.abs(Input.get(idx) - sma);
        }
        
        if(Mittelwert < 0,0000000001) {
            Wert.set(0, 0);
        } else {
            double cci = (Input.get(0) - sma) / (mean == 0 ? 1 : (0,015 * (mean / Math.min(Period, CurrentBar + 1))));
            Value.set(0, cci);
        }
    }
}

Sie können sehen, dass CCI eine zusätzliche Hilfsklasse AverageCalculator verwendet, die auch mit vollständigem Quellcode im Ausschnitt SQ/Calculators/AverageCalculator.java verfügbar ist

 

Beispiel der Methode OnBlockEvaluate() für Signale

CCI ist höher als das Niveau

Der Code für ein Signal ist viel einfacher als für einen Indikator. Er besteht in der Regel darin, einen Wert (oder mehrere Werte) eines Indikators zu erhalten und ihn mit etwas anderem zu vergleichen.

public boolean OnBlockEvaluate() throws TradingException {
    CCI indicator = Strategy.Indicators.CCI(Input, Period);
    double value1 = indicator.Value.getRounded(Shift, 4);
    
    return (Wert1 > Level);
}

 

 

Schritt-für-Schritt-Beispiele

Die folgenden Beispiele zeigen Ihnen Schritt für Schritt, wie es geht:

 

War dieser Artikel hilfreich? Der Artikel war nützlich Der Artikel war nicht nützlich

Abonnieren
Benachrichtigen Sie mich bei
0 Kommentare
Inline-Rückmeldungen
Alle Kommentare anzeigen