Iscriviti ora
Istruzioni/probuilder · probacktest · proorder · proscreener

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

probuilder
if IsLastBarUpdate then
  // code executed only on the last updated bar
endif

Come 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)

probuilder
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
return

La 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)

probuilder
myLevel = Highest[100](high)
// Draw the resistance line once instead of on every bar
IF IsLastBarUpdate THEN
  DRAWHLINE(myLevel) COLOURED(0, 0, 255)
ENDIF
RETURN

Il 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)

probuilder
// 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
ENDIF

Durante 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.
  • 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.