Pine Script: fecho 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 definiçã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 fecho. 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. Recebe o sinal no fecho 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 fecho da barra, tanto nas barras históricas quanto nas ao vivo. Duas definições mudam isso:
calc_on_every_tick=trueroda 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=trueexecuta as ordens no fecho da barra do sinal. Por padrão elas executam na abertura da barra seguinte. Serve para uma saída baseada no fecho, mas pode embelezar as entradas.
Deixe as duas desligadas até a estratégia funcionar no fecho 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 fecho 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.isconfirmedou o alerta é Once Per Bar Close. - Os valores de timeframe maior usam
[1]comlookahead_on. - A estratégia roda no fecho da barra, com
calc_on_every_tickdesligado. - O Bar Magnifier está ligado quando stops e alvos estão próximos.
- 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 Trading são definidos antes da sessão e ficam fixos o dia inteiro, 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.
Perguntas frequentes
Qual é a diferença entre fecho da barra e intrabarra no Pine Script?
Fecho 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 fecho.
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 fecho de cada barra.
Fontes
- TradingView Pine Script User Manual: modelo de execução, repintura, alertas
- Central de Ajuda do TradingView: Bar Magnifier
Apenas conteúdo educativo. Não é aconselhamento de investimento.