Neo traderBot

Neo traderBot

Você sabia?

Um backtesting adequado deve buscar simular situações práticas do mercado (slippage, custo de operação, etc...)

Programando Estratégias no Profit

Criando seu próprio Indicador

Leitura estimada: 9 minutos 569 views
Reproduzir vídeo

Médias móveis, RSI, MACD, Bandas de Bollinger, Canal de Keltner, OBV, ATR, VWAP…Você já sabe do que eu estou falando: Dos indicadores de análise técnica! Nesse documento eu irei abordar o processo de criação de um indicador para que você entenda as etapas necessárias para criação do seu próprio indicador, desde a análise de dados e concepção do indicador até a implementação e verificação de consistência.

No vídeo acima, você poderá acompanhar o conteúdo deste documento de forma mais dinâmica, bem como acompanhar um exemplo do processo de criação do indicador Neo Volatility Band.

Introdução

Os indicadores nasceram com a análise técnica e se pudéssemos eleger o primeiro da espécie, seria a média móvel! Ela é usada há mais de um século…numa época e que não tinha computador, calculadoras digitais e os trades não ocorriam em alta frequencia como hoje. No entanto, já eram úteis para identificar tendências…Você sabe que elas podem ser aritméticas, exponenciais, ponderadas… E quando utilizadas em pares dão origem até a outros indicadores tal como o MACD.

Com o tempo surgiram vários outros indicadores, que passaram a ser agrupados entre indicadores de tendência, osciladores (que buscam identificar divergências que sinalizem reversões), indicadores de volatilidade, entre outros.

Criar um indicador qualquer não é tão difícil…o desafio é criar um que seja útil e consistente!

O que quero dizer com útil? Um indicador que possa ser usado como base para um setup operacional, afinal isso é o que se pretende fazer com indicadores! Além é claro de enfeitar o gráfico com toda a paleta de cores possíveis! (Só para deixar claro, isso foi uma ironia!)

E consistente…o que isso significa? Um indicador que responda objetivamente ao propósito pelo qual foi criado, ou seja, que tenha forte correlação com o que propõe sinalizar.

Então vamos direto ao ponto…Vamos abordar o fluxo para criação de um indicador e explicar em detalhes cada etapa.

Fluxo para criação de um indicador

A figura abaixo apresenta um diagrama das etapas necessárias para criação de um indicador. Observa-se que elas foram dispostas em um formato de ciclo onde, o fluxo se retroalimenta.

O mais natural é iniciar o fluxo pela “Análise de dados” passando pelas etapas de “Definição de Cálculo”, “Escrita de código fonte e “Verificação de consistência”.

Vamos abordar nas seções subsequentes o escopo de cada etapa.

1) Analisar dados

Esta é a primeira etapa do fluxo de criação de um indicador. Ao analisar os dados, temos que definir um enfoque: movimentação de preço, volume, agressão, volatilidade; bem como estudar a relação entre as variáveis analisadas.

O ideal é identificar um padrão que possa ser sinalizado com antecedência e confiança estatística. Os indicadores podem servir ao propósito de identificar tendências, reversões de preço, consolidações, exaustão de movimento, entre outros.

2) Definir Cálculo

Uma vez identificado um padrão nos dados, o desafio é conseguir converter números e ideias em fórmulas matemáticas. Afinal, teremos que programar o indicador, ainda que seja uma soma, divisão ou multiplicação, ou ponderação de algum valor, esta conta precisa fazer sentido!

Para definição do cálculo do indicador devemos sempre seguir a máxima de que “soluções devem ser tão simples quanto possível e tão complexas quanto for necessário”. Não tem como acertar sempre…portanto, o indicador será um modelo de aproximação da realidade, passível de erro e de falsas sinalizações. Outro cuidado que devemos ter nessa etapa é de não tornar as exceções regras do cálculo.

Ou seja, tente evitar criar muitas restrições no cálculo para mitigar o risco de estar no final das contas um ajuste de curva.

3) Escrever o código fonte

Dado o enorme desafio das etapas anteriores, talvez a codificação do indicador seja a parte mais fácil do processo!

Como sempre dizemos, comece seu código simples e vá complicando aos poucos, de forma iterativa. Não tente “abraçar o mundo”…um indicador é só um indicador…não comece a caracterizar seu indicador como um setup em si ou como uma regra de coloração. O indicador é parte de um processo de elaboração de setup! O indicador que está criando pode e deve permitir a elaboração de estratégias que se baseiem em seu valor, bem como regras de coloração…mas estes não são objetivos que devem ser incorporados no código do indicador!

4) Verificar a consistência

Esta é uma etapa de validação que pode representar o fim da elaboração do indicador, ou o início de um novo ciclo de desenvolvimento do indicador.

Nesta etapa temos que verificar se o indicador e os valores calculados fazem sentido e se os valores apresentados nos permitem construir hipóteses para analisar o mercado. Acima de tudo, os valores calculados pelo indicador cumprem o objetivo inicial? É factível a criação de um setup que se baseie no indicador?

Temos que verificar também as situações nas quais o indicador funciona bem e quando ele não funciona tão bem.

Por fim, precisamos definir quais são os parâmetros do indicador, que permitem ajustá-lo a diferentes ativos ou situações de mercado.

Conclusão

Espero que este conteúdo tenha agregado valor a você e que tenham percebido a semelhança com o processo de criação de um robô.

A diferença é que enquanto existe um trabalho de análise de dados, o qual você pode aprofundar-se ao nível desejado para criação do indicador, na criação de um robô o esforço maior concentra-se no backtesting e na otimização para administração de trades e gestão de risco.

Assim como os robôs, as estratégias de indicadores também podem ser otimizadas e avaliadas em backtesting. Iremos abordar estes temas em outros documentos da nossa Base de Conhecimento.

Código fonte do indicador: Neo Volatility Band

				
					// #######################################################################
// #######################################################################
// #######################################################################
// ######                            O                             #######
// ######                        ____|____                         #######
// ######                      _|         |_                       #######
// ######                     (_|  O   O  |_)                      #######
// ######                       |_________|                        #######
// ######                                                          #######
// ###### ____        __        ____________           ________    #######
// ###### | | \       | |       | |_________|         /  ____  \   #######
// ###### | |\ \      | |       | |                  /  /    \  \  #######
// ###### | | \ \     | |       | |____             |  |      |  | #######
// ###### | |  \ \    | |       | |____|            |  |      |  | #######
// ###### | |   \ \   | |       | |____|            |  |      |  | #######
// ###### | |    \ \  | |       | |                 |  |      |  | #######
// ###### | |     \ \ | |       | |_________         \  \____/  /  #######
// ###### |_|      \_\|_|       |_|_________|         \________/   #######
// ######                                                          #######
// ###### _______  __          __   ____  __   ___    __  _______  #######
// ######    |    |  \   /\   |  \ |     |  \ |   \  /  \    |     #######
// ######    |    |__/  /__\  |   ||__   |__/ |___/ |    |   |     #######
// ######    |    |\   /    \ |   ||     |\   |   \ |    |   |     #######
// ######    |    | \ /      \|__/ |____ | \  |___/  \__/    |     #######
// ######                                                          #######
// ######  Comunidade aberta de automatização de estratégias para  #######
// ######                    negociação de ativos                  #######
// ######                                                          #######
// ######                    www.NeoTraderBot.com                  #######
// #######################################################################
// #######################################################################
// #######################################################################
//
// -----------------------------------------------------------------------
// ---------------------- DADOS DA ESTRATÉGIA ----------------------------
// -----------------------------------------------------------------------
//
// NOME DA ESTRATÉGIA: NVI Neo Volatility Indicator
//   DESENVOLVIDA POR: NeoTraderBOt
//    DATA DE CRIAÇÃO: 12/10/2022
//             VERSÃO: 1.0
//      ATUALIZADA EM: 12/10/2022
// TIPO DE ESTRATÉGIA: (X) Indicador  ( ) Coloração ( ) Execução
//                     ( ) Screening  ( ) Texto     ( ) Alarme
//
// DESCRIÇÃO DA ESTRATÉGIA:
//    Indicador baseado em volatilidade utilizando função log-retorno e 
// desvio padrão em torno de uma média de curto prazo
//
//
//
//
//
// -----------------------------------------------------------------------
// -----------------------------------------------------------------------
// -----------------------------------------------------------------------
//
// ######################### FIM DO CABEÇALHO ############################
//
//
// -----------------------------------------------------------------------
// -------------------------- Constantes ---------------------------------
// OBS:
// -----------------------------------------------------------------------
//const
  //cCONSTANTE = 1;
  //
  // ---------------------------------------------------------------------
  // -------------------------- Parâmetros -------------------------------
  // OBS: Segue abaixo a descriação de cada parâmetro
  // 1) parametro1 ->
  // 2) parametro2 ->
  // ---------------------------------------------------------------------
input
  pQtdePeriodosVolatilidade(500);
  pQtdePeriodosMedia(36);
  pQtdeDesvioVol(2.0);
  // ---------------------------------------------------------------------
  // ---------------------- Variáveis globais ----------------------------
  // OBS:
  // ---------------------------------------------------------------------
var
bStarted, 	bPlotIndicador: boolean;
fLogRetorno: float;
fStdDev, fBandaSuperior, fBandaInferior: float;
fMedia: float;

begin
  // ---------------------------------------------------------------------
  // ----------------- Inicialização da estratégia -----------------------
  // OBS: Inicialização de variáveis a serem utilizadas na estratégia de
  // execução
  // ---------------------------------------------------------------------
  if Not bStarted then
  begin
    bStarted := True;
    //Colocar aqui ações que serão executadas apenas no primeiro processamento
    //da estratégia. Por exemplo, inicialização de variáveis.

  end;


  // ---------------------------------------------------------------------
  // ------------ Atribuição de variáveis por processamento --------------
  // ---------------------------------------------------------------------
  if Close[1] = 0 then fLogRetorno := 0 else fLogRetorno := Log(Close/close[1]);
  fMedia := Media(pQtdePeriodosMedia, Close);
  fStdDev := StdDevs(fLogRetorno, pQtdePeriodosVolatilidade);




  // ---------------------------------------------------------------------
  // --------------------- Cálculo do indicador  -------------------------
  // OBS: Inserir lógica de cálculo do indicador e caso ele possa ser plo_
  // tado, atribuir em algum momento True para variável bPlotIndicador
  // ---------------------------------------------------------------------
  bPlotIndicador := true;

  fBandaSuperior := fMedia*ExpValue(pQtdeDesvioVol*fStdDev);
  fBandaInferior := fMedia*ExpValue(-pQtdeDesvioVol*fStdDev);



  //
  // ---------------------------------------------------------------------
  // ------------------ Plota valores do indicador -----------------------
  // OBS: Atribuir na sessão anterior o valor para variavel bPlotIndicador
  // quando for possível plotar um valor para o indicador no instante atual
  // ---------------------------------------------------------------------
  if bPlotIndicador then
    begin
      PlotN(1, fMedia);
      PlotN(2, fBandaSuperior);
      PlotN(3, fBandaInferior);

      setPlotColor(1, clRed);
      setPlotColor(2, clWhite);
      setPlotColor(3, clWhite);
      SetPlotWidth(1,2);
      SetPlotWidth(2,2);
      SetPlotWidth(3,2);

    end;

end;
				
			

Leave a Comment

CONTENTS