Little
Bird Trading

Pine Script: fechamento da barra vs intrabarra, repintura, alertas e calc_on_every_tick

3 min de leitura · Atualizado em

Um Pine Script que parece limpo no histórico pode disparar sinais ao vivo que depois desaparecem. Quase todos os casos se resumem a uma pergunta: o script está trabalhando na barra fechada ou na barra que ainda está se formando?

Este guia cobre cada configuração que controla isso e o que eu uso nos alertas de nível.

Barras históricas e a barra em tempo real

No histórico, o Pine executa o seu script uma vez por barra, no fechamento. Na barra ao vivo, ele executa de novo a cada atualização de preço. Uma condição como close > level pode ser verdadeira às 10:01, falsa às 10:03 e verdadeira de novo às 10:04. O histórico guarda só a última resposta. Essa diferença é o que os traders chamam de repintura.

barstate.isconfirmed

barstate.isconfirmed é verdadeiro só na última atualização de uma barra, quando ela fecha. Adicioná-lo a uma condição faz a barra ao vivo se comportar como o histórico:

crossUp = ta.crossover(close, level) and barstate.isconfirmed
plotshape(crossUp, style=shape.triangleup, location=location.belowbar)
alertcondition(crossUp, "Close above level")

O custo é a velocidade. Você recebe o sinal no fechamento da barra, uma barra inteira depois em um timeframe lento.

Frequência do alerta

Ao criar um alerta, TradingView pergunta com que frequência ele pode disparar:

  • Once Per Bar Close: dispara só quando a barra fecha com a condição verdadeira. Corresponde ao backtest.
  • Once Per Bar: dispara na primeira vez que a condição se torna verdadeira dentro da barra, mesmo que a barra feche no sentido contrário.
  • Once Per Minute e Only Once: limites de quantas vezes ele dispara.

Nos alertas de nível, eu uso Once Per Bar Close em um gráfico de 1 ou 5 minutos. Um pavio que atravessa um nível e fecha de volta para dentro não dispara, o que elimina a maioria dos falsos rompimentos.

Estratégias: calc_on_every_tick e process_orders_on_close

Por padrão, uma estratégia roda no fechamento da barra, tanto nas barras históricas quanto nas ao vivo. Duas configurações mudam isso:

  • calc_on_every_tick=true roda a estratégia a cada atualização ao vivo. O histórico não consegue fazer isso, então as operações ao vivo começam a diferir do backtest.
  • process_orders_on_close=true executa as ordens no fechamento da barra do sinal. Por padrão elas executam na abertura da barra seguinte. Serve para uma saída baseada no fechamento, mas pode embelezar as entradas.

Deixe as duas desligadas até a estratégia funcionar no fechamento da barra. O guia de indicador vs estratégia cobre o resto das premissas do Strategy Tester.

Bar Magnifier

No histórico, uma estratégia só conhece a abertura, a máxima, a mínima e o fechamento de cada barra. Se o seu stop e o seu alvo estão dentro de uma mesma barra, ela precisa adivinhar qual foi atingido primeiro. use_bar_magnifier=true usa dados de timeframe menor para resolver isso, nos planos pagos do TradingView. Ligue antes de confiar em um stop e um alvo apertados.

request.security e timeframes maiores

Puxar a máxima diária para um gráfico de 5 minutos é uma fonte comum de repintura. No histórico, a barra diária já está completa, então o script vê a máxima final desde a primeira barra do dia. Ao vivo, a máxima continua se movendo. Peça o valor anterior, já encerrado:

prevHigh = request.security(syminfo.tickerid, "D", high[1], lookahead=barmerge.lookahead_on)

O [1] com lookahead_on dá a máxima de ontem em todas as barras de hoje, no histórico e ao vivo.

Uma lista de verificação

  • Os sinais usam barstate.isconfirmed ou o alerta é Once Per Bar Close.
  • Os valores de timeframe maior usam [1] com lookahead_on.
  • A estratégia roda no fechamento da barra, com calc_on_every_tick desligado.
  • O Bar Magnifier está ligado quando stops e alvos estão próximos.
  • Você compara uma semana de alertas ao vivo com o backtest antes de operar.

Níveis que não se movem

Os níveis dos meus Planos de Trade são definidos antes da sessão e ficam fixos o dia todo, então um script que os desenha não tem nada para repintar. O guia de níveis em Pine Script mostra como plotá-los em TradingView.

FAQ

Qual é a diferença entre fechamento da barra e intrabarra no Pine Script?

Fechamento da barra significa que o script age uma vez, quando a barra termina. Intrabarra significa que ele age a cada atualização de preço dentro da barra, então um sinal pode aparecer e sumir antes do fechamento.

Como impeço um alerta do Pine Script de repintar?

Configure o alerta como Once Per Bar Close, ou adicione barstate.isconfirmed à condição. Para dados de timeframe maior, use o valor da barra anterior com lookahead_on.

O backtest de uma estratégia usa preços intrabarra?

Só para execuções dentro de uma barra, e só com o Bar Magnifier ligado. Os sinais no histórico são calculados no fechamento de cada barra.

Fontes

  • TradingView Pine Script User Manual: modelo de execução, repintura, alertas
  • Central de Ajuda do TradingView: Bar Magnifier

Conteúdo apenas educacional. Não é aconselhamento de investimento.