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
