Documentazione
Applicazioni
Ultimo aggiornamento il 27. 5. 2020 da Mark Fric
Aggiunta di indicatori e segnali
Page contents
Nuovi blocchi di indicatori e segnali possono essere aggiunti a StrategyQuant utilizzando un'apposita funzione. Editor di codice.
Ogni indicatore e segnale di StrategyQuant è implementato come snippet Java, con il codice sorgente completo visibile.
In generale:
- ogni indicatore deve implementare un OnBarUpdate() è il metodo in cui si trova l'algoritmo dell'indicatore.
- ogni segnale deve implementare un metodo OnBlockEvaluate() che restituisca true o false
Questi metodi vengono richiamati a ogni barra e l'indicatore o il segnale deve calcolare solo i suoi ultimi valori e memorizzarli nei suoi buffer di uscita.
I blocchi di indicatori e segnali hanno dei parametri, come il periodo o il grafico. Gli Snippet SQ utilizzano l'annotazione @ per questi parametri, che vengono definiti come variabili standard della classe Java.
Esempi di annotazione a blocchi
Le annotazioni definiscono il nome e il tipo del blocco, nonché quali variabili sono parametri indicatori e quali sono buffer per i valori calcolati.
Momento
@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 { @Parametro(defaultChartIndex=0) public DataSeries Input; @Parametro(defaultValue="14") public int Periodo; @Output(name = "Momentum", color = Colors.Red) public DataSeries Value;
Il Momentum è inferiore al Livello (blocco del segnale)
@BuildingBlock(name="Il Momentum è inferiore al Livello", display="Momentum(#Period#) < #Level#", returnType = ReturnTypes.Boolean) public class MomLower extends ConditionBlock { @Parametro public DataSeries Input; @Parametro(defaultValue="14", minValue=2, maxValue=10000, step=1) public int Periodo; @Parametro(defaultValue="0", minValue=0, maxValue=200, step=0.01, builderMinValue=96, builderMaxValue=104, builderStep=0.1) public double Livello; @Parametro public int Shift;
Esempi di metodo OnBarUpdate() degli indicatori
Di seguito potete vedere un esempio di alcuni indicatori; nella maggior parte dei casi i codici sono molto semplici grazie all'architettura SQ - non è necessario calcolare tutti i valori di tutte le barre, ma solo il valore dell'ultima barra.
Momento
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; se (CurrentBar == 0){ Value.set(0, trueRange); } altrimenti { 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); se (CurrentBar == 0) { Value.set(0, 0); } altrimenti { double media = 0; double sma = averageCalculator.getValue(); for (int idx = Math.min(CurrentBar, Period - 1); idx >= 0; idx--) { media += Math.abs(Input.get(idx) - sma); } se(media < 0,0000000001) { Value.set(0, 0); } else { double cci = (Input.get(0) - sma) / (mean == 0 ? 1 : (0,015 * (media / Math.min(Period, CurrentBar + 1)))); Value.set(0, cci); } } }
Si può notare che CCI utilizza la classe di aiuto AverageCalculator, che è disponibile con il codice sorgente completo nel frammento SQ/Calculators/AverageCalculator.java
Esempio del metodo dei segnali OnBlockEvaluate()
Il CCI è superiore al livello
Il codice per i segnali è molto più semplice di quello per gli indicatori. Di solito consiste nell'ottenere il valore (o i valori) di un indicatore e confrontarlo con qualcos'altro.
public boolean OnBlockEvaluate() throws TradingException { Indicatore CCI = Strategy.Indicators.CCI(Input, Period); double value1 = indicator.Value.getRounded(Shift, 4); return (value1 > Level); }
Esempi passo-passo
Per saperne di più, consultate i seguenti esempi passo-passo:
Questo articolo è stato utile? L'articolo è stato utile L'articolo non è stato utile