Documentazione

Applicazioni

Ultimo aggiornamento il 28. 11. 2021 da clonex / Ivan Hudec

Richiamo di un altro indicatore da uno snippet di indicatore

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

6 Commenti
Vecchi
Più recenti Le più votate
Emmanuel
23. 12. 2021 12:18

Questo è molto utile !!!! Grazie !!!!

Emmanuel
23. 12. 2021 12:27

È incredibile, questa soluzione apre a molte possibilità.

Neil Farmer
15. 1. 2022 9:31

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.

tomas262
Amministratore
Rispondi a  Neil Farmer
20. 1. 2022 10:56 pm

Intendi dire che vorresti ottenere il prezzo sessionHigh per una media mobile, ad esempio? O un altro indicatore?

Ultima modifica 4 anni fa di tomas262
Arwin Fakey
Arwin Fakey
4. 2. 2026 12:19

Salve, qualcuno potrebbe aiutarmi per favore? Vorrei aggiungere l'indicatore supertrend alla mia piattaforma sqx.
, Come posso fare per favore?

tomas262
Amministratore
Rispondi a  Arwin Fakey
6. 2. 2026 10:22 pm

L'indicatore SuperTrend è già presente in SQX. Si trova nell'elenco dei blocchi di costruzione sotto la categoria Indicatori