Criando seu próprio Indicador
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;