Documentazione
Applicazioni
Ultimo aggiornamento il 27. 5. 2020 da Mark Fric
Aggiunta di indicatori e segnali
Contenuto della pagina
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
