Documentação

Aplicações

Última atualização em 27. 5. 2020 por Mark Fric

Adicionando indicadores e sinais

Novos indicadores e blocos de sinal podem ser adicionados à StrategyQuant usando um build in Editor de código.

Editor de Código SQ

 

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

Assine
Notificação de
0 Comentários
Feedbacks em linha
Ver todos os comentários