Neo traderBot

Neo traderBot

Você sabia?

A NeoTraderBot é a primeira comunidade aberta no Brasil com foco em compartilhar informações sobre automatização de estratégias

Programando Estratégias no Profit

Criando seu próprio Indicador

Leitura estimada: 9 minutos 1105 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