WEND
WEND markerer slutten på en WHILE-løkke i ProBuilder. Når kjøringen når WEND, evalueres løkkebetingelsen på nytt for å avgjøre om den skal gjentas eller avsluttes.
Syntaks
WHILE condition DO
// statements repeated while the condition is true
WENDSlik fungerer det
WEND er ikke en selvstendig instruksjon. Den finnes bare som avslutning på en WHILE-blokk, på samme måte som NEXT avslutter en FOR-blokk og ENDIF avslutter en IF-blokk. Alt mellom WHILE-overskriften og WEND utgjør løkkekroppen.
Når kjøringen når WEND, hopper kontrollen tilbake til WHILE-linjen og betingelsen testes på nytt. Et sant resultat kjører kroppen én gang til, et falskt resultat overfører kjøringen til den første setningen etter WEND. Betingelsen sjekkes derfor én gang per gjennomløp, alltid øverst, aldri ved WEND selv, så en WHILE-løkke kan ikke oppføre seg som en do-while-løkke som garanterer minst ett gjennomløp.
Et skript med en WHILE som ikke har en tilhørende WEND kompilerer ikke. I nøstede løkker avslutter hver WEND den nærmeste uavsluttede WHILE over seg.
Eksempler
Eksempel 1, Avslutning av en telleløkke (Indikator)
i = 0
Count = 0
WHILE i <> 11 DO
// each pass advances the counter by one
i = i + 1
Count = Count + 1
WEND
RETURN CountHver gang kjøringen kommer til WEND, blir betingelsen i <> 11 testes igjen. Etter 11 gjennomløp feiler testen, løkken avsluttes ved WEND, og indikatoren returnerer 11.
Eksempel 2, Barer siden siste lukking ned (ProScreener)
n = 0
// step backward until a bar closed below its open
WHILE close[n] >= open[n] AND n < 50 DO
n = n + 1
WEND
SCREENER[n >= 5] (n AS "Bars since down close")WEND sender kontrollen tilbake til betingelsen etter hvert steg bakover. Screeneren lister instrumenter der de siste 5 eller flere barene alle lukket på eller over åpningen sin.
Eksempel 3, Flytting av et trailing-nivå mot prisen (ProOrder)
DEFPARAM CumulateOrders = false
IF NOT onmarket AND close CROSSES OVER Average[20](close) THEN
BUY 1 CONTRACT AT MARKET
ENDIF
// raise the stop level in fixed steps while it lags the market
step = AverageTrueRange[14](close)
stopLevel = positionprice - 2 * step
WHILE stopLevel + 3 * step < close DO
stopLevel = stopLevel + step
WEND
IF onmarket THEN
SELL AT stopLevel STOP
ENDIFLøkken løfter stoppnivået ett steg om gangen. Hvert gjennomløp ender ved WEND, der avstandssjekken avgjør om et nytt steg er nødvendig.
Vanlige feil og fallgruver
- Manglende WEND. Hver WHILE krever nøyaktig én WEND. Kompilatoren rapporterer ofte problemet på slutten av skriptet i stedet for ved den uavsluttede løkken, så tell par av WHILE og WEND når feilplasseringen ser feil ut.
- Å forveksle WEND med ENDIF eller NEXT. Hver blokktype har sin egen avslutning. Å lukke en WHILE med ENDIF, eller en IF med WEND, er en syntaksfeil selv når innrykket ser konsistent ut.
- Å forvente en test nederst. Betingelsen evalueres på WHILE-linjen, ikke ved WEND. Kode som er avhengig av at kroppen kjører minst én gang, må sørge for at betingelsen er sann før løkken starter.
- Setninger etter WEND inne i den tiltenkte løkken. Bare linjene mellom WHILE og WEND gjentas. En setning som ved en feil plasseres etter WEND, kjører én gang per bar i stedet for én gang per gjennomløp.