WEND
WEND marque la fin d'une boucle WHILE en ProBuilder. Lorsque l'exécution atteint WEND, la condition de la boucle est évaluée à nouveau pour décider de répéter ou de sortir.
Syntaxe
WHILE condition DO
// statements repeated while the condition is true
WENDComment ça marche
WEND n'est pas une instruction indépendante. Il n'existe que comme terminateur d'un bloc WHILE, de la même façon que NEXT termine un bloc FOR et que ENDIF termine un bloc IF. Tout ce qui se trouve entre l'en-tête WHILE et WEND forme le corps de la boucle.
Lorsque l'exécution atteint WEND, le contrôle revient à la ligne WHILE et la condition est testée à nouveau. Un résultat vrai exécute le corps une fois de plus, un résultat faux transfère l'exécution à la première instruction après WEND. La condition est donc vérifiée une fois par passage, toujours en haut, jamais à WEND lui-même, de sorte qu'une boucle WHILE ne peut pas se comporter comme une boucle do-while qui garantit au moins un passage.
Un script contenant un WHILE sans WEND correspondant ne compile pas. Dans les boucles imbriquées, chaque WEND ferme le WHILE non fermé le plus proche au-dessus de lui.
Exemples
Exemple 1, Fermer une boucle de comptage (Indicateur)
i = 0
Count = 0
WHILE i <> 11 DO
// each pass advances the counter by one
i = i + 1
Count = Count + 1
WEND
RETURN CountChaque fois que l'exécution atteint WEND, la condition i <> 11 est testé de nouveau. Après 11 passages, le test échoue, la boucle se termine au WEND, et l'indicateur renvoie 11.
Exemple 2, Bars depuis la dernière clôture en baisse (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 renvoie le contrôle à la condition après chaque pas en arrière. Le screener liste les instruments dont les 5 derniers bars ou plus ont tous clôturé à leur ouverture ou au-dessus.
Exemple 3, Faire progresser un niveau suiveur vers le prix (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
ENDIFLa boucle remonte le niveau de stop d'un pas à la fois. Chaque passage se termine à WEND, où le contrôle de distance décide si un pas supplémentaire est nécessaire.
Erreurs et pièges courants
- WEND manquant. Chaque WHILE exige exactement un WEND. Le compilateur signale souvent le problème à la fin du script plutôt qu'au niveau de la boucle non fermée, comptez donc les paires WHILE et WEND lorsque l'emplacement de l'erreur semble faux.
- Confondre WEND avec ENDIF ou NEXT. Chaque type de bloc a son propre terminateur. Fermer un WHILE avec ENDIF, ou un IF avec WEND, est une erreur de syntaxe même lorsque l'indentation paraît cohérente.
- S'attendre à un test en bas de boucle. La condition est évaluée à la ligne WHILE, pas à WEND. Le code qui compte sur une exécution du corps au moins une fois doit s'assurer que la condition est vraie avant le début de la boucle.
- Instructions après WEND à l'intérieur de la boucle visée. Seules les lignes entre WHILE et WEND se répètent. Une instruction placée par erreur après WEND s'exécute une fois par bar au lieu d'une fois par passage.