Documentación
Aplicaciones
Última actualización el 27. 5. 2020 by Mark Fric
Añadir indicadores y señales
Contenido de la página
Se pueden añadir nuevos bloques de indicadores y señales a StrategyQuant utilizando una función integrada. Editor de código.
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