Um backtesting adequado deve buscar simular situações práticas do mercado (slippage, custo de operação, etc...)
Objetivo do código: Detectar topos e fundos utilizando a mesma lógica do indicador nativo da plataforma Profit Chart que é bloqueado para uso no Módulo de Automação
Motivação: Indicador para compor um conjunto de ferramentas base para que traders possam elaborar estratégias e robôs, bem como ter a opção de utilizar no Módulo de Automação
Observações importantes: O Indicador está disponível GRATUITAMENTE COM CÓDIGO FONTE ABERTO no Profit Char. Este ambiente destina-se a coletar sugestões e aperfeiçoarmos o indicador de maneira colaborativa.
Link Youtube com explicação do indicador.
// ####################################################################### // ####################################################################### // ####################################################################### // ###### 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: _NTB_TopBottomDetector_Breakout // DESENVOLVIDA POR: Johnathas Carvalho // DATA DE CRIAÇÃO: 14/02/2023 // VERSÃO: 1.0 // ATUALIZADA EM: 14/02/2023 // TIPO DE ESTRATÉGIA: (X) Indicador (X) Coloração ( ) Execução // ( ) Screening (X) Texto ( ) Alarme // // DESCRIÇÃO DA ESTRATÉGIA: // Este é um indicador inspirado na lógica do indicador nativo do Profit // Chart para detecção de topos e fundos que se baseia no rompimento da máxima // ou mínima de um candle de referência. // A estratégia possui 3 saídas. Linha 1 apresenta valor diferente de zero // quando há uma confirmação de topo/fundo. Linha 2 é o valor de topo atual // e linha 3 é o valor de fundo atual. // ----------------------------------------------------------------------- // ----------------------------------------------------------------------- // ----------------------------------------------------------------------- // // ######################### FIM DO CABEÇALHO ############################ // // // --------------------------------------------------------------------- // -------------------------- Parâmetros ------------------------------- // OBS: Segue abaixo a descriação de cada parâmetro // 1) pQtdeRompimentos -> Refere-se a quantidade de rompimentos necessários // para confirmar um topo ou fundo. Ex: se o candle de referência de um // possível topo tem o valor de mínima igual a X. Somente após ocorrem pQtdeRompimentos // barras com valor de mínimo menor que X é que o candle de referência será // confirmado como topo. // Como o valor mínimo dos candles subsequentes podem ficar abaixo do último // topo identificado antes dessa condição. O candle de referência também será // confirmado como topo se a condição de rompimento não for atendida e o valor // mínimo do candle atual for menor que o último fundo. // // 2) pAtualizarReferenciaRompimento -> Se true, uma vez rompido o candle de referencia, o novo // valor de máxima ou mínima será atualizado para verificação do próximo rompimento. Caso false, // a referência de rompimento será mantida fixa para avaliação dos rompimentos. // // 3) pModoPlot -> Configura se e como as séries de confirmação, topo e fundo serão plotadas // pModoPlot = 0: Não realiza plots de topo/fundo, apenas confirmação // pModoPlot = 1: Plota o útimo topo/fundo confirmado, bem como topo/fundo em detecção // pModoPlot = 2: Plota apenas o topo/fundo a ser confirmado // // 4) pExibirTextoConfirmacao -> Configura exibição de texto de confirmação de topo/fundo // --------------------------------------------------------------------- input pQtdeRompimentos(2); pAtualizarReferenciaRompimento(false); pModoPlot(1); pExibirTextoConfirmacao(true); // --------------------------------------------------------------------- // ---------------------- Variáveis globais ---------------------------- // --------------------------------------------------------------------- var iIdentUltimaBarraIdentificada : integer; fMaximoAtual,fMinimoAtual : float; fMinimoRefRomp, fMaximoRefRomp: float; iMaximoAtual, iMinimoAtual: integer; fVolatilidadeMedia: float; fTopoFundoConfirmado: float; iContadorRompimentos: integer; begin // --------------------------------------------------------------------- // ------------ Atribuição de variáveis por processamento -------------- // --------------------------------------------------------------------- // Manutenção de valor da variável entre processamentos da estratégia // O comportamento de retenção de valor das variáveis tem sofrido alterações não previsiveis // nas últimas atualizações do Profit fMaximoAtual := fMaximoAtual[1]; fMinimoAtual := fMinimoAtual[1]; fMaximoRefRomp := fMaximoRefRomp[1]; fMinimoRefRomp := fManimoRefRomp[1]; iContadorRompimentos := iContadorRompimentos[1]; fTopoFundoConfirmado := fTopoFundoConfirmado[1]; iIdentUltimaBarraIdentificada := iIdentUltimaBarraIdentificada[1]; // --------------------------------------------------------------------- // --------------------- 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 // --------------------------------------------------------------------- // Inicialização do algoritmo quando tem dados suficientes if CurrentBar = 1 then begin fMaximoAtual := High[1]; fMinimoAtual := Low[1]; fMaximoRefRomp := High[1]; fMinimoRefRomp := Low[1]; iMaximoAtual := CurrentBar; iMinimoAtual := CurrentBar; iIdentUltimaBarraIdentificada := -1*(CurrentBar-1); end else begin iMaximoAtual := iMaximoAtual[1]; iMinimoAtual := iMinimoAtual[1]; end; // Algoritmo inicia execução // Última confirmação do indicador foi um topo // Esse trecho deve tentar identificar um fundo if (iIdentUltimaBarraIdentificada > 0) then begin // Atualiza o valor mínimo atual if Low < fMinimoAtual then begin fMinimoAtual := Low; iMinimoAtual := CurrentBar; fMaximoRefRomp := High; iContadorRompimentos := 0; end; if pAtualizarReferenciaRompimento then begin if High > fMaximoRefRomp then begin fMaximoRefRomp := High; iContadorRompimentos := iContadorRompimentos + 1; end; end else if High > High[CurrentBar-iMinimoAtual] then iContadorRompimentos := iContadorRompimentos + 1; // Verifica se houve pQtdeRompimentos do valor máximo da barra de referencia // A barra de referência é aquela com o menor valor mínimo até o momento if (iContadorRompimentos = pQtdeRompimentos) // Ou volatilidade da barra excedeu o range anterior entre topos e fundos or (High > fMaximoAtual) then begin // Plota o fundo identificado, atualiza o índice da barra de fundo com valor negativo (economia de memória) // e estabelece um valor inicial para o máximo atual fTopoFundoConfirmado := fMinimoAtual; plot(fTopoFundoConfirmado); iIdentUltimaBarraIdentificada := -1*CurrentBar; fMaximoAtual := High; iMaximoAtual := CurrentBar; fMinimoRefRomp := Low; //PaintBar(clGreen); if pExibirTextoConfirmacao then PlotText(fTopoFundoConfirmado,clGreen,-1,9); iContadorRompimentos := 0; end; end // Última confirmação do indicador foi um fundo // Esse trecho deve tentar identificar um topo else begin // Atualiza o valor máximo atual if High > fMaximoAtual then begin fMaximoAtual := High; iMaximoAtual := CurrentBar; fMinimoRefRomp := Low; iContadorRompimentos := 0; end; if pAtualizarReferenciaRompimento then begin if Low < fMinimoRefRomp then begin fMinimoRefRomp := Low; iContadorRompimentos := iContadorRompimentos + 1; end; end else if Low < Low[CurrentBar-iMaximoAtual] then iContadorRompimentos := iContadorRompimentos + 1; // Verifica se houve pQtdeRompimentos do valor máximo da barra de referencia // A barra de referência é aquela com o menor valor mínimo até o momento if (iContadorRompimentos = pQtdeRompimentos) // Ou volatilidade da barra excedeu o range anterior entre topos e fundos or (Low < fMinimoAtual) then begin // Plota o topo identificado, atualiza o índice da barra de topo com valor positivo (economia de memória) // e estabelece um valor inicial para o mínimo atual fTopoFundoConfirmado := fMaximoAtual; plot(fTopoFundoConfirmado); iIdentUltimaBarraIdentificada := CurrentBar; fMinimoAtual := Low; iMinimoAtual := CurrentBar; fMaximoRefRomp := High; //PaintBar(clRed); if pExibirTextoConfirmacao then PlotText(fTopoFundoConfirmado,clRed,-1,9); iContadorRompimentos := 0; end; end; // // --------------------------------------------------------------------- // ------------------ Plota valores do indicador ----------------------- // OBS: A série de confirmação de topo/fundo (1) é plotada na lógica do indicador. // Abaixo são plotadas as séries de valor máximo e mínimo atual, séries 2 e 3, respectivamente. // --------------------------------------------------------------------- plot2(fMaximoAtual); plot3(fMinimoAtual); // Configura estilo dos plots SetPlotWidth(1,2); SetPlotWidth(2,2); SetPlotWidth(3,2); SetPlotColor(2,clRed); SetPlotColor(3,clGreen); SetPlotStyle(2,psDash); SetPlotStyle(3,psDash); //Modo de uso para chamada em NTSL a partir de outras estratégias //Não plota nenhuma série no gráfico if pModoPlot = 0 then begin NoPlot(2); NoPlot(3); end; //Plota topo/fundo confirmado e em detecção if pModoPlot = 1 then NoPlot(1); //Plota apenas o topo/fundo que está em detecção no momento, não plota confirmação if pModoPlot = 2 then begin NoPlot(1); //Buscando confirmação de fundo if iIdentUltimaBarraIdentificada > 0 then NoPlot(2) else NoPlot(3); end; end;
Boa noite Jhon.
Cara, esse indicador seu ficou muito top. Parabéns mesmo!
Eu criei algumas regras de execução em cima do seu código fonte (na versão onde você insere o indicador sem ter o código inteiro escrito _NTB_TopBottomDetector_Breakout), conforme você explicou em vídeo. Porém não estou conseguindo escrever no Profit a mensagem para executar caso seja rompido o topo ou o fundo.
Eu estou tentando da seguinte forma:
fTopoFundo_NeoTraderBot := _NTB_TopBottomDetector_Breakout(1,false,0,false)|1|;
if fTopoFundo_NeotraderBot <> 0
then fLinhaTopoFundo_NeoTraderBot := fTopoFundo_NeoTraderBot
else fLinhaTopoFundo_NeoTraderBot := fLinhaTopoFundo_NeoTraderBot[1];
plotN(1,flinhaTopoFundo_NeoTraderBot);
SetPlotColor(1,clred);
SetPlotWidth(1,1);
/// SINAL DE COMPRA E VENDA ///
bSinalCompra := (Fechamento[1] < fTopoFundo_NeoTraderBot) e (Fechamento > fTopoFundo_NeoTraderBot);
bSinalVenda := (Fechamento[1] > fTopoFundo_NeoTraderBot) e (Fechamento < fTopoFundo_NeoTraderBot);
Está correto fazer a relação de topo e fundo (que eu quero que seja rompido) com a variável "fTopoFundo_NeoTraderBot"? Eu não consigo colocar essa estratégia para executar.
Desde já agradeço muito pelo conteúdo!
Boa noite @estevao-cruz-da-mott!
Tinha uma linha errada no código (que está lá só para contornar um bug do profit), não sei se isso pode ter impactado ou se a Nelogica já corrigiu o bug. Caso tenha copiado a estratégia daqui, sugiro atualizar.
Sim. É correto assumir que a variável fTopoFundo_NeoTraderBot terá um topo ou fundo SE o valor for diferente de zero. Você esqueceu de fazer essa verificação para suas ordens.
Grande abs!
Boa Noite Jhon,
Mais uma vez parabéns pelo conteúdo !
Eu desenvolvi uma estratégia em cima do código fonte do seu indicador. Eu percebi algumas falhas quando executado no simulador ou em conta real. Algumas vezes o Topo e Fundo não é atualizado como se espera.
Estou anexando um print quando eu rodei o robô no simulador e comparei com a estratégia inserida no gráfico parado. Percebi que os topos e fundos muitas vezes não é atualizado.
Saberia me dizer se no seu caso também acontece isso? Trata-se do bug da Nelógica?
Boa tarde a todos, primeiramente parabéns pelo indicador! Tentei rodar ele dentro da minha estratégia, utilizando tbem o conceito do Estevão, de buscar o rompimento do ultimo topo/fundo, mas ela não executa e nem plota os sinais de entrada e saída. Alguem pode me auxiliar? Desde já agradeço,
Boa noite @estevao-cruz-da-mott!
Desculpe o atraso na resposta...mas acho que é um bug da Nelogica!
Tem sido frequente atualizações de versão beta que atrapalham o funcionamento de indicadores programados em NTSL pelo usuários (diferente dos indicadores nativos compilados junto com a plataforma).
Abs!
Boa noite, @gustavo-mascarenhas!
Obrigado! Cara, olhe neste vídeo no minuto 34:00 como utilizar o indicador de topos e fundos. É um indicador e, portanto, você precisa incorporá-lo a sua estratégia de execução.
Vou aproveitar para lhe recomendar o Curso de Automatização de Trading em NTSL. Nesse curso, a ideia é que você aprenda a desenvolver suas próprias estratégias em NTSL, mesmo que não tenha conhecimento prévio em programação. Acho que vale a pena conferir e avaliar essa possibilidade de investimento.
Abs!
Bom dia, por favor, se fTopoFundo_NeoTraderBot <> 0, é quando foi identificado topo e fundo, como eu consigo marcar o ultimo topo e ultimo fundo?
Não consegui encontrar. Quero deixar marcado o ultimo topo e fundo , como posso fazer isso?
O codigo da nelógica consigo se (tf<> 0) e( tf= Maxima) entao topo := tf Senao topo := topo [1] aqui encontrei o ultimo topo
Postado por: @adminBoa noite, @gustavo-mascarenhas!
Obrigado! Cara, olhe neste vídeo no minuto 34:00 como utilizar o indicador de topos e fundos. É um indicador e, portanto, você precisa incorporá-lo a sua estratégia de execução.
Vou aproveitar para lhe recomendar o Curso de Automatização de Trading em NTSL. Nesse curso, a ideia é que você aprenda a desenvolver suas próprias estratégias em NTSL, mesmo que não tenha conhecimento prévio em programação. Acho que vale a pena conferir e avaliar essa possibilidade de investimento.
Abs!
Bom dia, por favor, se fTopoFundo_NeoTraderBot <> 0, é quando foi identificado topo e fundo, como eu consigo marcar o ultimo topo e ultimo fundo?
Não consegui encontrar. Quero deixar marcado o ultimo topo e fundo , como posso fazer isso?
O codigo da nelógica consigo se (tf<> 0) e( tf= Maxima) entao topo := tf Senao topo := topo [1] aqui encontrei o ultimo topo
Como eu posso fazer que o Plot não seja atrasado? Atualmente no indicador ele plota 3 candles a frente, eu queria o plot como o tradicional apenas para fazer alguns indicadores.