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
TIMEFRAME(TF, mode)TIMEFRAME(default)Parameter
| Name | Typ | Standard | Beschreibung |
|---|---|---|---|
TF | timeframe-Schlüsselwort | keine | Ziel-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. |
mode | updateonclose oder default | default | updateonclose 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)
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 breakevenDie 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)
// 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
ENDIFDer 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)
// 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
ENDIFWeil 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,defaultist ein Aktualisierungsmodus.TIMEFRAME(4 hours, default)undTIMEFRAME(default)machen unterschiedliche Dinge. - Intrabar-Werte ändern sich unter
defaultModus. Eine Bedingung, die mitten in der Bar wahr ist, kann falsch sein, sobald die Bar der höheren Zeiteinheit schließt. Verwenden Sieupdateonclosewenn 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).
Verwandte Befehle
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.