Rejoignez-nous
Instructions/probuilder · probacktest · proorder · proscreener

IsLastBarUpdate

IsLastBarUpdate dans ProBuilder retourne 1 tant que le bar courant est la mise à jour la plus récente, ce qui permet aux scripts d'éviter du code lourd sur les bars historiques pour gagner en performance.

Syntaxe

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

Comment ça marche

Un script ProBuilder s'exécute une fois par bar sur tout l'historique chargé, puis de nouveau à chaque tick du bar en cours. IsLastBarUpdate distingue ces phases. Il retourne 1 lorsque le bar traité est la dernière mise à jour, en temps réel ou le dernier bar d'un instrument clôturé, et 0 tant que le script parcourt encore les bars plus anciens.

Dans un backtest, le comportement diffère légèrement : le drapeau retourne 1 à partir de la date de début du backtest et 0 uniquement pour l'historique préchargé avant cette date. Cela permet aux stratégies de garder un code de préparation peu coûteux sur les données de préchauffage tout en exécutant la logique complète sur la période testée.

Le cas d'usage principal est la performance. Les boucles qui parcourent des centaines de bars, ou le code de dessin qui repeint de larges zones, produisent un résultat identique qu'ils tournent sur chaque bar historique ou une seule fois à la fin. Les conditionner à IsLastBarUpdate supprime les passages redondants, ce qui raccourcit les temps de rafraîchissement des indicateurs et réduit la charge des stratégies en direct. L'instruction se combine naturellement avec defparam drawonlastbaronly = true, qui applique la même idée à la sortie de dessin.

Exemples

Exemple 1, Dessiner les rectangles de gap une seule fois (Indicateur)

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

Le balayage sur 1000 bars et le dessin du rectangle s'exécutent une seule fois, lors de la dernière mise à jour, au lieu d'une fois par bar historique. Sans la garde, le même travail se répéterait des milliers de fois pour un résultat identique.

Exemple 2, Ligne de niveau dessinée uniquement à la fin (Indicateur)

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

Le plus haut sur 100 bars est calculé à chaque bar comme d'habitude, mais la ligne horizontale n'est dessinée que lors de la mise à jour finale, ce qui garde le graphique réactif.

Exemple 3, Tracé d'equity depuis le début du 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

Pendant un backtest, IsLastBarUpdate est vrai pour la période testée et faux pour les bars de préchauffage préchargés, de sorte que la courbe d'equity n'est tracée que là où des trades peuvent réellement avoir lieu.

Erreurs et pièges courants

  • L'état ne s'accumule jamais. Les variables affectées uniquement à l'intérieur d'un bloc IsLastBarUpdate n'ont pas été mises à jour sur les bars historiques. Les calculs qui dépendent d'une accumulation bar par bar doivent rester en dehors de la garde.
  • La sémantique en backtest diffère. Dans un backtest, le drapeau vaut 1 pour chaque bar à partir de la date de début, pas seulement pour le dernier bar. Un code qui suppose qu'il se déclenche une seule fois s'exécutera sur toute la plage testée.
  • Les signaux ne peuvent pas être conditionnés par lui. Encapsuler des conditions d'entrée ou de sortie dans IsLastBarUpdate modifie le comportement de la stratégie entre le backtest et l'exécution en direct. Réservez-le au dessin, à la journalisation et aux diagnostics.
  • Déclenchements répétés sur les ticks en direct. Sur un graphique en direct, le bloc s'exécute à chaque tick du bar en formation, pas une seule fois. Le code de dessin doit tolérer d'être réexécuté, ou être combiné avec drawonlastbaronly.
  • DEFPARAM, définit les paramètres du script tels que drawonlastbaronly.
  • DrawOnLastBarOnly, restreint la sortie graphique au dernier bar.
  • CalculateOnLastBars, limite le nombre de bars que le script calcule.
  • BarIndex, compteur de bars utilisé pour ancrer les dessins lors du passage final.
  • DRAWRECTANGLE, primitive de dessin couramment encapsulée dans la garde.
  • FOR, construction de boucle dont la garde élimine les ré-exécutions historiques.
  • ONCE, initialisation unique, un outil d'optimisation complémentaire.
  • RETURN, termine l'indicateur et retourne ses valeurs.