Pine Script: cierre de barra vs intrabarra, repintado, alertas y calc_on_every_tick
3 min de lectura · Actualizado
Un Pine Script que se ve limpio en el historial puede disparar señales en vivo que luego desaparecen. Casi todos los casos se reducen a una pregunta: ¿el script trabaja sobre la barra cerrada o sobre la barra que aún se está formando?
Esta guía cubre cada ajuste que lo controla y lo que uso yo para las alertas de niveles.
Barras históricas y la barra en tiempo real
En el historial, Pine ejecuta tu script una vez por barra, en su cierre. En la barra en vivo, lo ejecuta de nuevo en cada actualización de precio. Una condición como close > level puede ser verdadera a las 10:01, falsa a las 10:03 y verdadera otra vez a las 10:04. El historial solo conserva la última respuesta. Esa diferencia es lo que los traders llaman repintado.
barstate.isconfirmed
barstate.isconfirmed es verdadero solo en la última actualización de una barra, cuando cierra. Añadirlo a una condición hace que la barra en vivo se comporte como el historial:
crossUp = ta.crossover(close, level) and barstate.isconfirmed
plotshape(crossUp, style=shape.triangleup, location=location.belowbar)
alertcondition(crossUp, "Close above level")
El costo es la velocidad. Recibes la señal al cierre de la barra, una barra completa más tarde en un marco temporal lento.
Frecuencia de la alerta
Al crear una alerta, TradingView te pregunta con qué frecuencia puede dispararse:
- Once Per Bar Close: se dispara solo cuando la barra cierra con la condición cumplida. Coincide con el backtest.
- Once Per Bar: se dispara la primera vez que la condición se cumple dentro de la barra, aunque la barra cierre en sentido contrario.
- Once Per Minute y Only Once: límites de cuántas veces se dispara.
Para las alertas de niveles uso Once Per Bar Close en un gráfico de 1 o 5 minutos. Una mecha que atraviesa un nivel y cierra de vuelta dentro no la activa, lo que elimina la mayoría de las falsas rupturas.
Estrategias: calc_on_every_tick y process_orders_on_close
Por defecto, una estrategia se ejecuta al cierre de la barra tanto en el historial como en las barras en vivo. Dos ajustes cambian eso:
calc_on_every_tick=trueejecuta la estrategia en cada actualización en vivo. El historial no puede hacer esto, así que las operaciones en vivo empiezan a diferir del backtest.process_orders_on_close=trueejecuta las órdenes al cierre de la barra de la señal. Por defecto se ejecutan en la apertura de la barra siguiente. Sirve para una salida basada en el cierre, pero puede favorecer las entradas.
Deja ambos desactivados hasta que la estrategia funcione al cierre de la barra. La guía de indicador vs estrategia cubre el resto de los supuestos del Strategy Tester.
Bar Magnifier
En el historial, una estrategia solo conoce la apertura, el máximo, el mínimo y el cierre de cada barra. Si tu stop y tu objetivo caen dentro de la misma barra, tiene que adivinar cuál se tocó primero. use_bar_magnifier=true usa datos de un marco temporal menor para resolverlo, en los planes de pago de TradingView. Actívalo antes de fiarte de un stop y un objetivo ajustados.
request.security y marcos temporales superiores
Traer un máximo diario a un gráfico de 5 minutos es una fuente común de repintado. En el historial la barra diaria ya está completa, así que el script ve el máximo final desde la primera barra del día. En vivo, el máximo sigue moviéndose. Pide el valor anterior, ya terminado:
prevHigh = request.security(syminfo.tickerid, "D", high[1], lookahead=barmerge.lookahead_on)
El [1] con lookahead_on da el máximo de ayer en cada barra de hoy, tanto en el historial como en vivo.
Una lista de verificación
- Las señales usan
barstate.isconfirmedo la alerta es Once Per Bar Close. - Los valores de marcos temporales superiores usan
[1]conlookahead_on. - La estrategia se ejecuta al cierre de la barra, con
calc_on_every_tickdesactivado. - Bar Magnifier está activado cuando los stops y los objetivos están cerca.
- Comparas una semana de alertas en vivo con el backtest antes de operarla.
Niveles que no se mueven
Los niveles de mis Trade Plans se fijan antes de la sesión y se quedan quietos todo el día, así que un script que los dibuja no tiene nada que repintar. La guía de niveles en Pine Script muestra cómo trazarlos en TradingView.
FAQ
¿Cuál es la diferencia entre el cierre de barra y la intrabarra en Pine Script?
Cierre de barra significa que el script actúa una vez, cuando la barra termina. Intrabarra significa que actúa en cada actualización de precio dentro de la barra, así que una señal puede aparecer y desaparecer antes del cierre.
¿Cómo evito que una alerta de Pine Script se repinte?
Pon la alerta en Once Per Bar Close, o añade barstate.isconfirmed a la condición. Para datos de un marco temporal superior, usa el valor de la barra anterior con lookahead_on.
¿El backtest de una estrategia usa precios intrabarra?
Solo para las ejecuciones dentro de una barra, y solo con Bar Magnifier activado. Las señales en el historial se calculan al cierre de cada barra.
Fuentes
- TradingView Pine Script User Manual: Execution model, Repainting, Alerts
- Centro de ayuda de TradingView: Bar Magnifier
Solo contenido educativo. No es asesoramiento de inversión.