Neo traderBot

Neo traderBot

Você sabia?

Abordamos o tema de automatização de estratégias em NTSL, MQL5 e NinjaScript!

Códigos de exemplo? Tome Snippets!

Snippets para Localização Temporal

Leitura estimada: 5 minutos 3059 views

Introdução

Esta seção visa apresentar trechos de códigos com funcionalidades relativas à localização temporal da estratégia. Por exemplo, identificar se a atual barra é a primeira barra do dia para verificar gap diário.

Você pode acessar os Snippets diretamente pelo menu lateral direito, ou fazendo CTRL+F (CTRL+L) para localizar algum texto específico na página, uma vez que o conteúdo tende a crescer ao longo do tempo, dificultando a navegação pelo menu.

Caso tenham sugestões de código para acrescentar à lista, gentileza deixar o código nos comentários com o link para seu perfil em rede social (para devido crédito de autoria).

Snippets

Identificação do primeiro candle de cada dia

Reproduzir vídeo

Algumas estratégias necessitam da identificação da primeira barra do dia (candle) para executar determinada ação ou calcular o gap em relação ao fechamento do dia anterior.

				
					var
  bPrimeiraBarraDoDia : boolean;
  iDataAtual          : integer;
begin
  if (Date() <> iDataAtual) then
    begin
      iDataAtual := Date();
      bPrimeiraBarraDoDia := true;
    end;
  if bPrimeiraBarraDoDia then
    begin
      bPrimeiraBarraDoDia := false;
      //Faz alguma coisa na primeira barra do dia
      paintBar(clGreen);
    end;
end;
				
			

Identificação de barra por data e hora específicos

Este código localiza a barra (candle ou box) por uma data e hora desejados. Onde a hora é referente ao horário de abertura do candle desejado. Observa-se que existe uma parte do código comentada para utilização em backtesting de gráficos de renko.

OBS: As variáveis pDataDesejada e pHorarioDesejado não foram declaradas como parâmetros para facilitar o teste do Snippet, uma vez que não é possível alterar parâmetro dentro do Editor de Estratégias.

				
					var
  bBarraDesejada                 : boolean;
  pDataDesejada,pHorarioDesejado : integer;
begin
  pDataDesejada := 20220928;
  pHorarioDesejado := 1200;
  if (Date() = ELDate_Consol(pDataDesejada)) And (Time() = pHorarioDesejado) then
    begin
      bBarraDesejada := true;
      //Faz alguma coisa na barra identificada
      paintBar(clGreen);
    end
  else 
    bBarraDesejada := false;
end;
				
			

Identificação do primeiro tick de uma barra

Reproduzir vídeo

Este código identifica o primeiro tick de uma barra. Este Snippet tem aplicação apenas quando a estratégia é utlizada em tempo real.

OBS: É importante ressaltar que em backtesting com dados históricos não há dados tick a tick. Desta forma, este Snippet não possui aplicação em backtesting com dados de barra a barra.

				
					var
  bPrimeiroTickDaBarra : boolean;
  iBarraAtual          : integer;
begin
  if LastBarOnChart then
    if (CurrentBar <> iBarraAtual) then
      begin
        iBarraAtual := CurrentBar;
        bPrimeiroTickDaBarra := true;
      end
  else 
    bPrimeiroTickDaBarra := false;
  if bPrimeiroTickDaBarra then
    begin
      //Faz alguma coisa no primeiro tick da barra
      //Aplicável apenas em execução de tempo real
      paintBar(clGreen);
    end
  else 
    begin
      //Faz alguma coisa nos demais ticks da barra atual
      //Aplicável apenas em execução de tempo real
      paintBar(clYellow);
    end;
end;
				
			

Contador de Candles do dia

Este código realiza a contagem de barras dentro de um mesmo dia.

				
					var
  bPrimeiraBarraDoDia : boolean;
  iDataAtual          : integer;
  iCurrentBarIntraday, iFirstBarOfDay : integer;
begin
  if (Date() <> iDataAtual) then
    begin
      iDataAtual := Date();
      bPrimeiraBarraDoDia := true;
      iFirstBarOfDay := CurrentBar;
    end;
  if bPrimeiraBarraDoDia then
    begin
      bPrimeiraBarraDoDia := false;
      //Faz alguma coisa na primeira barra do dia
      paintBar(clGreen);
    end;

    iCurrentBarIntraday := CurrentBar - iFirstBarOfDay + 1;
    plotText(iCurrentBarIntraday, clWhite,0, 12);

end;
				
			

24 Comments

  • Alfredo

    Outubro 25, 2022

    Parabéns John. Muito claro as explicações para quem esta aprendendo. E agora c/ automação precisaremos muito de um espaço assim para aprofundar conhecimento e aprender o raciocínio logico da programação.
    Mas esclarece uma duvida? No intraday ficou top e tentei usar p tempo gráfico do “diario”, visando referenciar a 1 barra de cada mês e não funcionou, poderia explicar o que teria que mudar no código?
    Grato e saludos!

    Reply
    • Johnathas

      Outubro 26, 2022

      Oi Alfredo! Obrigado, espero que a comunidade seja um bom ponto de referência para quem quer automatizar estratégias, seja no Profit ou outro software.
      Quanto a sua pergunta, a lógica é muito semelhante. A diferença é que você quer saber de uma barra para outra se o mês mudou.
      O código seria conforme abaixo. Daí o resto do seu código você condiciona a variável boolean bPrimeiraBarraDoMes, analogo ao snippet para identificação de primeira barra do dia.

      if (Month(Date()) <> iMesAtual) then
      begin
      iMesAtual := Month(Date());
      bPrimeiraBarraDoMes := true;
      end;

      Qualquer dúvida, posta lá no fórum que outras pessoas também podem se beneficiar das respostas!
      Grande abs e sucesso aí!

      Reply
  • Josué

    Junho 5, 2023

    Mais um excelente vídeo Johnathas. Fico com uma dúvida tenho tentado achar uma lógica pra avaliar se o primeiro candle do dia é positivo ou negativo. Tem alguma material pra indicar?

    Reply
  • Vinicius FLores

    Junho 27, 2023

    Oi Johnathas! por acaso tem alguma forma de selecionar os candles de 1 a 12 e entao projetar um alvo atraves deles? por fibo por exemplo, identificando o topo e o fundo deste range…

    Reply
    • Johnathas

      Julho 3, 2023

      Tem sim, Vinicius. É possível fazer por código. Abs!

      Reply
  • Sos Moto Peças, Acessórios e Vestuários para Motos

    Agosto 4, 2023

    Barbaro! Eu estava procurando por esse código do primeiro tick da barra há muito tempo. Foi só aqui que achei! Valeu! Obrigado pelo ótimo conteúdo!

    Reply
    • Johnathas

      Agosto 5, 2023

      TMJ!

      Reply
  • geisiele

    Agosto 11, 2023

    bom dia como fazer para toda vez que for stop dobrar os contratos no proximo sinal de entrada
    eu estou tentando mais nao ta dando certo
    vc pode mostra como fazer

    Reply
    • Johnathas

      Agosto 23, 2023

      Olá Geisiele! Basta você usar uma ordem do tipo stop com a quantidade dobrada em relação ao tamanho da sua posição.
      A Nelógica atualizou recentemente a NTSL e agora esse tipo de construção permite a reversão de posição. Há cerca de um mês atrás, isso não era possível, pois todas as ordens eram convertidas em “ToCover”.
      Abs!

      Reply
  • Pablo_Macedo

    Agosto 28, 2023

    Bom dia, Johnathas! Parabéns pelo excelente conteúdo. Em breve, pretendo adquirir o curso. Você poderia esclarecer uma dúvida minha? Seria possível configurar uma estratégia para que ela comece a analisar os sinais a partir da leitura da primeira barra do dia?

    Reply
    • Johnathas

      Agosto 31, 2023

      Bom dia Pablo! Obrigado! É possível sim. Basta modificar sua lógica para ignorar a primeira barra do dia. Talvez o snippet de como identificar a primeira barra do dia possa lhe ajudar nessa tarefa.
      Abs!

      Reply
  • Cristiano

    Outubro 5, 2023

    E como ficaria para identificar a variação percentual em relação ao fechamento do dia anterior?
    Por exemplo: If (var%diaanteior>1%) then….

    Reply
    • Johnathas

      Outubro 18, 2023

      Oi Cristiano! Se estiver querendo verificar se houve variação positiva seria:
      var
      varPreco: float;

      varPreco := (Close – CloseD(1))/CloseD(1)*100;
      if (varPreco > 1) then….

      abs!

      Reply
  • Andre Soares

    Outubro 14, 2023

    Olá Johnathas. Sabe dizer se é possível executar uma estratégia em uma base de 15 min, mas obter dados de indicadores de frequencia diária? Por exemplo, só opero no 15 min, por exemplo, se o RSI diário atender a uma condição.

    Reply
    • Johnathas

      Outubro 18, 2023

      Olá André!
      Como não existe uma forma nativa de uma estratégia utilizar múltiplos tempos gráficos, você poderia tentar implementar na mão.
      Em alguns pouquíssimos casos até dá. Mas geralmente isso não é possível de ser feito em NTSL.
      Grande abs!

      Reply
  • Jean Felizardo

    Outubro 14, 2023

    Boa noite Johnathas,

    Duas questões:

    1) Gostaria de saber se tem algum vídeo mostrando como não colorir uma estratégia em determinados horários no RENKO, por exemplo, NAO COLORIR:

    9h as 9h10
    9h45 as 9h53
    15h41 as 16h03

    Tem uns seis períodos de horários que quero bloquear para não colorir. E se possível, incluir INPUTS para editar os períodos de horários conforme o dia.

    2) Gostaria de saber se tem algum vídeo mostrando como colorir somente numa bolsa específica, por exemplo, colorir somente na BMF (DOL ou WDO e IND ou WIN) ou na BOVESPA?

    Agradeço se puder auxiliar de alguma forma.

    Abraço.

    Reply
    • Johnathas

      Outubro 18, 2023

      Olá Jean!

      Cara, sua primeira pergunta é mais difícil de responder. Você vai conseguir fazer isso apenas em gráfico de tempo real, pegando o horário atual: CurrentTime.
      A questão é que o horário de início e fim de um box, dependendo do tamanho que utiliza pode dificultar a lógica a ser utilizada. Se você utilizar a função Time, até conseguirá rodar isso em backtesting, mas imagino que isso não tenha serventia para você.

      Sobre a segunda pergunta, eu desconheço uma forma de buscar o feed do ativo. Geralmente a gente fornece esse feed para as funções da NTSL. Sugiro você fazer filtro pelo nome do ativo. Talvez seja mais simples.

      Abs!

      Reply
  • Maikel Ferreira

    Outubro 15, 2023

    Boa noite, Johnathas!

    Cara, que alívio descobrir seu conteúdo. Tem ajudado muito!

    Então, preciso marcar um range com linhas horizontais marcando a primeira barra. Quero os parâmetros Max, Min, Aber e Fech. Estou usando a função HorizontalLine(), mas não estou conseguindo ancorá-las ao primeiro candle. Quero que fiquem marcadas pela série histórica assim como o ponto Pivot.
    Poderia me dar uma ajuda sobre isso? Muito obrigado!

    Segue exemplo de como estou marcando as linhas:

    HorizontalLine(Abertura,clYellow);
    HorizontalLine(Fechamento, clWhite);
    HorizontalLine(Maxima,clBlue);
    HorizontalLine(Minima,clGreen);

    Reply
    • Johnathas

      Outubro 18, 2023

      Olá Maikel! Obrigado!
      Cara, isso ocorre porque seu código é processado para cada barra, o que atualiza o valor das séries que está utilizando.
      Eu iria lhe sugerir, por simplicidade, usar as funções OpenD(0), CloseD(0), HighD(0) e LowD(0). Passando o parâmetro zero, você irá buscar o OHLC do dia atual.
      Observe que isso irá sobrescrever com as informações do dia atual para todo o passado, pois você está usando uma HorizontalLine. Se quiser plotar isso por dia, utilize o plot comum.
      Abs!

      Reply
  • Leonilson Soares

    Setembro 6, 2024

    Bom dia, Johnathas.
    Ótimo conteúdo. Veja de pode me ajudar, por favor.

    Estou tentando criar um script utilizando o indicador Canal de Regressão Linear de modo que no parâmetro Período, seja inserido o número do candle atual. Já utilizei a função Contador de Candles, mas não funcionou. Agora testei com seu código acima e também não consegui.

    Veja parte do código onde aparece o erro:
    LinearRegressionChannel(ContadorDeCandle,Verdadeiro,0.00,Verdadeiro,0.00)
    LinearRegressionChannel(iCurrentBarIntraday ,Verdadeiro,0.00,Verdadeiro,0.00)

    Ao plotar informa: iCurrentBarIntraday não é uma constante e nem um parâmetro.

    Como posso fazer isso? Você pode me ajudar, por favor?
    Parabéns e muito obrigado!

    Reply
    • Johnathas

      Setembro 18, 2024

      Olá Leonilson!
      Este erro refere-se ao fato de que você não declarou uma variável ou constante chamada iCurrentBarIntraday.
      Eu lhe indicaria fazer o curso de NTSL da NeoTraderBot, pois lhe dará toda a base necessária para que você não gaste muito tempo aprendendo a programação em si…mas consiga focar no desenvolvimento das suas estratégias.
      O curso é repleto de exercícios e gabaritos para que você consiga evoluir de maneira adequada ao seu ritmo. Segue o link abaixo:

      https://neotraderbot.com/curso-automatizacao-de-trading-em-ntsl/

      Abs!

      Reply
  • MiguelDL

    Outubro 13, 2024

    Prezado, ótimo trabalho você tem feito, ajudando a todos, parabéns!!!
    Há uma forma de inicializar variáveis somente uma vez? Quando o código começar a rodar, passa por um bloco de códigos, inicializa ou zera as variáveis e não entra mais neste bloco, seguindo as linhas normalmente.
    Agradeço a ajuda.
    Abs

    Reply
    • Johnathas

      Outubro 14, 2024

      Olá Miguel!
      Sim. Basta você verificar se CurrentBar = 0. Assim você faz a inicialização uma única vez.
      Abs!

      Reply

Leave a Comment

CONTENTS