Documentazione
Applicazioni
Ultimo aggiornamento il 28. 11. 2021 da clonex / Ivan Hudec
Richiamo di un altro indicatore da uno snippet di indicatore
Contenuto della pagina
Quando si programmano gli indicatori in Strategy Quant X, può capitare che si voglia chiamare un altro indicatore e accedere ai suoi valori. Nel prossimo articolo mostreremo come importare e chiamare correttamente gli indicatori.
Passo 1 - Creare un nuovo indicatore personalizzato nell'Editor del codice
Aprite l'editor di codice, create un nuovo snippet e chiamatelo IndicatorCalling. Questo articolo presuppone la conoscenza di come si creano gli indicatori. Nella documentazione si trovano due esempi
Fase 2 - Importazione degli indicatori e impostazione del tipo di indicatore
In questa fase importiamo 3 indicatori. ATR, RSI e DPO. La classe Indicatori è una classe cache che memorizza tutti gli indicatori utilizzati in una configurazione di trading.
L'ATR e l'RSI sono indicatori creati direttamente nella StrategyQuantX, mentre il DPO è un indicatore scaricabile dal server di condivisione. qui.
pacchetto SQ.Blocks.Indicators.IndicatorCalling; importare com.strategyquant.lib.*; importare com.strategyquant.datalib.*; importare com.strategyquant.tradinglib.*; importare SQ.Internal.IndicatorBlock; importare SQ.Internal.IndicatorBlock; // importare gli indicatori importare SQ.Blocks.Indicators.ATR.ATR; importare SQ.Blocks.Indicators.RSI.RSI; importare SQ.Blocks.Indicators.DPO.DPO;
Passo 3 - Impostazioni dei parametri
Il primo parametro è importante. Esistono due opzioni:
- Parametro con tipo Serie di dati .Questo vale per gran parte degli indicatori che vengono calcolati a partire da un solo prezzo. Ad esempio, gli indicatori CCI, RSI, ecc. sono solitamente calcolati a partire dal prezzo di chiusura. È possibile configurarli in modo che vengano calcolati da un prezzo diverso, ad esempio dal prezzo di apertura, ma si tratta comunque di un solo array di prezzi.
- Parametro con tipo GraficoDati è un oggetto che rappresenta l'intero grafico: si avrà accesso ai prezzi Open, High, Low, Close, Volume nel grafico dato.
In questo caso, ogni volta che si vuole richiamare un altro indicatore da un indicatore, si deve scegliere il tipo di parametro ChartData Input.
Un indicatore può avere diversi parametri. Nel nostro caso, definiremo i parametri degli indicatori che chiameremo. I parametri DPOPeriodo, Periodo ATR, RSIPeriodo sono utilizzati per definire i periodi degli indicatori. Anche il motore genetico o l'ottimizzatore lavoreranno con essi.
La terza variabile è Valore, si noti che ha un'annotazione diversa @Output. Ciò significa che questa variabile non è un parametro dell'indicatore, ma il suo buffer di uscita. Di solito gli indicatori hanno un solo buffer di uscita, ma possono averne di più, ad esempio la banda di Bollinger ha un buffer superiore e uno inferiore.
Parametro public ChartData Input; @Parametro(defaultValue="10", isPeriod=true, minValue=2, maxValue=1000, step=1) public int DPOPeriod; @Parametro(defaultValue="10", isPeriod=true, minValue=2, maxValue=1000, step=1) public int ATRPeriod; @Parametro(defaultValue="10", isPeriod=true, minValue=2, maxValue=1000, step=1) public int RSIPeriod; @Output public DataSeries Value;
Passo 4 - Implementazione del metodo OnBarUpdate()
In questo metodo si richiamano istanze di indicatori e si calcola il valore risultante, che viene memorizzato nell'oggetto Dataserie Valore.
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)) {
// cosa impostare quando ci sono meno barre rispetto al parametro del periodo dell'indicatore
Value.set(0, 0);
} else {
double value = rsiValue/atrValue*dpoValue/atrValue;
Value.set(0, valore);
}
double value = rsiValue/atrValue*dpoValue/atrValue per ottenere il valore finale dell'indicatore. Si tratta di un esempio, quindi il calcolo non ha un significato più profondo.
Codice completo
pacchetto SQ.Blocks.Indicators.IndicatorCalling;
importare com.strategyquant.lib.*;
importare com.strategyquant.datalib.*;
importare com.strategyquant.tradinglib.*;
importare SQ.Internal.IndicatorBlock;
importare SQ.Blocks.Indicators.ATR.ATR;
importare SQ.Blocks.Indicators.RSI.RSI;
importare SQ.Blocks.Indicators.DPO.DPO;
importare SQ.Internal.IndicatorBlock;
@BuildingBlock(name="(IC) IndicatorCalling", display="IndicatorCalling(#ATRPeriod#,#RSIPeriod#)[#Shift#]", returnType = ReturnTypes.Number)
@Help("Testo di aiuto di IndicatorCalling")
public class IndicatorCalling extends IndicatorBlock {
@Parametro
public ChartData Input;
@Parametro(defaultValue="10", isPeriod=true, minValue=2, maxValue=1000, step=1)
public int DPOPeriod;
@Parametro(defaultValue="10", isPeriod=true, minValue=2, maxValue=1000, step=1)
public int ATRPeriod;
@Parametro(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)) {
// cosa impostare quando ci sono meno barre rispetto al parametro del periodo dell'indicatore
Value.set(0, 0);
} else {
double value = rsiValue/atrValue+dpoValue/atrValue;
Value.set(0, valore);
}
}
}
Questo articolo è stato utile? L'articolo è stato utile L'articolo non è stato utile
Questo è molto utile !!!! Grazie !!!!
È incredibile, questa soluzione apre a molte possibilità.
Come si utilizza un indicatore come SessionHigh all'interno di un altro indicatore? Per gli indicatori di prezzo che si trovano in SQ.Blocks.Price, non sembra che sia possibile seguire lo stesso schema utilizzato nell'esempio precedente.
Intendi dire che vorresti ottenere il prezzo sessionHigh per una media mobile, ad esempio? O un altro indicatore?
Salve, qualcuno potrebbe aiutarmi per favore? Vorrei aggiungere l'indicatore supertrend alla mia piattaforma sqx.
, Come posso fare per favore?
L'indicatore SuperTrend è già presente in SQX. Si trova nell'elenco dei blocchi di costruzione sotto la categoria Indicatori