WEND
WEND markiert in ProBuilder das Ende einer WHILE-Schleife. Wenn die Ausführung WEND erreicht, wird die Schleifenbedingung erneut ausgewertet, um zu entscheiden, ob wiederholt oder beendet wird.
Syntax
WHILE condition DO
// statements repeated while the condition is true
WENDSo funktioniert es
WEND ist kein eigenständiger Befehl. Es existiert nur als Abschluss eines WHILE-Blocks, so wie NEXT einen FOR-Block abschließt und ENDIF einen IF-Block. Alles zwischen der WHILE-Kopfzeile und WEND bildet den Schleifenrumpf.
Wenn die Ausführung WEND erreicht, springt die Steuerung zurück zur WHILE-Zeile und die Bedingung wird erneut geprüft. Ein wahres Ergebnis führt den Rumpf noch einmal aus, ein falsches Ergebnis leitet die Ausführung zur ersten Anweisung nach WEND. Die Bedingung wird daher einmal pro Durchlauf geprüft, immer am Anfang, nie bei WEND selbst, sodass sich eine WHILE-Schleife nicht wie eine do-while-Schleife verhalten kann, die mindestens einen Durchlauf garantiert.
Ein Skript mit einem WHILE ohne passendes WEND lässt sich nicht kompilieren. In verschachtelten Schleifen schließt jedes WEND das nächstgelegene nicht geschlossene WHILE darüber.
Beispiele
Beispiel 1, Eine Zählschleife schließen (Indikator)
i = 0
Count = 0
WHILE i <> 11 DO
// each pass advances the counter by one
i = i + 1
Count = Count + 1
WEND
RETURN CountJedes Mal, wenn die Ausführung WEND erreicht, wird die Bedingung i <> 11 wird erneut geprüft. Nach 11 Durchläufen schlägt die Prüfung fehl, die Schleife endet bei WEND, und der Indikator gibt 11 zurück.
Beispiel 2, Bars seit dem letzten Abwärts-Schlusskurs (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 gibt die Steuerung nach jedem Rückwärtsschritt an die Bedingung zurück. Der Screener listet Instrumente, deren letzte 5 oder mehr Bars alle auf oder über ihrem Eröffnungskurs geschlossen haben.
Beispiel 3, Ein nachgezogenes Niveau schrittweise an den Kurs heranführen (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
ENDIFDie Schleife hebt das Stop-Niveau Schritt für Schritt an. Jeder Durchlauf endet bei WEND, wo die Abstandsprüfung entscheidet, ob ein weiterer Schritt nötig ist.
Häufige Fehler und Stolperfallen
- Fehlendes WEND. Jedes WHILE erfordert genau ein WEND. Der Compiler meldet das Problem oft am Ende des Skripts statt an der nicht geschlossenen Schleife, zählen Sie daher die WHILE- und WEND-Paare, wenn die Fehlerstelle falsch aussieht.
- WEND mit ENDIF oder NEXT verwechseln. Jeder Blocktyp hat seinen eigenen Abschluss. Ein WHILE mit ENDIF oder ein IF mit WEND zu schließen ist ein Syntaxfehler, selbst wenn die Einrückung stimmig aussieht.
- Eine Prüfung am Schleifenende erwarten. Die Bedingung wird in der WHILE-Zeile ausgewertet, nicht bei WEND. Code, der darauf angewiesen ist, dass der Rumpf mindestens einmal ausgeführt wird, muss sicherstellen, dass die Bedingung vor dem Start der Schleife wahr ist.
- Anweisungen nach WEND, die zur Schleife gehören sollten. Nur Zeilen zwischen WHILE und WEND werden wiederholt. Eine versehentlich nach WEND platzierte Anweisung läuft einmal pro Bar statt einmal pro Durchlauf.
Verwandte Befehle
WHILE, eröffnet die Schleife, die WEND schließt.DO, Schlüsselwort, das einen WHILE- oder FOR-Kopf beendet.FOR, zählergesteuerte Schleife, die mit NEXT geschlossen wird.NEXT, das Gegenstück zu WEND bei FOR.BREAK, verlässt eine Schleife, ohne zu warten, bis die Bedingung falsch wird.IF, bedingter Block, der mit ENDIF geschlossen wird.