Bli medlem idag
Instruktioner/probuilder · probacktest · proorder · proscreener

ONCE

ONCE i ProBuilder utför en tilldelning endast på den första baren skriptet behandlar, vilket hindrar att initialvärden skrivs över på varje senare bar.

Syntax

probuilder
ONCE variable = expression

Så fungerar det

Ett ProBuilder-skript körs uppifrån och ned på varje bar i diagrammet, och variabler behåller sina värden från en bar till nästa. En enkel tilldelning som counter = 0 nollställer därför variabeln på varje bar. Att inleda raden med ONCE begränsar tilldelningen till enbart den första utvärderingen, så senare barer lämnar variabeln orörd och den kan ackumulera tillstånd genom hela diagrammet.

Uttrycket på höger sida utvärderas med de data som finns tillgängliga på den första baren. Historiken är kort vid den punkten, så funktioner som behöver en tillbakablick, till exempel lowest[10](low), arbeta med de barer som finns när skriptet startar.

Värdet som sätts av ONCE kvarstår till dess att skriptet räknas om från grunden, till exempel efter att koden redigerats, tidsramen ändrats eller plattformen startats om. I handelssystem är ONCE det normala sättet att definiera räknare, flaggor och fasta inställningar som entry- och exitlogiken läser på varje bar.

Exempel

Exempel 1, Följa nya lägsta mot en initial referens (Indikator)

probuilder
// capture the 10-bar low a single time when the script starts
ONCE myFirstLowest = lowest[10](low)
IF low < myFirstLowest OR low < recentLow THEN
  recentLow = low
ELSE
  recentLow = recentLow
ENDIF
RETURN recentLow

myFirstLowest beräknas bara på den första baren och uppdateras aldrig. Indikatorn följer sedan varje ny lägstanivå som sätts efter den inledande referensen.

Exempel 2, Fasta strategikonstanter (ProOrder)

probuilder
DEFPARAM CumulateOrders = false
// define risk settings a single time
ONCE stopPoints = 40
ONCE targetPoints = 80
IF NOT onmarket AND close CROSSES OVER Average[50](close) THEN
  BUY 1 CONTRACT AT MARKET
  SET STOP pLOSS stopPoints
  SET TARGET pPROFIT targetPoints
ENDIF

De två riskkonstanterna tilldelas vid den första utvärderingen och återanvänds på varje bar därefter, vilket håller konfigurationen på en tydlig plats längst upp i strategin.

Exempel 3, Avkastning sedan den första skannade baren (ProScreener)

probuilder
// record the close of the first bar in the scanned history
ONCE startLevel = close
gainPct = (close - startLevel) / startLevel * 100
SCREENER[gainPct > 10] (gainPct AS "Gain %")

startLevel fryser stängningskursen för den tidigast behandlade baren. Varje senare bar jämför den aktuella stängningskursen mot den, och screenern behåller instrument som är upp mer än 10 procent över det skannade fönstret.

Vanliga fel och fallgropar

  • Att förvänta sig en återställning varje session eller dag. ONCE utlöses vid skriptets första utvärdering och aldrig igen förrän en fullständig omräkning sker. Värden som måste återställas dagligen kräver explicit logik, till exempel att jämföra det aktuella datumet mot ett lagrat.
  • Data på första baren är tunn. Uttrycket utvärderas när historiken är som kortast. En lookback-funktion inuti ONCE kan se färre barer än begärt, vilket kan göra initialvärdet icke-representativt. I strategier styr PRELOADBARS hur mycket historik som är tillgänglig före starten.
  • ONCE på en rad som ska köras per bar. Endast verkliga initieringar hör hemma bakom ONCE. Att märka en beräkning som beror på aktuella priser gör den permanent inaktuell efter den första baren.
  • Överflödig självtilldelning i stället för ONCE. Att skriva x = x på varje bar för att bevara ett värde fungerar men döljer avsikten. ONCE x = startValue anger initieringen explicit och undviker oavsiktliga överskrivningar.
  • IF, villkorslogik som typiskt använder tillstånd initierat med ONCE.
  • ELSE, reservgren inuti den villkorslogiken.
  • ENDIF, avslutar ett IF-block.
  • BarIndex, barräknare, användbar för logik som styrs av de första barerna.
  • DEFPARAM, exekveringsinställningar på skriptnivå, också definierade längst upp.
  • RETURN, matar ut det slutliga värdet av en indikator.