Únete hoy
Instrucciones/probuilder · probacktest · proorder · proscreener

WHILE

El bucle WHILE en ProBuilder repite un bloque de código mientras una condición booleana se mantenga verdadera. La condición se comprueba antes de cada pasada, WEND termina el bucle.

Sintaxis

probuilder
WHILE condition DO
  // statements repeated while the condition is true
WEND

Cómo funciona

Antes de cada pasada, ProBuilder evalúa la condición. Si es verdadera, se ejecuta el bloque entre DO y WEND, y luego el control vuelve a la línea WHILE y la condición se comprueba de nuevo. Si es falsa, la ejecución salta más allá de WEND. Como la comprobación se hace primero, una condición que es falsa al entrar significa que el bloque no se ejecuta ninguna vez.

Algo dentro del bucle debe acabar haciendo falsa la condición. A diferencia de FOR, WHILE no tiene contador integrado, por lo que el script es responsable de actualizar aquello de lo que depende la condición. Una condición que nunca puede llegar a ser falsa produce un bucle infinito, que ProRealTime™ aborta con un error de ejecución en lugar de dejar que la plataforma se quede bloqueada.

El bucle completo se ejecuta de nuevo en cada bar del gráfico. WHILE es adecuado para recorridos sin límite fijo, como retroceder por los bars hasta que un patrón se rompe, donde un rango FOR sería o bien un desperdicio o bien desconocido.

Ejemplos

Ejemplo 1, Contar iteraciones (Indicador)

probuilder
i = 0
count = 0
WHILE i <> 11 DO
  // advance the counter until it reaches 11
  i = i + 1
  count = count + 1
WEND
RETURN count

El bucle se ejecuta mientras i difiere de 11. Cada pasada incrementa ambas variables, por lo que el bucle termina tras 11 iteraciones y el indicador devuelve 11.

Ejemplo 2, Medir una racha de cierres al alza (ProScreener)

probuilder
n = 0
// walk backward while each close is above the previous one
WHILE close[n] > close[n + 1] AND n < 100 DO
  n = n + 1
WEND
SCREENER[n >= 3] (n AS "Up streak")

El bucle cuenta los cierres consecutivos al alza y se detiene en la primera bar que rompe la racha. El n < 100 garantiza la terminación incluso en una tendencia inusualmente larga.

Ejemplo 3, Dimensionar una posición dentro de un presupuesto de riesgo (ProOrder)

probuilder
DEFPARAM CumulateOrders = false
maxRisk = 400
size = 1
// double the position size while the risk budget allows it
WHILE (size * 2) * AverageTrueRange[14](close) <= maxRisk DO
  size = size * 2
WEND
IF close CROSSES OVER Average[50](close) AND NOT onmarket THEN
  BUY size CONTRACT AT MARKET
ENDIF

El bucle aumenta el position size geométricamente hasta que otra duplicación superaría el presupuesto de riesgo, y entonces la estrategia opera ese tamaño.

Errores y trampas habituales

  • Bucles infinitos. Si nada dentro del bloque cambia la condición, el bucle nunca termina y ProRealTime™ detiene el script con un error. Añade un límite de seguridad explícito, como un valor máximo de contador, a cualquier condición gobernada por datos de mercado.
  • Cero iteraciones. La condición se evalúa antes de la primera pasada. Cuando es falsa al entrar, el bloque se omite por completo, y cualquier variable asignada solo dentro del bucle conserva su valor anterior.
  • Falta WEND. Cada WHILE necesita un WEND que lo cierre. El error del compilador puede señalar por debajo del bucle real, así que comprueba los pares cuando el mensaje parezca fuera de lugar.
  • Condiciones de salida basadas en igualdad. Una condición como i <> 11 nunca se vuelve falso si i pasa de 11 sin caer en él, por ejemplo al incrementar de 2 en 2. Las comparaciones con < o > son pruebas de salida más seguras que <>.
  • WEND, cierra un bloque WHILE y devuelve el control a la condición.
  • DO, palabra clave que cierra una cabecera WHILE o FOR.
  • FOR, bucle gobernado por un contador para un número conocido de pasadas.
  • NEXT, cierra un bloque FOR.
  • BREAK, sale inmediatamente del bucle actual.
  • IF, ejecución condicional sin repetición.
  • THEN, necesario entre una condición IF y su bloque.
  • ENDIF, cierra un bloque IF.