Jetzt beitreten
Befehle/probuilder · probacktest · proorder · proscreener

IsLastBarUpdate

IsLastBarUpdate in ProBuilder gibt 1 zurück, solange der aktuelle Bar die neueste Aktualisierung ist, sodass Skripte aus Performancegründen aufwendigen Code auf historischen Bars überspringen können.

Syntax

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

So funktioniert es

Ein ProBuilder-Skript läuft einmal pro Bar über die gesamte geladene Historie und danach erneut bei jedem Tick des laufenden Bars. IsLastBarUpdate unterscheidet diese Phasen. Es gibt 1 zurück, wenn der verarbeitete Bar die neueste Aktualisierung ist, in Echtzeit oder der letzte Bar eines geschlossenen Instruments, und 0, während das Skript noch ältere Bars abarbeitet.

In einem Backtest verhält es sich etwas anders: Das Flag gibt ab dem Startdatum des Backtest 1 zurück und 0 nur für die vorgeladene Historie vor diesem Datum. Dadurch können Strategien den Vorbereitungscode über den Warm-up-Daten günstig halten und über den getesteten Zeitraum die vollständige Logik ausführen.

Der Hauptanwendungsfall ist Performance. Schleifen, die hunderte Bars durchlaufen, oder Zeichencode, der große Bereiche neu malt, liefern identische Ergebnisse, ob sie auf jedem historischen Bar oder nur einmal am Ende laufen. Sie hinter IsLastBarUpdate zu stellen, entfernt die redundanten Durchläufe, was die Aktualisierungszeiten von Indikatoren verkürzt und die Last laufender Strategien senkt. Es passt natürlich zusammen mit defparam drawonlastbaronly = true, das dieselbe Idee auf Zeichenausgaben anwendet.

Beispiele

Beispiel 1, Gap-Rechtecke einmalig zeichnen (Indikator)

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

Der Scan über 1000 Bars und das Zeichnen des Rechtecks laufen ein einziges Mal, bei der neuesten Aktualisierung, statt einmal pro historischem Bar. Ohne die Absicherung würde sich dieselbe Arbeit tausende Male für ein identisches Ergebnis wiederholen.

Beispiel 2, Niveaulinie, die nur am Ende gezeichnet wird (Indikator)

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

Das 100-Bar-Hoch wird wie üblich auf jedem Bar berechnet, die horizontale Linie wird aber nur während der letzten Aktualisierung gezeichnet, was den Chart reaktionsschnell hält.

Beispiel 3, Equity-Darstellung ab dem Backtest-Start (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

Während eines Backtests ist IsLastBarUpdate für den getesteten Zeitraum wahr und für die vorgeladenen Warm-up-Bars falsch, sodass die Equity-Kurve nur dort gezeichnet wird, wo Trades tatsächlich auftreten können.

Häufige Fehler und Stolperfallen

  • Zustand sammelt sich nie an. Variablen, die nur innerhalb eines IsLastBarUpdate-Blocks zugewiesen werden, wurden auf historischen Bars nicht aktualisiert. Berechnungen, die auf einer Bar-für-Bar-Akkumulation beruhen, müssen außerhalb der Absicherung bleiben.
  • Die Backtest-Semantik unterscheidet sich. In einem Backtest ist das Flag für jeden Bar ab dem Startdatum 1, nicht nur für den letzten Bar. Code, der davon ausgeht, dass es einmal auslöst, läuft über den gesamten getesteten Bereich.
  • Signale können damit nicht gesteuert werden. Werden Einstiegs- oder Ausstiegsbedingungen in IsLastBarUpdate eingeschlossen, ändert das das Verhalten der Strategie zwischen Backtest und Live-Ausführung. Behalten Sie es für Zeichnen, Logging und Diagnose vor.
  • Wiederholtes Auslösen bei Live-Ticks. Auf einem Live-Chart wird der Block bei jedem Tick des sich bildenden Bars ausgeführt, nicht nur einmal. Zeichencode sollte eine erneute Ausführung tolerieren oder kombiniert werden mit drawonlastbaronly.
  • DEFPARAM, setzt Skriptparameter wie drawonlastbaronly.
  • DrawOnLastBarOnly, beschränkt die Zeichenausgabe auf den letzten Bar.
  • CalculateOnLastBars, begrenzt, wie viele Bars das Skript überhaupt berechnet.
  • BarIndex, Bar-Zähler, der Zeichnungen im letzten Durchlauf verankert.
  • DRAWRECTANGLE, Zeichenbefehl, der häufig in die Absicherung eingeschlossen wird.
  • FOR, Schleifenkonstrukt, dessen historische Wiederholungen die Absicherung beseitigt.
  • ONCE, einmalige Initialisierung, ein ergänzendes Optimierungswerkzeug.
  • RETURN, beendet den Indikator und gibt seine Werte aus.