Dokumentation
Anwendungen
Zuletzt aktualisiert am 27. 5. 2020 von Mark Fric
Hinzufügen von Indikatoren und Signalen
Inhalt der Seite
Neue Indikatoren und Signalblöcke können zu StrategyQuant mit Hilfe eines eingebauten 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