Documentação

Aplicações

Última atualização em 28. 11. 2021 por clonex / Ivan Hudec

Chamando outro indicador do indicador snippet

Ao programar indicadores no Strategy Quant X, pode haver uma situação em que você queira chamar outro indicador e obter seus valores. No próximo artigo, mostraremos como importar e chamar indicadores corretamente.

 

Etapa 1 - Criar um novo indicador personalizado no Code Editor

Abra o editor de código, crie um novo snippet e nomeie-o IndicatorCalling. Este artigo pressupõe o conhecimento de como criar indicadores. Na documentação, você encontrará dois exemplos

 

Etapa 2 - Importando indicadores e definindo o tipo de indicador

Nessa etapa, importamos três indicadores. ATR, RSI e DPO. A classe Indicators é uma classe de cache que armazena em cache todos os indicadores usados em uma configuração de negociação.
O ATR e o RSI são indicadores criados diretamente no StrategyQuantX, e o DPO é um indicador que você pode baixar do servidor de compartilhamento  aqui.

pacote SQ.Blocks.Indicators.IndicatorCalling;

import com.strategyquant.lib.*;
import com.strategyquant.datalib.*;;
import com.strategyquant.tradinglib.*;
Importar SQ.Internal.IndicatorBlock;
import SQ.Internal.IndicatorBlock;
// importação de indicadores
importar SQ.Blocks.Indicators.ATR.ATR;
importar SQ.Blocks.Indicators.RSI.RSI;
importar SQ.Blocks.Indicators.DPO.DPO;

Etapa 3 - Configurações de parâmetros

O primeiro parâmetro é importante. Há duas opções:

  • Parâmetro com tipo DataSeries .Isso é válido para uma grande parte dos indicadores que são calculados com base em apenas um preço. Por exemplo, os indicadores CCI, RSI etc. geralmente são calculados a partir do preço de fechamento. Você pode configurá-los para serem calculados a partir de um preço diferente, por exemplo, a partir do preço de abertura, mas ainda assim é apenas uma matriz de preços.
  • Parâmetro com tipo ChartData tipo é um objeto que representa todo o gráfico - você terá acesso aos preços Aberto, Alto, Baixo, Fechado, Volume no gráfico dado.

 

Nesse caso, sempre que quisermos chamar outro indicador a partir de um indicador, devemos escolher o tipo de parâmetro ChartData Input.

Um indicador pode ter vários parâmetros. Em nosso caso, definiremos os parâmetros dos indicadores que chamaremos. Os parâmetros DPOPeríodo, Período ATR, RSIPeríodo são usados para definir os períodos dos indicadores. O mecanismo genético ou o otimizador também trabalhará com eles.

A terceira variável é Valor, observe que tem anotação diferente @Output. Isto significa que esta variável não é um parâmetro indicador, mas seu buffer de saída. Os indicadores geralmente têm apenas um buffer de saída, mas podem ter mais - por exemplo, a banda Bollinger tem buffer superior e inferior.

Parâmetros
public ChartData Input;

@Parameter(defaultValue="10", isPeriod=true, minValue=2, maxValue=1000, step=1)
public int DPOPeriod;

@Parameter(defaultValue="10", isPeriod=true, minValue=2, maxValue=1000, step=1)
public int ATRPeriod;

@Parameter(defaultValue="10", isPeriod=true, minValue=2, maxValue=1000, step=1)
public int RSIPeriod;

@Output
public DataSeries Value;


 

 

Etapa 4 - Implementação do método OnBarUpdate()

Nesse método, chamamos instâncias de indicadores e calculamos o valor resultante que armazenamos no objeto Dataseries Valor.

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);
        
        se (CurrentBar < Math.max(ATRPeriod,RSIPeriod)) {
            // o que definir quando houver menos barras do que o parâmetro de período do indicador
            Value.set(0, 0);

        } else {
            double value = rsiValue/atrValue*dpoValue/atrValue;
            Value.set(0, value);
        }

double value = rsiValue/atrValue*dpoValue/atrValue para obter o valor final do indicador. Trata-se de um exemplo, portanto, o cálculo não tem um significado mais profundo.

 

Código completo

pacote SQ.Blocks.Indicators.IndicatorCalling;

import com.strategyquant.lib.*;
import com.strategyquant.datalib.*;;
import com.strategyquant.tradinglib.*;
Importar SQ.Internal.IndicatorBlock;
Importar SQ.Blocks.Indicators.ATR.ATR;
Importar SQ.Blocks.Indicators.RSI.RSI;
Importar SQ.Blocks.Indicators.DPO.DPO;
importar SQ.Internal.IndicatorBlock;


@BuildingBlock(name="(IC) IndicatorCalling", display="IndicatorCalling(#ATRPeriod#,#RSIPeriod#)[#Shift#]", returnType = ReturnTypes.Number)
@Help("Texto de ajuda de IndicatorCalling")
public class IndicatorCalling extends IndicatorBlock {

    @Parameter
    public ChartData Input;

    @Parameter(defaultValue="10", isPeriod=true, minValue=2, maxValue=1000, step=1)
    public int DPOPeriod;

    @Parameter(defaultValue="10", isPeriod=true, minValue=2, maxValue=1000, step=1)
    public int ATRPeriod;

    @Parameter(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);
        
        se (CurrentBar < Math.max(ATRPeriod,RSIPeriod)) {
            // o que definir quando houver menos barras do que o parâmetro de período do indicador
            Value.set(0, 0);

        } else {
            double value = rsiValue/atrValue+dpoValue/atrValue;
            Value.set(0, value);
        }

    }
}

 

 

Este artigo foi útil? O artigo foi útil O artigo não foi útil

6 Comentários
mais antigos
mais recentes Mais votado
Emmanuel
23. 12. 2021 12:18 am

Isso é muito útil !!!! Obrigado !!!!

Emmanuel
23. 12. 2021 12:27 am

Isso é incrível, essa solução abre muitas possibilidades

Neil Agricultor
15. 1. 2022 9:31 am

Como faço para usar um indicador como SessionHigh em outro indicador? Para os indicadores de preço que estão em SQ.Blocks.Price, parece que não é possível seguir o mesmo padrão usado no exemplo acima.

tomas262
Admin
Responder para  Neil Agricultor
20. 1. 2022 10:56 pm

Você quer dizer que gostaria de obter o preço sessionHigh para uma média móvel, por exemplo? Ou outro indicador?

Última edição 4 anos atrás por tomas262
Arwin Fakey
Arwin Fakey
4. 2. 2026 12:19 am

Olá, alguém poderia me ajudar? Gostaria de adicionar o indicador de supertendência à minha plataforma sqx.
, Como posso fazer isso, por favor?

tomas262
Admin
Responder para  Arwin Fakey
6. 2. 2026 10:22 pm

O indicador SuperTrend já está presente no SQX. Você pode encontrar na lista Building blocks, na categoria Indicadores