Guia do investidor para declaração de IR

Já fiz minha declaração, mas revisarei antes de transmitir. A meu ver, não houve mudanças muito significativas – a sequência lógica se mantém. Desde 2017, o software para preenchimento e transmissão é o mesmo. A maior dificuldade, neste ano (2018), está nos campos adicionais para declaração de “bens e direitos“, como o renavam para automóveis, inscrição municipal e registro em cartório para imóveis e CNPJ para ativos financeiros.

Resolvi compartilhar algumas dicas para auxiliar no processo de preenchimento. Não é algo tão complicado quanto parece e evitará que o investidor exponha seu patrimônio (detalhadamente) a contadores.

Vale lembrar que não sou especialista em IR e existem especificidades que variam de acordo com a realidade de cada contribuinte. Como não invisto fora do país (por exemplo), ignoro as opções referentes à moeda estrangeira.

Antes de prosseguir, recomendo a leitura dos seguintes links:
http://www.adctec.com.br/blog/imposto-de-renda-pessoa-fisica-2017
http://idg.receita.fazenda.gov.br/interface/cidadao/irpf/2018/declaracao/preenchimento
http://dinheirama.com/blog/2015/02/27/7-erros-comuns-imposto-de-renda-acoes-como-evita-los/

Link para download do programa:
http://idg.receita.fazenda.gov.br/interface/cidadao/irpf/2018/download

Para saber como funciona a tributação sobre investimentos imobiliários:
http://www.fundoimobiliario.com.br/leis.htm

Guarde todos os documentos por 5 anos (pelo menos) – Em caso de problemas (malha fina), a Receita Federal pode solicitar a apresentação dos comprovantes.

1. Se esta for sua primeira declaração, comece pela “Identificação do contribuinte” em “Fichas de declaração”.

irpf1

Não há mistério algum.

Mas, preste atenção para não cometer erros de digitação no preenchimento de informações que são imutáveis ao longo da vida. Apesar de pouco provável, pequenas inconsistências, como data de nascimento errada, podem fazer com que o contribuinte caia na malha fina. Já presenciei alguns relatos sobre isto.

Se o titular for casado, basta selecionar “sim” em “Possui cônjuge ou companheiro(a)?” e informar o CPF em questão. E, na ficha seguinte (dependentes), se for o caso, é possível cadastrar o(a) cônjuge como dependente (código 11).

2. Em seguida, ainda em “Fichas de Declaração”, identifique sua fonte(s) pagadora(s) em “Rend. Trib. Receb. De Pessoa Jurídica”.

irpf2

Esta ficha é obrigatória para trabalhadores assalariados ou prestadores de serviço.

O processo de preenchimento é simples. Utilize como referência o informe de rendimentos fornecido pela(s) empresa(s) em que trabalha ou prestou serviços. Atenção, nesta etapa é fácil para a Receita detectar qualquer tipo de inconsistência, pois ela cruzará seus dados com os informados pela fonte pagadora. O contribuinte cairá na malha fina caso uma das partes cause divergência de informações.

Diante do cenário econômico atual (de elevado grau de desemprego), muitas pessoas tem se posicionado, no mercado, como “Microempreendedor Individual (MEI)”. Não é o meu caso, mas para esclarecer as dúvidas mais comuns, separei alguns links interessantes:MEI também entrega DIRFcomo fazer a declaração anual do MEI (Sebrae)  e  como o MEI declara o IRPF (2016) .

3. A ficha “Rendimentos Isentos e Não Tributáveis” é muito comum para quem lida com investimentos com rendimento livre de IR (com isenção).

Esta ficha é utilizada para informar rendimentos livre de IR, como Caderneta de Poupança, LCI, LCA, Fundos Imobiliários e dividendos de ações.

Desde o ano passado, o contribuinte não precisa mais identificar o item adequado para cada “tipo de rendimento”. Esta ficha foi separada em duas abas, uma para informar cada rendimento individualmente e outra para informações gerais (totais). A aba padrão (primeira) já permite lançar os rendimentos, basta identificar o código corretamente.

Os códigos mais comuns para lançamento:
09 – Lucros e dividendos recebidos
10 – Parcela isenta de proventos de aposentadoria, reserva remunerada …
12 – Rendimentos de cadernetas de poupança …
18 – Incorporação de reservas ao capital / Bonificações em ações
20 – Ganhos líquidos em operações à vista de ações … até R$ 20.000 …
26 – Outros

A maioria dos bancos fornece o extrato detalhado pelo home-banking.

O cadastro é simples: “informe o código adequado ao tipo de investimento, CNPJ  e nome da “Fonte Pagadora” e o rendimento líquido”. Para isto, utilize como referência os informes de rendimentos enviados pelos Correios.

Vale lembrar que, no mercado de ações, o pagamento de “Juros sobre Capital Próprio” não é isento de IR, portanto é declarado na ficha “Rendimentos Sujeitos à Tributação Exclusiva/ Definitiva”. Mas, é simples. No próprio extrato, para facilitar o preenchimento, os valores já estão separados “por ficha”.

Caso algum extrato indique a existência de “Rendimento não pago”, como foi o caso do fundo XPGA11 (em 2016), o rendimento será cadastrado normalmente, mas será necessário informar o valor líquido, na ficha “Bens e direitos”: código 99 (Outros) e descrição “Créditos em transito” ou “Crédito devido pela pessoa jurídica”, seguido da identificação da fonte pagadora (com CNPJ).

Em 2016 encerrei algumas operações com lucro, sem exceder o limite de isenção (até R$ 20.000 por mês). Neste caso, é preciso informar o valor através do código 20.

O vídeo, a seguir, demonstra claramente o passo a passo da leitura do informe de rendimentos.

Mantive a declaração dos dividendos dos FIIs  sob “código 09” (lucros e dividendos recebidos), mas existem orientações, na Internet, indicando que este registro seja feito sob “código 26” (Outros), com descrição de “Ganhos em Fundos Imobiliários”. Entrei em contato com a ouvidoria da Receita Federal (resposta no link ao lado) para saber qual é o melhor procedimento em relação aos Fundos Imobiliários.

Vale lembrar que, no caso da bonificação em ações, deveremos informar o valor através do “código 18” (algumas corretoras fornecem o valor).

Confiram algumas orientações para declaração de FIIs:
http://abacusliquid.com/irpf/como-declarar-fiis/
http://blog.bussoladoinvestidor.com.br/imposto-de-renda-em-fundos-imobiliarios/
http://blog.bussoladoinvestidor.com.br/amortizacao-de-fundos-imobiliarios-ir/

Outro link interessante:
http://www.blogdoinvestidor.com.br/investimentos/como-declarar-os-fundos-imobiliarios-no-imposto-de-renda/

4. Em “Rendimentos Sujeitos à Tributação Exclusiva/Definitiva”, devemos informar os rendimentos de aplicações que sofrem tributação (incide IR).

Esta ficha é utilizada para informar rendimentos de aplicações financeiras como Fundos DI ou pagamento de JCP, por exemplo. Nela, são declarados os rendimentos que tiveram imposto retido na fonte e não são passíveis de restituição.

A partir de agora o contribuinte não precisa mais identificar o item adequado para cada “tipo de rendimento”. Esta ficha foi separada em duas abas, uma para informar cada rendimento individualmente e outra para informações gerais (totais). A aba padrão (primeira) já permite lançar os rendimentos, basta identificar o código corretamente.

Os códigos mais comuns para lançamento:
06 – Rendimentos de aplicações financeiras
10 – Juros sobre capital próprio
12 – Outros

Não há mistério. O processo é o mesmo descrito na ficha anterior. A diferença é que faremos o cadastro de aplicações que sofrem tributação.

Para declarar rendimentos não pagos o processo é o mesmo descrito em rendimentos isentos.

Confiram a legislação referente à tributação de “Juros sobre Capital Próprio”:
http://contadores.cnt.br/noticias/artigos/2016/05/03/juros-sobre-capital-proprio-2.html
http://artigoscheckpoint.thomsonreuters.com.br/a/5v7w/ponderacoes-sobre-os-juros-sobre-capital-proprio-e-seus-contornos-fiscais-e-juridicos-marcos-ricardo-cruz-da-silva

5. Em “Bens e Direitos”, declare o patrimônio adquirido (ou a “evolução” anual).

irpf5

Nesta ficha cadastre seu patrimônio: casa, carro e investimentos, por exemplo.

Para “imóveis” ou “carro” declare o valor de aquisição, não o valor de mercado. Neste caso, ao longo dos anos, o contribuinte deverá apenas clicar em “repetir”, pois o preço de aquisição não mudará. A casa deve ser cadastrada com “código 12” e o carro com “21”.

Caso o contribuinte não dispunha do bem no ano anterior (na “primeira situação”), o primeiro valor informado será 0 e o segundo será o custo de aquisição (ano de apuração).

Os códigos mais comuns para lançamento:
12 – Casa
21 – Carro

31 – Ações
41 – Poupança
45 – Aplicação em renda fixa ou CDB

61 – Conta corrente
71 – Fundo de curto prazo
72 – Fundo de longo prazo
73 – Fundo de investimento imobiliário
74 – Fundo de ações ou ETF

97 – VGBL

A declaração de “ações” também é baseada no custo de aquisição (até o último dia do ano). Mas, se o investidor adquirir mais ações, a diferentes preços, o custo total será definido pela multiplicação entre o preço médio e o número de ações. Declare, por empresa, através do “código 31”. Na descrição, informe o nome da empresa, código de negociação, corretora (com CNPJ) e número de “papéis”. Foi incluído ao formulário um campo para CNPJ da empresa em questão (seu ativo), mas a identificação da corretora é opcional.

Os fundos de investimentos imobiliários seguem o mesmo padrão, mas com “código 73”. Na descrição, informe o ticker (código de negociação), corretora (com CNPJ) e número de cotas. Da mesma forma como ocorre nas ações, surgirá um campo CNPJ para identificação do fundo em questão.

Caso apareça “valor não pago” em algum informe de rendimento recebido, será necessário lançar o valor em “Bens e Direitos”, com “código 99” (outros) e descrição “CREDITO DEVIDO PELA PESSOA JURIDICA” – no ano passado, foi o caso do fundo XPGA11: “XP INVESTIMENTOS (FII XPGA11), CNPJ 02.332.886/0001.04”.

É possível conferir um passo a passo através dos links:
http://abacusliquid.com/irpf/como-declarar-acoes/
http://abacusliquid.com/irpf/como-declarar-fiis/

O número de operações em bolsa dificilmente será pequeno. Portanto, para evitar erros e desgastes desnecessários, recomendo utilizar alguma ferramenta auxiliar, como o IrpfBolsa ou Calculadora de IR (do site Bússola do Investidor), principalmente se o investidor costuma fazer trades ou negocia cotas de FIIs.

Testei as duas ferramentas citadas acima e farei um breve comentário sobre cada uma.

Antes de tratar das ferramentas, em questão, é interessante compreender como funciona o recolhimento de IR sobre operações em bolsa.

É responsabilidade do investidor o recolhimento de imposto sobre operações em bolsa, com alíquota de 15% sobre os lucros aferidos em operações comuns e 20% em day-trade (operação de compra e venda no mesmo dia). Vale lembrar que, no mercado de ações, há isenção quando o somatório das vendas não exceder “R$ 20.000,00” (no mês), exceto para day-trade.

Não há isenção para negociação de cotas de fundos imobiliários (venda com lucro) ou operações de day-trade.

No caso de lucro, o pagamento deve ser feito com a emissão de uma DARF (código 6015), até o último dia útil do mês subsequente ao da apuração do lucro. É um procedimento válido no decorrer do ano”, sempre que o investidor encerrar sua posição com ganho de capital.

Tanto os lucros como os prejuízos serão declarados (no sistema da Receita), em “Operações comuns / Day-Trade” no menu “Renda Variável”. O prejuízo será compensado futuramente, permitindo abater sobre ganhos posteriores. Esta é outra etapa que a utilização do IRPFBolsa pode ajudar bastante.

Confiram um exemplo completo envolvendo ETFs:
https://verios.com.br/blog/como-declarar-no-ir-seus-investimentos-em-etfs/

É evidente que a emissão da DARF dificilmente acontecerá para adeptos de B&H, pois será raro exceder o limite de isenção (R$ 20.000 em vendas) ou realizar operações de day-trade. Ou seja, acontecerá em menor proporção porque, nesta estratégia, as operações de compra costumam ser mais frequentes e as “posições” não são “fechadas” com frequência.

Acredito que, por mais simples que pareça, é inviável tentar gerenciar todas as operações ou carteira de ações manualmente. No mínimo, o investidor terá que lançar suas operações em uma planilha e definir fórmulas para o cálculo de preço médio, lucro e prejuízo, por exemplo. Pessoalmente, acredito que além de ser muito trabalhoso, amplia a margem de erros.

Com a utilização de ferramentas específicas para o cálculo de IR e gerenciamento de carteira, o investidor contará com inúmeros benefícios: “maior precisão e facilidade para lançar as ações ou cotas em ‘Bens e Direitos’, geração automática da DARF, apuração automática de lucros ou prejuízos e acompanhamento detalhado da evolução de sua carteira de investimentos”.

O IrpfBolsa foi a primeira solução que testei e utilizei para auxiliar no recolhimento de IR e declaração – excelente relação custo x benefício. A licença para dois anos custa R$ 90,00 (pagamento único). Para quem lida com renda variável, e diante dos benefícios, este preço é simbólico. Há uma explicação do objetivo disto no próprio site – achei inteligente.

Na opção “Imposto de Renda”, é possível acompanhar o resultado anual da carteira, bem como a apuração de lucro ou prejuízo a compensar.

O trabalho do investidor se resumirá em alimentar o sistema com as notas de corretagem.

Para preencher a ficha de “Bens e Direitos”, podemos utilizar as informações fornecidas pelo IrpfBolsa, levando em consideração os campos “papel” (código), “quantidade” e “custo total”:

– Através do menuMeus resultados”, selecione a aba “carteira atual” e clique em “exportar” (no canto superior direito). Os dados serão “copiados” em memória e, desde que não existam lançamentos após dezembro (no ano de apuração), basta abrir uma planilha (como o Excel) e aplicar o recurso de edição “colar”.

– Porém, caso existam lançamentos após o ano de apuração, o ideal é fazer o levantamento através da aba “Variação da carteira”, selecionando o ano adequado e percorrendo cada mês de forma decrescente (a partir de DEZEMBRO). Feito isto, declare o primeiro resultado que encontrar para o ativo (será o mais atual).

irpfbolsa

A partir dos dados acima, pude declarar as cotas do fundo SAAG11:

irpfbens

Em “situação”, informe o “custo de aquisição”, não o valor de mercado.

Em 2016, testei, gratuitamente, pelo período de 7 dias, a “Calculadora de IR” do site “Bussola do Investidor”. Gostei. Tecnicamente, não deixou nada a desejar. Mas, em minha opinião, o custo mensal de R$ 49,90 (ou anual de R$ 538,92) da versão PRO, o coloca em desvantagem em relação ao IrpfBolsa.

Indicadores-parte3: Programação de robôs de trade (videoaula)

Na terceira e última parte da programação de indicadores (nos próximos falaremos sobre o EA – Expert Advisor), veremos uma versão evoluída do exemplo anterior (baseado na Média Móvel), incluindo controles de tradenúmero de operações com ganho, número máximo de trades, prejuízo máximo, estimativa de ganho e etc.

A base para escolha de uma posição (comprada ou vendida) é bastante semelhante, mas incluímos algumas opções mais avançadas.

O exemplo demonstrado está disponíveis através da url:
http://aprendizfinanceiro.com.br/indicador-aulas3.zip

Conforme exposto no vídeo, a primeira diferença foi a codificação de um controle de trade (basicamente um controle de risco):

// Controle de risco para novas aberturas de posição - por isto !trade_open ou trade_open==0
if (!trade_open){
   //--- Critérios principais e globais
   // 1. Encerra ao atingir 20 pts
   if (trade_sum>20) close_trades=1;
   // 2. Encerra ao atingir o limite diário de trades
   else if (trade_ct>max_daytrades-1) close_trades=1;
   // 3. Encerra ao atingir o prejuízo diário máximo
   else if (trade_sum<=max_tradeloss) close_trades=1;
   //--- Critérios a partir de 3 pts
   else if (trade_ct>=3) {
      if (trade_ct>fail_trades-1 && gain_ct<1) close_trades=1;
      else if (trade_ct>gain_ct && trade_sum>=5) close_trades=1;
      else if (trade_ct==3 && gain_ct==3) close_trades=1;
   }
}

Em seguida, a base do código está na identificação do momento “ideal” para abertura ou fechamento de posição…

Este controle foi implementado através da variável trade_open. Quando trade_open for 0, verificaremos a possibilidade de abrir uma nova posição. Por outro lado, caso seja 1, avaliaremos as possibilidades de fechar a posição (desviando o processamento para o bloco else).

Também limitamos a capacidade de abrir novas operações através da variável close_trades – ao atribuir o valor 1, encerramos as operações no dia e fechamos qualquer posição em aberto.

//--- Verifica se existe um trade em aberto (trade_open):
// 1. Caso não exista operação em aberto, verifica se a próxima barra está prestes a ser desenha e libera o processamento (isNewBar)
// 2. Caso exista, verifica a possibilidade de fechar a posição (desviará para o bloco "else")
if (!trade_open && !close_trades) { 
    // Código para abertura de posição
    if (isNewBar(time[i], start, LM_OPEN)==true) {
       trade_dir=0;
       bars_trade=0;
       buf_color_line[i]=0;
       ...

       //--- Coloque aqui seu código para abertura de posição

    }
}
else {
    // Código para fechamento de posição
              
    // atualiza buf_color_line pelo último valor de trade_dir
    buf_color_line[i]=trade_dir;
    ...
    if (isNewBar(time[i], start, LM_CLOSE)==true && buf_color_line[i]>0) {
        ...

        //--- Coloque aqui os critérios para fechar a posição

        // 1. Fecha posição depois de 5 barras sem ganho superior a 2 pts
        // 2. Atualiza buf_color_line pelo valor de trade_dir
        if (close_trades) trade_dir=0;
        else if (bars_trade>5 && trade_maxgain<2) trade_dir=0;
        buf_color_line[i]=trade_dir;
        ...
    } // encerramento isNewBar
} // encerramento do bloco else (tenta fechar o trade)

Para facilitar no entendimento, coloquei vários comentários em todo código. Acredito que qualquer ajuste possa ser feito sem grandes dificuldades.

Caso você perceba algum bug ou tenha alguma ideia para acrescentar, por favor entre em contato!

Tenham consciência de que poucos *investidores* sobrevivem aos trades. Vende-se muita ilusão na Internet. Seja qual for a sua escolha, faça consciente!

Indicadores-parte2: Programação de robôs de trade (videoaula)

Nesta segunda parte, da série de vídeos sobre indicadores, optei por tratar sobre a codificação da mudança de cor do candlestick em função da média móvel exponencial.

Conforme exposto anteriormente, meu primeiro contato com a codificação do indicador foi através de um vídeo da DeltaTrader. Mas, a base para manipular as cores do candlestick foi a partir de um projeto gratuito, desenvolvido por Kourosh Davallou:
https://www.mql5.com/pt/code/1349

Confiram a segunda parte:

Os exemplos demonstrados estão disponíveis através da url:
http://aprendizfinanceiro.com.br/indicador-aulas2.zip

Conforme prometido, também disponibilizarei para download o código para implementação da VWAP

A VWAP é a representação do Preço Médio Ponderado por Volume (Volume Weighted Average Price) e costuma ser vista como uma opção para visualizar como os grandes players estão agindo.

Em relação aos trades, a VWAP pode ser utilizada como uma referência de suporte ou resistência. Existem várias observações. É fácil perceber que uma reversão pode acontecer quando o preço toca a VWAP. Porém, caso o preço rompa de forma expressiva (rompendo um suporte ou resistência), o movimento dentro da tendência pode acontecer de forma mais expressiva (ao acionar stops, por exemplo).

Compreendi melhor a formula da VWAP através deste artigo (em inglês):
https://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:vwap_intraday

O bloco de código é basicamente este:

   sumPrice    += (double) (((high[i]+low[i]+close[i])/3) * volume[i]);
   sumVol      += (double) volume[i];
   buf_VWAP[i] = NormalizeDouble(sumPrice/sumVol,2);

A seguir, o link para download:
http://aprendizfinanceiro.com.br/vwap.zip

No momento, é a última versão que tenho utilizado. Caso você tenha alguma sugestão ou faça alterações, por favor nos informe e compartilhe o código!

Gostaria de deixar claro que minha atuação principal permanece como holder. O que estou compartilhando é uma experiência pessoal e, caso bem sucedido, pretendo apenas reforçar os aportes mensais. Não estou muito convicto de que realmente vale a pena.

Tenham consciência de que poucos *investidores* sobrevivem aos trades. Vende-se muita ilusão na Internet. Seja qual for a sua escolha, faça consciente!

Desejo sucesso a todos… infelizmente, sei que serão poucos! 😉

Indicadores-parte1: Programação de robôs de trade (videoaula)

Finalmente, disponibilizei uma demonstração da codificação de um indicador no Metatrader5 (linguagem MQL5). Resolvi dividir, em pelo menos, duas partes. Na primeira, tratei sobre a estrutura básica e a lógica fundamental para criação de um indicador.

No vídeo seguinte, pretendo demonstrar a codificação de um indicador VWAP e, se possível, finalizarei demonstrando como criar um indicador que ajuste as cores do candlestick de acordo com alguns critérios da análise técnica – será referência para nosso EA.

Caso você não tenha experiência com programação, recomendo a leitura do artigo sobre algoritmos:

Vamos a primeira videoaula sobre a codificação do indicador:

Os exemplos demonstrados estão disponíveis através da url:
http://aprendizfinanceiro.com.br/indicador-aulas1.zip

Na explicação da média móvel, estava com pressa para finalizar (antes de minha câmera digital encerrar o vídeo) e não expliquei corretamente o cálculo da média móvel. Mas, resumindo:

1. Somando preço de fechamentos das últimas 20 barras (period): 
   for (int j=0; j<period; j++) media+=close[i-j]; 

Este código faria algo como 
   media=media+close[i-0]; 
   media=media+close[i-1];
... 
   media=media+close[i-period];

2. A média é o valor da soma dividido pelo período:
   media=media/period;

Procurei ser o mais objetivo possível, cobrindo os pontos principais para codificação.

Vi, em outros vídeos, uma demonstração de codificação voltada para “traders” e não, necessariamente, para programadores

Infelizmente, não acredito que isto seja possível.

Quem não abstrair a lógica de programação, fatalmente terá uma capacidade de codificação muito limitada. Desenhar linhas, por si só, não serve para nada. Portanto, não desprezem os aspectos técnicos demonstrados.

Para auxiliar no entendimento, recomendo assistir o seguinte vídeo:

O vídeo anterior foi produzido pela equipe da DeltaTrader e é bastante didático. Aliás, foi por onde me orientei para começar.

Sei que não é tão simples como muitos gostariam, mas sejam pacientes. Ao abstrair a base de codificação, os próximos passos se tornam cada vez mais fáceis.

Então, cada coisa ao seu tempo! 😉

Sucesso para todos!

Programação de Indicadores: Identificando os últimos negócios antes de desenhar a próxima barra!

Aproveitando que tenho compartilhado informações sobre a codificação de robôs no Metatrader5 (ainda em “indicadores“) e algumas dúvidas ou curiosidades estão surgindo, resolvi demonstrar o código que utilizo para identificar os últimos negócios ou nova barra.

A função isNewBar foi definida, inicialmente, para permitir a identificação de uma nova barra – o meu objetivo era abrir os cálculos a cada nova barra.

Parecia simples, bastava comparar “last_time!=lastbar_time” (ou seja, comparar valor atual com o anterior e retornar true quando os valores não forem iguais).

bool isNewBar(const datetime lastbar_time, const int prev_calc) {
   ...
   if (last_time==0 || init_time==0 || last_time!=lastbar_time) {
      last_time=lastbar_time;
      init_time=init_auxtime;
      if (last_time==0) return(false);
      return(true);
   }
   ...
   return(false);
}

O valor de lastbar_time é o horário da barra atual (baseado na abertura, e fornecido pela variável time[i]) – mudará apenas na próxima barra. E last_time é o último horário capturado.

Funciona perfeitamente para a primeira execução do indicador, quando prev_calculated for 0 (com dados históricos). Porém, a lógica não pode ser a mesma quando o indicador estiver analisando os negócios em tempo real.

Suponhamos que você queira trocar a cor do candle quando o preço de abertura for igual ao preço de fechamento (para fechar posição)…

Com os dados históricos (prev_calculated 0), a barra não é processada ticket a ticket. Então, se compararmos open com close assim que a função isNewBar retornar true, teremos a certeza de que open[i] representa o primeiro negócio e close[i] o último (no intervalo de tempo representado pela barra).

Pois é, mas o comportamento não será o mesmo quando prev_calculated for maior que 0 (em tempo real). Neste caso, assim que a próxima barra for desenhada, para o primeiro ticket, teremos open igual a close. Ou seja, a comparação será SEMPRE verdadeira logo que surgir a próxima barra.

Por esta razão, inclui o controle de tempo decorrido (time_match):

   ...
   datetime init_auxtime=TimeCurrent();
   ...
   // 5 minutos
   limit_time=300;
   time_match=(limit_time-(init_auxtime-init_time));
   ...
   if (last_time==0 || init_time==0 || last_time!=lastbar_time) {
      last_time=lastbar_time;
      init_time=init_auxtime;
      if (last_time==0) return(false);
   }

   if (prev_aux==0) return(true);
   else if (time_match<=1) {
      if (time_match<=0) {
         last_time=lastbar_time;
         init_time=init_auxtime;
         return(false);
      }
      return(true);
    }
    ...

Esta é uma das várias pegadinhas deste tipo de programação! 😉

Confiram, logo a seguir, a função completa:

...
int time_punish=0;
...
bool isNewBar(const datetime lastbar_time, const int prev_calc)
  {
//--- memorize the time of opening of the last bar in the static variable
   static datetime last_time=0;
   static datetime init_time=0;
   
   datetime init_auxtime=TimeCurrent();

   int limit_time=0,prev_aux=prev_calc;
   long time_match=0;
   
   limit_time=300;
   time_match=(limit_time-(init_auxtime-init_time));
   if (time_match<0) time_match=0;
   
   string label_name1="Seconds", label_text="Seconds... "+(string) (long)time_match;
   ObjectDelete(0, label_name1);
   ObjectCreate(0, label_name1, OBJ_LABEL, 0, 0, 0);
   //ObjectSetInteger(0,label_name1,OBJPROP_XDISTANCE,960);
   ObjectSetInteger(0,label_name1,OBJPROP_XDISTANCE,ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0)-100);
   ObjectSetInteger(0,label_name1,OBJPROP_YDISTANCE,30);
   ObjectSetInteger(0,label_name1,OBJPROP_COLOR,YellowGreen);
   ObjectSetString(0,label_name1,OBJPROP_TEXT,label_text);
   
//--- if it is the first call of the function or new bar
   if (last_time!=lastbar_time && trade_open>0) bars_trade++;
   if (last_time==0 || init_time==0 || last_time!=lastbar_time) {
      if (init_auxtime>=init_time+limit_time && init_time>0) prev_aux=0;
      time_punish=1;
      last_time=lastbar_time;
      init_time=init_auxtime;
      if (last_time==0) return(false);
   }

//--- allow after 5 minutes - 1s
   if (time_match>2 && time_match<250) time_punish=0;
   if (prev_aux==0) return(true);
   else if (time_match<=1) {
      if (time_match<=0) {
         last_time=lastbar_time;
         init_time=init_auxtime;
         time_punish=1;
         return(false);
      }
      if (time_punish==0) return(true);
   }
   
//--- if we passed to this line, then the bar is not new; return false
   return(false);
  }

"A primeira definição, com a criação de um objeto do tipo LABEL, exibirá o contador decrescente (time_match) dos segundos decorridos (300s ou 5min)"

O código responsável pelos cálculos fica limitado pela função isNewBar:

if (isNewBar(time[i], last)==true) {
   ...
   // codificação para mudança de cor do candlestick
   if (open[i]==close[i]) buf_color_line[i]=0;
   ...
}