IsLastBarUpdate
IsLastBarUpdate in ProBuilder restituisce 1 quando la bar corrente è l'aggiornamento più recente, permettendo agli script di saltare il codice pesante sulle bar storiche per migliorare le prestazioni.
Sintassi
if IsLastBarUpdate then
// code executed only on the last updated bar
endifCome funziona
Uno script ProBuilder viene eseguito una volta per bar su tutta la cronologia caricata, poi di nuovo a ogni tick della bar in corso. IsLastBarUpdate distingue queste fasi. Restituisce 1 quando la bar in elaborazione è l'aggiornamento più recente, in tempo reale o la bar finale di uno strumento chiuso, e 0 mentre lo script sta ancora elaborando le bar più vecchie.
In un backtest il comportamento è leggermente diverso: il flag restituisce 1 dalla data di inizio del backtest in avanti e 0 solo per la cronologia precaricata prima di quella data. Questo permette alle strategie di mantenere leggero il codice di preparazione sui dati di riscaldamento, eseguendo la logica completa su tutto il periodo testato.
Il caso d'uso principale è la performance. I cicli che scansionano centinaia di bar, o il codice di disegno che ridipinge aree estese, producono risultati identici sia che vengano eseguiti su ogni bar storico sia una sola volta alla fine. Condizionarli con IsLastBarUpdate elimina i passaggi ridondanti, il che riduce i tempi di aggiornamento dell'indicatore e il carico delle strategie in esecuzione. Si abbina naturalmente a defparam drawonlastbaronly = true, che applica la stessa idea all'output di disegno.
Esempi
Esempio 1, Disegnare i rettangoli dei gap una sola volta (Indicatore)
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
returnLa scansione a 1000 bar e il disegno del rettangolo vengono eseguiti una sola volta, sull'ultimo aggiornamento, invece di una volta per ogni bar storica. Senza la guardia, lo stesso lavoro si ripeterebbe migliaia di volte per un risultato identico.
Esempio 2, Linea di livello disegnata solo alla fine (Indicatore)
myLevel = Highest[100](high)
// Draw the resistance line once instead of on every bar
IF IsLastBarUpdate THEN
DRAWHLINE(myLevel) COLOURED(0, 0, 255)
ENDIF
RETURNIl massimo a 100 bar viene calcolato a ogni bar come di consueto, ma la linea orizzontale viene disegnata solo durante l'aggiornamento finale, mantenendo il grafico reattivo.
Esempio 3, Tracciato equity dall'inizio 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 è vero per il periodo testato e falso per le bar di riscaldamento precaricate, quindi la curva equity viene tracciata solo dove le operazioni possono effettivamente avvenire.
Errori e insidie comuni
- Lo stato non si accumula mai. Le variabili assegnate solo all'interno di un blocco IsLastBarUpdate non sono state aggiornate sulle bar storiche. I calcoli che dipendono dall'accumulo bar per bar devono restare fuori dalla guardia.
- La semantica nel backtest è diversa. In un backtest il flag è 1 per ogni bar dalla data di inizio, non solo per la bar finale. Il codice che presume che scatti una sola volta verrà eseguito su tutto l'intervallo testato.
- I segnali non possono esservi condizionati. Racchiudere le condizioni di ingresso o di uscita in IsLastBarUpdate cambia il comportamento della strategia tra backtest ed esecuzione in tempo reale. Riservalo a disegno, logging e diagnostica.
- Attivazione ripetuta sui tick in tempo reale. Su un grafico in tempo reale il blocco viene eseguito a ogni tick della bar in formazione, non una volta sola. Il codice di disegno dovrebbe tollerare di essere rieseguito, oppure essere combinato con
drawonlastbaronly.
Istruzioni correlate
DEFPARAM, imposta i parametri dello script come drawonlastbaronly.DrawOnLastBarOnly, limita l'output di disegno alla bar finale.CalculateOnLastBars, limita quante bar lo script calcola complessivamente.BarIndex, contatore di bar usato per ancorare i disegni durante il passaggio finale.DRAWRECTANGLE, primitiva di disegno comunemente racchiusa nella guardia.FOR, costrutto di ciclo le cui riesecuzioni storiche vengono eliminate dalla guardia.ONCE, inizializzazione una sola volta, uno strumento di ottimizzazione complementare.RETURN, termina l'indicatore e ne restituisce i valori.