Bli medlem idag
ProBacktest/probacktest · proorder

TIMEFRAME (PB/PO)

TIMEFRAME i ProBacktest och ProOrder kör strategikod på en annan tidsram. Syntax, lägena updateonclose och default, och orderexempel med flera tidsramar.

Syntax

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

Parametrar

NamnTypStandardBeskrivning
TFnyckelordet timeframeingenMåltidsram för de följande raderna, till exempel 1 minute, 15 minutes, 1 hour, 4 hours, daily, weekly. Måste vara större än eller lika med tidsramen som strategin körs på.
modeupdateonclose eller defaultdefaultupdateonclose uppdaterar sektionens värden endast när en TF baren stänger. default räknar om dem på varje bar i den minsta tidsramen, med den pågående TF bar.

Så fungerar det

En strategi kopplas till en bastidsram när den startas, och den basen måste vara den minsta tidsram koden använder. Varje rad efter en TIMEFRAME(TF, mode) anropet utvärderas mot barer av TF fram till nästa TIMEFRAME-anrop. TIMEFRAME(default) växlar tillbaka till bastidsramen, som är där koden för orderhantering vanligtvis ligger.

Den mode argumentet styr när avsnittet med den högre tidsramen uppdateras. Med updateonclose, ändras variabler i den sektionen bara när baren i den högre tidsramen är klar, så ett RSI på 1 timme håller sitt värde hela timmen. Med default, räknas avsnittet om på varje bar i bastidsramen med den aktuella, ännu oavslutade baren i den högre tidsramen, så värdena rör sig inom baren och kan skilja sig från det slutliga värdet för den stängda baren.

Variabler behåller sina värden över TIMEFRAME-sektioner. En boolean som beräknas i en 1 hour blocket kan läsas i default blocket i samma körning, vilket är standardmönstret: härled signalen på den högre tidsramen och agera på den i den finare.

Exempel

Exempel 1, Timsignal med orderhantering på 1 minut (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

RSI-korsningen upptäcks en gång per stängd timbar, medan exitstoppen utvärderas minut för minut. Detta är det kanoniska exemplet från den officiella referensen.

Exempel 2, Trendfilter på dagsbasis för intraday-entries (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

Det 200-periodiga dagsmedelvärdet fungerar som ett regimfilter. Entries utlöses endast på bastidsramen när dagsstängningen ligger över det.

Exempel 3, Intrabar-läsning av en 4-timmarsindikator (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

Eftersom 4-timmarsavsnittet använder default läge återspeglar RSI den pågående 4-timmarsbaren, så strategin kan reagera innan baren stänger.

Vanliga fel och fallgropar

  • Bastidsramen är inte den minsta. Varje TIMEFRAME(TF) anropet måste referera till en tidsram som är större än eller lika med den strategin startas på. Att begära en mindre tidsram än basen avvisas.
  • De två betydelserna av default. Som enda argument, TIMEFRAME(default) återgår till bastidsramen. Som andra argument, default är ett uppdateringsläge. TIMEFRAME(4 hours, default) och TIMEFRAME(default) gör olika saker.
  • Intrabarvärden ändras under default läge. Ett villkor som är sant mitt i en bar kan vara falskt när baren i den högre tidsramen stänger. Använd updateonclose när logiken bara ska se bekräftade barer, och räkna med att backtest-resultaten skiljer sig mellan de två lägena.
  • Fel TIMEFRAME-variant. ProScreener accepterar en annan form av den här instruktionen. Screener-syntax som klistras in i ProBacktest- eller ProOrder-kod, eller omvänt, kompilerar inte. Se TIMEFRAME (PS).
  • TIMEFRAME (PS), ProScreener-varianten av denna instruktion.
  • DEFPARAM, parametrar på strateginivå, till exempel CumulateOrders.
  • CumulateOrders, styr om upprepade entries staplas till en enda position.
  • ONMARKET, sant så länge någon position är öppen.
  • LONGONMARKET, sant så länge en long-position är öppen.
  • TRADEPRICE, exekveringspriset för en tidigare affär.
  • BUY, öppnar en long-position.
  • SELL, stänger en long-position.