Jetzt beitreten
ProBacktest/probacktest · proorder

TIMEFRAME (PB/PO)

TIMEFRAME in ProBacktest und ProOrder führt Strategiecode auf einer anderen Zeiteinheit aus. Syntax, updateonclose vs. Standardmodus und Orderbeispiele über mehrere Zeiteinheiten.

Syntax

probuilder
TIMEFRAME(TF, mode)
probuilder
TIMEFRAME(default)

Parameter

NameTypStandardBeschreibung
TFtimeframe-SchlüsselwortkeineZiel-Zeiteinheit für die folgenden Zeilen, zum Beispiel 1 minute, 15 minutes, 1 hour, 4 hours, daily, weekly. Muss größer oder gleich der Zeiteinheit sein, auf der die Strategie läuft.
modeupdateonclose oder defaultdefaultupdateonclose aktualisiert die Werte des Abschnitts nur, wenn ein TF Bar schließt. default berechnet sie auf jedem Bar der kleinsten Zeiteinheit neu und verwendet dabei den sich bildenden TF Bar.

So funktioniert es

Eine Strategie wird beim Start an eine Basis-Zeiteinheit gebunden, und diese Basis muss die kleinste im Code verwendete Zeiteinheit sein. Jede Zeile nach einem TIMEFRAME(TF, mode) Aufruf wird ausgewertet gegen Bars von TF bis zum nächsten TIMEFRAME-Aufruf. TIMEFRAME(default) wechselt zurück zur Basis-Zeiteinheit, in der üblicherweise der Code für das Ordermanagement steht.

Der mode Argument steuert, wann der Abschnitt mit der höheren Zeiteinheit aktualisiert wird. Mit updateonclose, ändern sich Variablen in diesem Abschnitt nur, wenn der Bar der höheren Zeiteinheit abgeschlossen ist, sodass ein 1-Stunden-RSI seinen Wert die ganze Stunde hält. Mit default, wird der Abschnitt auf jedem Bar der Basiszeiteinheit mit dem aktuellen, noch entstehenden Bar der höheren Zeiteinheit neu berechnet, Werte bewegen sich daher innerhalb des Bars und können vom endgültigen Wert des geschlossenen Bars abweichen.

Variablen behalten ihre Werte über TIMEFRAME-Abschnitte hinweg. Ein Boolean, der in einem 1 hour Block kann gelesen werden im default Block im selben Durchlauf, was das Standardmuster ist: das Signal auf der höheren Zeiteinheit ableiten und auf der feineren danach handeln.

Beispiele

Beispiel 1, Stündliches Signal mit 1-Minuten-Ordermanagement (ProOrder)

probuilder
defparam cumulateorders = false

// Compute the entry signal on the 1-hour timeframe
TIMEFRAME(1 hour, updateonclose)
myrsi = rsi[14]
buycondition = myrsi crosses over 50

// Manage orders on the 1-minute base timeframe
TIMEFRAME(1 minute, default)
if buycondition then
  buy 10 contract at market
endif

if not onmarket then
  breakeven = 0
endif

if longonmarket and close - tradeprice >= 15 * pointsize then
  breakeven = 1
endif

if breakeven = 1 then
  sell at tradeprice + 5 * pointsize stop
endif

graph breakeven

Die RSI-Kreuzung wird einmal pro geschlossenem Stunden-Bar erkannt, während der Ausstiegs-Stop Minute für Minute ausgewertet wird. Dies ist das kanonische Beispiel aus der offiziellen Referenz.

Beispiel 2, Täglicher Trendfilter für Intraday-Einstiege (ProBacktest)

probuilder
// Trend filter computed on closed daily bars
TIMEFRAME(daily, updateonclose)
dailyMA = Average[200](close)
uptrend = close > dailyMA

// Entries and exits on the base timeframe
TIMEFRAME(default)
IF NOT onmarket AND uptrend AND close CROSSES OVER Average[20](close) THEN
  BUY 1 CONTRACT AT MARKET
ENDIF

IF longonmarket AND close CROSSES UNDER Average[20](close) THEN
  SELL AT MARKET
ENDIF

Der 200-Perioden-Tagesdurchschnitt wirkt als Regimefilter. Einstiege lösen nur auf der Basis-Zeiteinheit aus, solange der Tagesschlusskurs darüber liegt.

Beispiel 3, Intrabar-Ablesung eines 4-Stunden-Indikators (ProOrder)

probuilder
// The 4-hour RSI updates on every base-timeframe bar (default mode)
TIMEFRAME(4 hours, default)
h4rsi = RSI[14](close)

// Act on the base timeframe
TIMEFRAME(default)
IF NOT onmarket AND h4rsi < 30 THEN
  BUY 1 CONTRACT AT MARKET
ENDIF

IF longonmarket AND h4rsi > 70 THEN
  SELL AT MARKET
ENDIF

Weil der 4-Stunden-Abschnitt verwendet default Modus spiegelt der RSI den entstehenden 4-Stunden-Bar wider, sodass die Strategie reagieren kann, bevor der Bar schließt.

Häufige Fehler und Stolperfallen

  • Basis-Zeiteinheit nicht die kleinste. Jede TIMEFRAME(TF) Aufruf muss sich auf eine Zeiteinheit beziehen, die größer oder gleich der ist, auf der die Strategie gestartet wird. Eine kleinere Zeiteinheit als die Basis anzufordern wird abgelehnt.
  • Die zwei Bedeutungen von default. Als einziges Argument, TIMEFRAME(default) kehrt zur Basis-Zeiteinheit zurück. Als zweites Argument, default ist ein Aktualisierungsmodus. TIMEFRAME(4 hours, default) und TIMEFRAME(default) machen unterschiedliche Dinge.
  • Intrabar-Werte ändern sich unter default Modus. Eine Bedingung, die mitten in der Bar wahr ist, kann falsch sein, sobald die Bar der höheren Zeiteinheit schließt. Verwenden Sie updateonclose wenn die Logik nur bestätigte Bars sehen soll, und rechnen Sie damit, dass sich die Backtest-Ergebnisse zwischen den beiden Modi unterscheiden.
  • Falsche TIMEFRAME-Variante. ProScreener akzeptiert eine andere Form dieses Befehls. In ProBacktest- oder ProOrder-Code eingefügte Screener-Syntax, oder umgekehrt, kompiliert nicht. Siehe TIMEFRAME (PS).
  • TIMEFRAME (PS), die ProScreener-Variante dieses Befehls.
  • DEFPARAM, Parameter auf Strategieebene wie CumulateOrders.
  • CumulateOrders, steuert, ob sich wiederholte Einstiege zu einer Position aufaddieren.
  • ONMARKET, wahr, solange eine Position offen ist.
  • LONGONMARKET, wahr, solange eine Long-Position offen ist.
  • TRADEPRICE, der Ausführungskurs eines vergangenen Trades.
  • BUY, eröffnet eine Long-Position.
  • SELL, schließt eine Long-Position.