WEND
WEND marca el final de un bucle WHILE en ProBuilder. Cuando la ejecución llega a WEND, la condición del bucle se evalúa de nuevo para decidir si se repite o se sale.
Sintaxis
WHILE condition DO
// statements repeated while the condition is true
WENDCómo funciona
WEND no es una instrucción independiente. Existe solo como terminador de un bloque WHILE, igual que NEXT termina un bloque FOR y ENDIF termina un bloque IF. Todo lo que hay entre la cabecera WHILE y WEND forma el cuerpo del bucle.
Cuando la ejecución llega a WEND, el control salta de vuelta a la línea WHILE y la condición se comprueba de nuevo. Un resultado verdadero ejecuta el cuerpo una vez más, un resultado falso transfiere la ejecución a la primera instrucción después de WEND. Por tanto la condición se comprueba una vez por pasada, siempre al principio, nunca en WEND mismo, de modo que un bucle WHILE no puede comportarse como un bucle do-while que garantiza al menos una pasada.
Un script con un WHILE que no tiene su WEND correspondiente no compila. En bucles anidados, cada WEND cierra el WHILE sin cerrar más cercano por encima de él.
Ejemplos
Ejemplo 1, Cerrar un bucle de conteo (Indicador)
i = 0
Count = 0
WHILE i <> 11 DO
// each pass advances the counter by one
i = i + 1
Count = Count + 1
WEND
RETURN CountCada vez que la ejecución llega a WEND, la condición i <> 11 se vuelve a comprobar. Tras 11 pasadas la prueba falla, el bucle termina en WEND y el indicador devuelve 11.
Ejemplo 2, Bars desde el último cierre a la baja (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 devuelve el control a la condición después de cada paso hacia atrás. El screener lista los instrumentos cuyos últimos 5 bars o más cerraron todos en o por encima de su apertura.
Ejemplo 3, Avanzar por pasos un nivel de trailing hacia el precio (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
ENDIFEl bucle eleva el nivel del stop un paso cada vez. Cada pasada termina en WEND, donde la comprobación de distancia decide si hace falta otro paso.
Errores y trampas habituales
- Falta WEND. Cada WHILE requiere exactamente un WEND. El compilador suele indicar el problema al final del script en lugar de en el bucle sin cerrar, así que cuenta los pares WHILE y WEND cuando la ubicación del error parezca incorrecta.
- Confundir WEND con ENDIF o NEXT. Cada tipo de bloque tiene su propio terminador. Cerrar un WHILE con ENDIF, o un IF con WEND, es un error de sintaxis incluso cuando la indentación parece coherente.
- Esperar una comprobación al final. La condición se evalúa en la línea WHILE, no en WEND. El código que depende de que el cuerpo se ejecute al menos una vez debe asegurarse de que la condición sea verdadera antes de que empiece el bucle.
- Instrucciones después de WEND dentro del bucle previsto. Solo se repiten las líneas entre WHILE y WEND. Una instrucción colocada por error después de WEND se ejecuta una vez por bar en lugar de una vez por pasada.