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
ONCE variable = expressionSå 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)
// 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 recentLowmyFirstLowest 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)
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
ENDIFDe 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)
// 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 = xpå varje bar för att bevara ett värde fungerar men döljer avsikten.ONCE x = startValueanger initieringen explicit och undviker oavsiktliga överskrivningar.
Relaterade instruktioner
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.