Documentación

Aplicaciones

Última actualización el 28. 11. 2021 por clonex / Ivan Hudec

Llamada a otro indicador desde un fragmento de indicador

Al programar indicadores en Strategy Quant X, puede haber una situación en la que desee llamar a otro indicador y obtener sus valores. En el próximo artículo mostraremos cómo importar y llamar indicadores correctamente.

 

Paso 1 - Crear un nuevo indicador personalizado en el Editor de código

Abra el editor de código, cree un nuevo fragmento y nómbrelo IndicatorCalling. Este artículo presupone conocimientos sobre cómo crear indicadores. En la documentación encontrarás dos ejemplos

 

Paso 2 - Importación de indicadores y configuración del tipo de indicador

En este paso importamos 3 indicadores. ATR, RSI y DPO. La clase Indicadores es una clase caché que almacena en caché todos los indicadores utilizados en una configuración de trading.
ATR y RSI son indicadores creados directamente en StrategyQuantX, y DPO es un indicador que puedes descargar del Servidor de Compartición  aquí.

paquete SQ.Blocks.Indicators.IndicatorCalling;

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

Paso 3 - Configuración de parámetros

El primer parámetro es importante. Hay dos opciones:

  • Parámetro con tipo Series de datos .Esto es válido para una gran parte de los indicadores que se calculan a partir de un solo precio. Por ejemplo los indicadores CCI, RSI, etc. son usualmente calculados desde el precio de Cierre. Puede configurarlos para que se calculen a partir de un precio diferente, por ejemplo, a partir del precio de apertura, pero sigue siendo sólo una matriz de precios.
  • Parámetro con tipo ChartData es un objeto que representa el gráfico completo - tendrá acceso a los precios de Apertura, Máximo, Mínimo, Cierre y Volumen en el gráfico dado.

 

En este caso, siempre que queramos llamar a otro indicador desde un indicador, debemos elegir el tipo de parámetro ChartData Input.

Un indicador puede tener varios parámetros. En nuestro caso, definiremos los parámetros de los indicadores que llamaremos. Los parámetros DPOPeriod, ATRPeriod, RSIPeriod se utilizan para definir los periodos de los indicadores. También el motor genético o el optimizador trabajarán con ellos.

La tercera variable es Valorobserve que tiene una anotación diferente @Salida. Esto significa que esta variable no es un parámetro del indicador, sino su búfer de salida. Los indicadores suelen tener sólo un búfer de salida, pero pueden tener más - por ejemplo la banda de Bollinger tiene búfer Superior e Inferior.

Parámetro
public ChartData Entrada;

@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;

@Salida
public DataSeries Valor;


 

 

Paso 4 - Implementación del método OnBarUpdate()

En este método llamamos a instancias de indicadores y calculamos el valor resultante que almacenamos en el 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 = Indicadores.DPO(Entrada, DPOPeriodo);
  	  	double dpoValue = dpoIndicator.Value.getRounded(0);
        
        if (CurrentBar < Math.max(ATRPeriod,RSIPeriod)) {
            // qué establecer cuando hay menos barras que el parámetro de periodo del indicador
            Value.set(0, 0);

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

double value = rsiValue/atrValue*dpoValue/atrValue para obtener el valor final del indicador. Es un ejemplo, por lo tanto el cálculo no tiene un significado más profundo.

 

Código completo

paquete SQ.Blocks.Indicators.IndicatorCalling;

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


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

    @Parámetro
    public Entrada ChartData;

    @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;

    @Salida
    public DataSeries Valor;

    //------------------------------------------------------------------------
    //------------------------------------------------------------------------
    //------------------------------------------------------------------------


    @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 = Indicadores.DPO(Entrada, DPOPeriodo);
  	  	double dpoValue = dpoIndicator.Value.getRounded(0);
        
        if (CurrentBar < Math.max(ATRPeriod,RSIPeriod)) {
            // qué establecer cuando hay menos barras que el parámetro de periodo del indicador
            Value.set(0, 0);

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

    }
}

 

 

¿Le ha resultado útil este artículo? El artículo era útil El artículo no era útil

6 Comentarios
Más antiguo
Más reciente Más votados
Emmanuel
23. 12. 2021 12:18 am

¡¡¡¡Esto es muy útil !!!! ¡¡¡¡Gracias !!!!

Emmanuel
23. 12. 2021 12:27 am

Esto es asombroso, esta solución abre muchas posibilidades

Neil Farmer
15. 1. 2022 9:31 am

¿Cómo puedo utilizar un indicador como SessionHigh dentro de otro indicador? Para los indicadores de precios que se encuentran en SQ.Blocks.Price, no parece permitir seguir el mismo patrón que se utiliza en el ejemplo anterior.

tomas262
Admin
Responder a  Neil Farmer
20. 1. 2022 10:56 pm

¿Quiere decir que desea obtener el precio sessionHigh de una media móvil, por ejemplo? ¿O de otro indicador?

Última edición hace 4 años por tomas262
Arwin Fakey
Arwin Fakey
4. 2. 2026 12:19 am

hola alguien me podria ayudar por favor me gustaria agregar el indicador supertrend a mi plataforma sqx
, ¿Cómo puedo hacerlo, por favor?

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

El indicador SuperTrend ya está presente en SQX. Puede encontrarlo en la lista de Building blocks en la categoría Indicadores