Documentación
Aplicaciones
Última actualización el 28. 11. 2021 por clonex / Ivan Hudec
Llamada a otro indicador desde un fragmento de indicador
Contenido de la página
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
¡¡¡¡Esto es muy útil !!!! ¡¡¡¡Gracias !!!!
Esto es asombroso, esta solución abre muchas posibilidades
¿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.
¿Quiere decir que desea obtener el precio sessionHigh de una media móvil, por ejemplo? ¿O de otro indicador?
hola alguien me podria ayudar por favor me gustaria agregar el indicador supertrend a mi plataforma sqx
, ¿Cómo puedo hacerlo, por favor?
El indicador SuperTrend ya está presente en SQX. Puede encontrarlo en la lista de Building blocks en la categoría Indicadores