Documentação
Aplicações
Última atualização em 27. 5. 2020 por Mark Fric
Adicionando indicadores e sinais
Conteúdo da página
Novos indicadores e blocos de sinal podem ser adicionados à StrategyQuant usando um build in Editor de código.
Cada indicador e sinal no StrategyQuant é implementado como um snippet Java, com o código fonte completo visível.
De modo geral:
- cada indicador tem que implementar um EmBarUpdate() método - é aqui que se encontra o verdadeiro algoritmo de indicador.
- todo sinal tem que implementar um método OnBlockEvaluate() que retorna verdadeiro ou falso
Estes métodos são chamados em cada barra, e o indicador ou sinal precisa computar apenas seu(s) último(s) valor(es) e armazená-lo(s) em seus buffers de saída.
Os blocos indicadores e de sinais têm parâmetros - tais como período, ou gráfico. SQ Snippets usam @ anotação para eles, estes parâmetros são definidos como variáveis de classe Java padrão.
Exemplos de anotação em bloco
As anotações definem o nome e o tipo do bloco, e quais das variáveis são parâmetros indicadores e quais são buffers para os valores computados.
Momentum
@BuildingBlock(name="(MO) Momentum", display="Momentum(#Period#)[#Shift#]", returnType = ReturnTypes.Number) @Indicador(oscilador=verdadeiro, valor médio=100, min=96, max=104, passo=0,1) classe pública Momentum estende IndicatorBlock { @Parameter(defaultChartIndex=0) entrada pública da DataSeries; @Parameter(defaultValue="14") período de intenção pública; @Output(name = "Momentum", cor = Cores.Vermelho) valor público da DataSeries;
O momento é inferior ao nível (bloco de sinal)
@BuildingBlock(name="Momentum is lower than Level", display="Momentum(#Period#) < #Level#", returnType = ReturnTypes.Boolean) classe pública MomLower estende ConditionBlock { @Parameter entrada pública da DataSeries; @Parameter(defaultValue="14", minValue=2, maxValue=10000, step=1) período de intenção pública; @Parameter(defaultValue="0", minValue=0, maxValue=200, passo=0,01, builderMinValue=96, builderMaxValue=104, builderStep=0,1) nível duplo público; @Parameter público int Shift;
Indicadores sobre o método BarUpdate() exemplos
Você pode ver um exemplo de alguns indicadores abaixo, na maioria dos casos os códigos são muito simples graças à arquitetura SQ - você não precisa computar todos os valores em todas as barras, mas apenas o valor na última barra.
Momentum
vazio protegido Na BarUpdate() lança a TradingException { if(Barra atual == 0) { Value.set(0, 0); } else { Value.set(0, Input.get(0) * 100.0 / Input.get(Math.min(Period, CurrentBar))); } }
ATR
vazio protegido Na BarUpdate() lança a TradingException { double curHigh = Chart.High.get(0); double curLow = Chart.Low.get(0); double trueRange = curHigh - curLow; se (Barra atual == 0){ Value.set(0, trueRange); } senão { duplo prevClose = Chart.Close.get(1); trueRange = Math.max(Math.abs(curLow - prevClose), Math.max(trueRange, Math.abs(curHigh - prevClose))); Valor.set(0, ((Math.min(CurrentBar + 1, Período) - 1 ) * Value.get(1) + trueRange) / Math.min(CurrentBar + 1, Período)); } }
CCI
vazio protegido Na BarUpdate() lança a TradingException { averageCalculator.onBarUpdate(Input.get(0), CurrentBar); se (Barra atual == 0) { Value.set(0, 0); } senão { média dupla = 0; duplo sma = averageCalculator.getValue(); para (int idx = Math.min(Barra de Corrente, Período - 1); idx >= 0; idx--) { média += Math.abs(Input.get(idx) - sma); } if(mean < 0.0000000001) { Value.set(0, 0); } else { double cci = (Input.get(0) - sma) / (média == 0 ? 1 : (0,015 * (média / Math.min(Período, Barra de Corrente + 1)))); Valor.set(0, cci); } } }
Você pode ver que a CCI usa uma classe de ajuda adicional AverageCalculator, que também está disponível com código fonte completo em SQ/Calculators/AverageCalculator.java
Exemplo do método Signals OnBlockEvaluate()
CCI é superior ao nível
O código para o sinal é muito mais simples do que para o indicador. Geralmente consiste em obter um valor ou valores de um indicador e compará-lo com outros indicadores.
public boolean OnBlockEvaluate() joga TradingException { CCI indicador = Estratégia.Indicadores.CCI(Entrada, Período); valor duplo1 = indicador.valor.getRounded(Shift, 4); retorno (valor1 > Nível); }
Exemplos passo-a-passo
Por favor, verifique os seguintes exemplos passo a passo para saber mais:
Este artigo foi útil? O artigo foi útil O artigo não foi útil