IsLastBarUpdate
IsLastBarUpdate in ProBuilder geeft 1 zolang de huidige bar de meest recente update is, waardoor scripts zware code op historische bars kunnen overslaan voor betere prestaties.
Syntaxis
if IsLastBarUpdate then
// code executed only on the last updated bar
endifHoe het werkt
Een ProBuilder-script loopt één keer per bar over de volledige geladen historie, en daarna opnieuw op elke tick van de live bar. IsLastBarUpdate onderscheidt die fasen. Hij geeft 1 wanneer de bar die wordt verwerkt de meest recente update is, in real time of de laatste bar van een gesloten instrument, en 0 zolang het script nog oudere bars doorloopt.
In een backtest wijkt het gedrag iets af: de vlag geeft 1 vanaf de startdatum van de backtest en 0 alleen voor de voorgeladen historie vóór die datum. Daardoor kunnen strategieën de voorbereidende code goedkoop houden over de warm-updata en toch de volledige logica uitvoeren over de geteste periode.
Het belangrijkste toepassingsgeval is performance. Loops die honderden bars doorlopen, of tekencode die grote gebieden opnieuw opbouwt, leveren hetzelfde resultaat of ze nu op elke historische bar lopen of één keer aan het eind. Ze achter IsLastBarUpdate zetten haalt de overbodige doorlopen weg, wat de verversingstijd van indicatoren verkort en de belasting van live strategieën verlaagt. Het combineert natuurlijk met defparam drawonlastbaronly = true, die hetzelfde idee toepast op tekenuitvoer.
Voorbeelden
Voorbeeld 1, Gaprechthoeken één keer tekenen (Indicator)
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
returnDe scan over 1000 bars en het tekenen van de rechthoek lopen één enkele keer, op de laatste update, in plaats van één keer per historische bar. Zonder de guard zou hetzelfde werk duizenden keren worden herhaald voor een identiek resultaat.
Voorbeeld 2, Niveaulijn die alleen aan het einde wordt getekend (Indicator)
myLevel = Highest[100](high)
// Draw the resistance line once instead of on every bar
IF IsLastBarUpdate THEN
DRAWHLINE(myLevel) COLOURED(0, 0, 255)
ENDIF
RETURNDe hoogste koers over 100 bars wordt zoals gebruikelijk op elke bar berekend, maar de horizontale lijn wordt alleen tijdens de laatste update getekend, waardoor de grafiek responsief blijft.
Voorbeeld 3, Equity-plot vanaf de start van de 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
ENDIFTijdens een backtest is IsLastBarUpdate waar voor de geteste periode en onwaar voor de voorgeladen warm-upbars, zodat de equity curve alleen wordt getekend waar trades daadwerkelijk kunnen plaatsvinden.
Veelvoorkomende fouten en valkuilen
- Toestand bouwt zich nooit op. Variabelen die alleen binnen een IsLastBarUpdate-blok worden toegekend, zijn op historische bars niet bijgewerkt. Berekeningen die afhangen van opbouw per bar moeten buiten de guard blijven.
- De backtest-semantiek wijkt af. In een backtest is de vlag 1 voor elke bar vanaf de startdatum, niet alleen voor de laatste bar. Code die aanneemt dat hij één keer afgaat, loopt over het hele geteste bereik.
- Signalen kunnen er niet mee worden gestuurd. Het wikkelen van instap- of uitstapvoorwaarden in IsLastBarUpdate verandert het gedrag van de strategie tussen backtest en live uitvoering. Houd het voor tekenen, loggen en diagnostiek.
- Herhaald afgaan op live ticks. Op een live grafiek wordt het blok bij elke tick van de vormende bar uitgevoerd, niet één keer. Tekencode moet ertegen kunnen opnieuw te worden uitgevoerd, of worden gecombineerd met
drawonlastbaronly.
Gerelateerde instructies
DEFPARAM, stelt scriptparameters in zoals drawonlastbaronly.DrawOnLastBarOnly, beperkt de tekenuitvoer tot de laatste bar.CalculateOnLastBars, beperkt hoeveel bars het script überhaupt berekent.BarIndex, barteller die wordt gebruikt om tekeningen tijdens de laatste doorloop te ankeren.DRAWRECTANGLE, tekenprimitief dat vaak in de guard wordt gewikkeld.FOR, lusconstructie waarvan de guard de historische herhalingen elimineert.ONCE, eenmalige initialisatie, een aanvullend optimalisatiemiddel.RETURN, beëindigt de indicator en geeft de waarden uit.