Documentación

Aplicaciones

Última actualización el 27. 5. 2020 by Mark Fric

Añadir indicadores y señales

Se pueden añadir nuevos bloques de indicadores y señales a StrategyQuant utilizando una función integrada. Editor de código.

Editor de código SQ

 

Cada indicador y señal en StrategyQuant se implementa como un fragmento de Java, con el código fuente completo visible.

En general:

  • cada indicador debe aplicar un OnBarUpdate() es donde se encuentra el algoritmo del indicador.
  • cada señal debe implementar un método OnBlockEvaluate() que devuelva true o false

Estos métodos son llamados en cada barra, y el indicador o señal necesita calcular sólo su(s) último(s) valor(es) y almacenarlo(s) en sus buffers de salida.

Los bloques de indicadores y señales tienen parámetros, como el periodo o el gráfico. SQ Snippets utiliza la anotación @ para ellos, estos parámetros se definen como variables de clase Java estándar.

 

Ejemplos de anotación en bloque

Las anotaciones definen el nombre y el tipo del bloque, y cuáles de las variables son parámetros indicadores y cuáles son buffers para valores calculados.

Impulso

@BuildingBlock(name="(MO) Momentum", display="Momentum(#Period#)[#Shift#]", returnType = ReturnTypes.Number)
@Indicator(oscilador=true, middleValue=100, min=96, max=104, step=0.1)
public class Momentum extends IndicadorBloque {

    @Parámetro(defaultChartIndex=0)
    public DataSeries Entrada;
    
    @Parameter(defaultValue="14")
    public int Periodo;

    @Output(name = "Momentum", color = Colors.Red)
    public DataSeries Valor;

 

El impulso es inferior al nivel (bloqueo de señal)

@BuildingBlock(name="Momento es menor que Nivel", display="Momento(#Periodo#) < #Nivel#", returnType = ReturnTypes.Boolean)
public class MomLower extends CondiciónBloque {
    
    @Parámetro
    public DataSeries Entrada;
    
    @Parameter(defaultValue="14", minValue=2, maxValue=10000, step=1)
    public int Periodo;

    @Parameter(defaultValue="0", minValue=0, maxValue=200, step=0.01, builderMinValue=96, builderMaxValue=104, builderStep=0.1)
    public double Nivel;

    @Parámetro
    public int Desplazamiento;

 

 

Ejemplos de métodos de indicadores OnBarUpdate()

Puede ver un ejemplo de algunos indicadores a continuación, en la mayoría de los casos los códigos son muy simples gracias a la arquitectura SQ - no es necesario calcular todos los valores en todas las barras, sino sólo el valor en la última barra.

Impulso

protected void OnBarUpdate() throws TradingException {
    if(CurrentBar == 0) {
        Value.set(0, 0);
    } else {
        Value.set(0, Input.get(0) * 100.0 / Input.get(Math.min(Period, CurrentBar)));
    }
}

 

ATR

protected void OnBarUpdate() throws TradingException {
    double curHigh = Chart.High.get(0);
    double curLow = Chart.Low.get(0);
    double trueRange = curHigh - curLow;
    
    if (CurrentBar == 0){
        Value.set(0, trueRange);
    }
    else {
        double prevClose = Chart.Close.get(1);
        trueRange = Math.max(Math.abs(curLow - prevClose), Math.max(trueRange, Math.abs(curHigh - prevClose)));
        
        Value.set(0, ((Math.min(CurrentBar + 1, Period) - 1 ) * Value.get(1) + trueRange) / Math.min(CurrentBar + 1, Period));
    }
}

 

CCI

protected void OnBarUpdate() throws TradingException {
    averageCalculator.onBarUpdate(Input.get(0), CurrentBar);
    
    if (CurrentBar == 0) {
        Valor.set(0, 0);
    }
    else {
        double media = 0;
        double sma = mediaCalculator.getValue();
        
        for (int idx = Math.min(CurrentBar, Period - 1); idx >= 0; idx--) {
            media += Math.abs(Input.get(idx) - sma);
        }
        
        if(media < 0.0000000001) {
            Valor.set(0, 0);
        } else {
            double cci = (Input.get(0) - sma) / (media == 0 ? 1 : (0.015 * (media / Math.min(Period, CurrentBar + 1))));
            Value.set(0, cci);
        }
    }
}

Puede ver que CCI utiliza la clase de ayuda adicional AverageCalculator, que también está disponible con el código fuente completo en el fragmento SQ/Calculators/AverageCalculator.java

 

Señales OnBlockEvaluate() ejemplo de método

El ICC es superior al nivel

El código de una señal es mucho más sencillo que el de un indicador. Por lo general consiste en obtener un valor(es) de un indicador y compararlo con algo más.

public boolean OnBlockEvaluate() lanza TradingException {
    indicador CCI = Strategy.Indicators.CCI(Input, Period);
    double valor1 = indicador.Valor.getRounded(Desplazamiento, 4);
    
    return (valor1 > Nivel);
}

 

 

Ejemplos paso a paso

Consulte los siguientes ejemplos paso a paso para obtener más información:

 

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

Suscríbase a
Notificar a
0 Comentarios
Feedbacks de Inline
Ver todos los comentarios