IsLastBarUpdate
IsLastBarUpdate en ProBuilder devuelve 1 mientras el bar actual es la actualización más reciente, lo que permite a los scripts omitir código pesado en bars históricos por rendimiento.
Sintaxis
if IsLastBarUpdate then
// code executed only on the last updated bar
endifCómo funciona
Un script de ProBuilder se ejecuta una vez por bar a lo largo de todo el historial cargado, y después de nuevo en cada tick del bar en curso. IsLastBarUpdate distingue esas fases. Devuelve 1 cuando el bar que se está procesando es la última actualización, en tiempo real o el bar final de un instrumento cerrado, y 0 mientras el script sigue recorriendo bars más antiguos.
En un backtest el comportamiento difiere ligeramente: la bandera devuelve 1 desde la fecha de inicio del backtest en adelante y 0 solo para el historial precargado anterior a esa fecha. Esto permite que las estrategias mantengan barato el código de preparación sobre los datos de calentamiento mientras ejecutan la lógica completa a lo largo del periodo probado.
El caso de uso principal es el rendimiento. Los bucles que recorren cientos de bars, o el código de dibujo que repinta regiones grandes, producen resultados idénticos tanto si se ejecutan en cada bar histórico como si lo hacen una sola vez al final. Condicionarlos a IsLastBarUpdate elimina las pasadas redundantes, lo que acorta los tiempos de refresco del indicador y reduce la carga de las estrategias en vivo. Se combina de forma natural con defparam drawonlastbaronly = true, que aplica la misma idea a la salida de dibujo.
Ejemplos
Ejemplo 1, Dibujar rectángulos de gap una sola vez (Indicador)
defparam drawonlastbaronly=true
X = 1000
if IsLastBarUpdate then
// Scan the last 1000 bars for down gaps, only on the final update
for i = 1 to X do
if open[i] < low[i+1] then
drawrectangle(barindex[i+1], close[i+1], barindex, open[i]) coloured(255,0,0,50) bordercolor(255,0,0)
endif
next
endif
returnEl escaneo de 1000 bars y el dibujo del rectángulo se ejecutan una sola vez, en la última actualización, en lugar de una vez por cada bar histórico. Sin la guarda, el mismo trabajo se repetiría miles de veces para un resultado idéntico.
Ejemplo 2, Línea de nivel dibujada solo al final (Indicador)
myLevel = Highest[100](high)
// Draw the resistance line once instead of on every bar
IF IsLastBarUpdate THEN
DRAWHLINE(myLevel) COLOURED(0, 0, 255)
ENDIF
RETURNEl máximo de 100 bars se calcula en cada bar como siempre, pero la línea horizontal solo se dibuja durante la actualización final, manteniendo el gráfico fluido.
Ejemplo 3, Trazado de equity desde el inicio del backtest (ProBacktest)
// The flag is 1 from the backtest start date onward
IF IsLastBarUpdate THEN
GRAPH STRATEGYPROFIT AS "equity"
ENDIF
IF close CROSSES OVER Average[20](close) AND NOT ONMARKET THEN
BUY 1 CONTRACT AT MARKET
ELSIF close CROSSES UNDER Average[20](close) AND LONGONMARKET THEN
SELL AT MARKET
ENDIFDurante un backtest, IsLastBarUpdate es verdadero para el periodo probado y falso para los bars de calentamiento precargados, por lo que la curva de equity se traza solo donde realmente pueden producirse operaciones.
Errores y trampas habituales
- El estado nunca se acumula. Las variables asignadas solo dentro de un bloque IsLastBarUpdate no se han actualizado en los bars históricos. Los cálculos que dependen de la acumulación bar a bar deben quedar fuera de la guarda.
- La semántica en backtest es distinta. En un backtest la bandera vale 1 en cada bar desde la fecha de inicio, no solo en el bar final. El código que supone que se activa una sola vez se ejecutará en todo el rango probado.
- Las señales no pueden condicionarse con él. Envolver condiciones de entrada o salida en IsLastBarUpdate cambia el comportamiento de la estrategia entre el backtest y la ejecución en vivo. Resérvalo para dibujo, registro y diagnóstico.
- Activación repetida en ticks en vivo. En un gráfico en vivo el bloque se ejecuta en cada tick del bar en formación, no una sola vez. El código de dibujo debe tolerar volver a ejecutarse, o combinarse con
drawonlastbaronly.
Instrucciones relacionadas
DEFPARAM, establece parámetros del script como drawonlastbaronly.DrawOnLastBarOnly, restringe la salida de dibujo al último bar.CalculateOnLastBars, limita cuántos bars calcula el script en total.BarIndex, contador de bars utilizado para anclar los dibujos durante la pasada final.DRAWRECTANGLE, primitiva de dibujo que suele envolverse en la guarda.FOR, construcción de bucle cuyas reejecuciones históricas elimina la guarda.ONCE, inicialización única, una herramienta de optimización complementaria.RETURN, finaliza el indicador y devuelve sus valores.