Documentação
Aplicações
Última atualização em 18. 5. 2020 por Mark Fric
Blocos de sinal ForceIndex
Conteúdo da página
Nosso novo ForceIndex é implementado, mas, como mencionado anteriormente, está disponível apenas na seção Sinais de Indicadores Aleatórios. Isto significa que ele será combinado aleatoriamente com todas as comparações e valores numéricos aleatórios.
No StrategyQuant X você deve preferir usar sinais - são condições pré-definidas usando um indicador, por exemplo:
O indicador está subindo
O indicador está caindo
Indicador cruza acima do nível
Indicador cruza abaixo do nível
O uso de sinais predefinidos como este tem muitas vantagens, uma delas é que diminui os níveis de liberdade e permite especificar condições que fazem algum sentido real na negociação. A SQ utilizará então essas condições pré-definidas em vez de tentar gerar a condição inteira aleatoriamente.
Abaixo mostraremos como você pode criar seus próprios sinais que utilizam alguns indicadores já implementados - no nosso caso, o ForceIndex. Para este exemplo, vamos implementar dois sinais simples:
A ForceIndex é maior que zero - deve sugerir tendência de alta
ForceIndex é inferior a zero - deve sugerir tendência de queda
Passo 1 - Criação de novo sinal no Editor de Código
Tal como o indicador, o sinal é um snippet que deve ser programado no SQ. Abra CodeEditor, clique em Create new e crie um novo snippet com o nome ForceIndexAboveZero. Escolha Sinal como tipo snippet, e ForceIndex como indicador no qual o sinal se baseia.
Isto criará um novo snippet ForceIndexAboveZero.java e a coloca em SQ -> Blocos -> Indicadores -> pasta FoceIndex.
Quando revisaremos o código, você poderá notar que o código é muito mais simples do que o código para o próprio indicador. Ele também tem parâmetros, que devem corresponder a parâmetros de indicador, e então apenas um método OnBlockEvaluate() que deve retornar verdadeiro ou falso, dependendo se o sinal é válido ou falso.
Observe que o modelo de sinais padrão pode não corresponder ao seu indicador, como é neste caso. Se você tentar compilá-lo, receberá erros de compilação, pois a chamada do indicador Strategy.Indicators.ForceIndex(Input, Period) no método OnBlockEvaluate() não utiliza todos os parâmetros necessários.
Nas próximas etapas modificaremos o modelo de defaukt para que ele funcione com o ForceIndex
Implementar parâmetros ForceIndex corretos
Se você olhar para o indicador ForceIndex, você notará que ele tem parâmetros: Gráfico, Período, MAMethod, Preço Aplicado.
Devemos copiar os mesmos parâmetros também para nosso novo sinal:
classe pública ForceIndexAboveZero estende ConditionBlock { @Parameter gráfico público Gráfico de dados; @Parameter(defaultValue="10", isPeriod = true, minValue=2, maxValue=1000, step=1) período de intenção pública; @Parameter(name="Method", defaultValue="0") @Editor(tipo=Editores.Seleção, valores="Simples=0,Exponencial=1,Alisado=2,Linear ponderado=3") público no MAMethod; @Parameter(defaultValue="0") @Editor(tipo=Editores.Seleção, valores="Fechado=0,Aberto=1,Alto=2,Baixo=3,Mediana=4,Típico=5,Ponderado=6") público int. Preço aplicado;
ou, alternativamente, você pode querer omitir alguns dos parâmetros e usar seu valor fixo em seu lugar. Criar um parâmetro significa que ele será editável no Wizard e o SQ será capaz de gerar valores aleatórios para este parâmetro.
Há mais um parâmetro que devemos acrescentar:
@Parameter público int Shift;
Em contraste com o indicador, o parâmetro Shift nos sinais não é usado por padrão e tem que ser explicitamente adicionado.
Implementar o método OnBlockEvaluate
Abaixo está uma implementação do método OnBlockEvaluate() para nosso sinal. Como você pode ver, é bastante simples - você só tem que obter o indicador chamando Strategy.Indicator.ForceIndex(...) com parâmetros apropriados, e então apenas obter seu valor no Shift especificado e compará-lo com zero.
@Override public boolean OnBlockEvaluate() joga TradingException { Indicador ForceIndex = Estratégia.Indicadores.ForceIndex(Gráfico, Período, MAMethod, Preço Aplicado); valor duplo = indicador.Value.getRounded(Shift); retorno (valor > 0); }
Isto é tudo, nosso novo sinal está agora terminado, podemos clicar em Compile e ele deve ser compilado com sucesso.
Implementar ForceIndexBelowZero
Da mesma forma, devemos implementar também ForceIndexBelowZero. A única diferença em relação ao sinal anterior é que a comparação em OnBlockEvaluate() método será o oposto:
retorno (valor < 0);
Agora compilar também o segundo sinal e depois reiniciar o SQ. Quando você olhar os blocos de construção, você deve ver uma nova seção para o ForceIndex em sinais, com nossos dois novos sinais:
Este artigo foi útil? O artigo foi útil O artigo não foi útil