WEND
WEND markeert het einde van een WHILE-lus in ProBuilder. Wanneer de uitvoering WEND bereikt, wordt de voorwaarde van de lus opnieuw geëvalueerd om te bepalen of er herhaald of gestopt wordt.
Syntaxis
WHILE condition DO
// statements repeated while the condition is true
WENDHoe het werkt
WEND is geen zelfstandige instructie. Hij bestaat alleen als afsluiter van een WHILE-blok, net zoals NEXT een FOR-blok afsluit en ENDIF een IF-blok. Alles tussen de WHILE-kop en WEND vormt het lichaam van de lus.
Wanneer de uitvoering WEND bereikt, springt de besturing terug naar de WHILE-regel en wordt de voorwaarde opnieuw getest. Een waar resultaat laat het lichaam nog een keer lopen, een onwaar resultaat verplaatst de uitvoering naar het eerste statement na WEND. De voorwaarde wordt dus eenmaal per doorloop gecontroleerd, altijd bovenaan, nooit bij WEND zelf, zodat een WHILE-lus zich niet kan gedragen als een do-while-lus die minstens één doorloop garandeert.
Een script met een WHILE zonder bijbehorende WEND compileert niet. In geneste lussen sluit elke WEND de dichtstbijzijnde niet-afgesloten WHILE erboven.
Voorbeelden
Voorbeeld 1, Een tellende lus afsluiten (Indicator)
i = 0
Count = 0
WHILE i <> 11 DO
// each pass advances the counter by one
i = i + 1
Count = Count + 1
WEND
RETURN CountElke keer dat de uitvoering WEND bereikt, wordt de voorwaarde i <> 11 wordt opnieuw getest. Na 11 doorgangen mislukt de test, eindigt de lus bij WEND en geeft de indicator 11 terug.
Voorbeeld 2, Bars sinds de laatste close omlaag (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 stuurt de besturing na elke stap terug naar de voorwaarde. De screener toont instrumenten waarvan de laatste 5 of meer bars allemaal op of boven hun open zijn gesloten.
Voorbeeld 3, Een trailing niveau stap voor stap naar de prijs brengen (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
ENDIFDe lus tilt het stopniveau stap voor stap op. Elke doorloop eindigt bij WEND, waar de afstandscontrole bepaalt of nog een stap nodig is.
Veelvoorkomende fouten en valkuilen
- WEND ontbreekt. Elke WHILE vereist precies één WEND. De compiler meldt het probleem vaak aan het einde van het script in plaats van bij de niet-afgesloten lus, dus tel de paren WHILE en WEND wanneer de foutlocatie er verkeerd uitziet.
- WEND verwarren met ENDIF of NEXT. Elk bloktype heeft zijn eigen afsluiter. Een WHILE afsluiten met ENDIF, of een IF met WEND, is een syntaxisfout, ook als de indentatie consistent lijkt.
- Een test onderaan verwachten. De voorwaarde wordt op de WHILE-regel geëvalueerd, niet bij WEND. Code die erop rekent dat het blok minstens één keer wordt uitgevoerd, moet zorgen dat de voorwaarde waar is voordat de lus begint.
- Statements na WEND binnen de bedoelde lus. Alleen regels tussen WHILE en WEND worden herhaald. Een statement dat per ongeluk na WEND is geplaatst, loopt eenmaal per bar in plaats van eenmaal per doorloop.
Gerelateerde instructies
WHILE, opent de lus die WEND afsluit.DO, sleutelwoord dat een WHILE- of FOR-header afsluit.FOR, door een teller gestuurde lus die met NEXT wordt afgesloten.NEXT, het FOR-equivalent van WEND.BREAK, verlaat een lus zonder te wachten tot de voorwaarde niet meer geldt.IF, conditioneel blok dat met ENDIF wordt afgesloten.