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

BREAK

BREAK sale inmediatamente de un bucle FOR o WHILE en ProBuilder. Úsalo para dejar de iterar cuando se cumple una condición y omitir las pasadas restantes del bucle.

Sintaxis

probuilder
BREAK

Cómo funciona

Cuando la ejecución llega a una instrucción BREAK dentro de un bucle, el bucle termina de inmediato. No se ejecuta ninguna iteración más, se omite el resto de la iteración actual, y el control continúa en la primera instrucción después de la palabra clave de cierre del bucle, NEXT para un bucle FOR o WEND para un bucle WHILE.

BREAK casi siempre va envuelto en un bloque IF, ya que un BREAK incondicional haría que el cuerpo del bucle se ejecutara como máximo una vez. El patrón es: iterar, comprobar una condición de parada y salir antes de tiempo cuando continuar no tendría sentido. Esto importa para el rendimiento en scripts que escanean hacia atrás sobre muchas bars, porque el escaneo puede detenerse en la primera bar que responde a la pregunta en lugar de recorrer siempre todo el rango.

Con bucles anidados, BREAK solo sale del bucle más interno que lo contiene. Abandonar también un bucle exterior requiere una variable bandera que el bucle exterior compruebe, o una reestructuración de la lógica.

BREAK solo tiene sentido dentro de bucles FOR y WHILE. Colocarlo en cualquier otro lugar, por ejemplo directamente dentro de un bloque IF suelto en el nivel superior de un script, es un error de compilación.

Ejemplos

Ejemplo 1, Contar una racha de bars bajistas (Indicador)

probuilder
Value = 0
FOR i = 1 TO 20 DO
  IF (Close[i] < Open[i]) THEN
    Value = Value + 1
  ELSE
    BREAK // stop at the first bar that is not a down bar
  ENDIF
NEXT
RETURN Value

El bucle cuenta las bars consecutivas que cerraron por debajo de su apertura, escaneando hasta 20 bars hacia atrás. La primera bar que no cumple la prueba activa BREAK, por lo que el recuento refleja una racha ininterrumpida y no un total.

Ejemplo 2, Encontrar el swing high más reciente (ProOrder)

probuilder
DEFPARAM CumulateOrders = false

swingHigh = 0
FOR i = 2 TO 100 DO
  // A local swing high: higher than its two neighbours
  IF high[i] > high[i + 1] AND high[i] > high[i - 1] THEN
    swingHigh = high[i]
    BREAK // nearest swing found, no need to scan older bars
  ENDIF
NEXT

// Enter long on a break of that level
IF swingHigh > 0 AND close CROSSES OVER swingHigh THEN
  BUY 1 CONTRACT AT MARKET
ENDIF

SET STOP %LOSS 2

El escaneo hacia atrás se detiene en el primer swing high que cumple la condición. Sin BREAK, el bucle continuaría y sobrescribiría el resultado con swings más antiguos y menos relevantes.

Ejemplo 3, Limitar una búsqueda con WHILE (ProScreener)

probuilder
// Walk back until a bar with double the average volume is found
avgVol = Average[20](volume)
i = 1
found = 0
WHILE i <= 50 DO
  IF volume[i] > 2 * avgVol THEN
    found = i
    BREAK // record the distance and stop searching
  ENDIF
  i = i + 1
WEND

// Keep instruments with a volume spike in the last 10 bars
SCREENER[found > 0 AND found <= 10] (found AS "Bars since spike")

El bucle WHILE busca hasta 50 bars hacia atrás un pico de volumen, y BREAK termina la búsqueda en cuanto se encuentra uno.

Errores y trampas habituales

  • Solo válido dentro de bucles. BREAK fuera del cuerpo de un FOR o WHILE no compila. No se puede usar para omitir el resto del cálculo de una bar; en su lugar, reestructura con bloques IF.
  • Solo sale el bucle más interno. En bucles anidados, BREAK abandona el bucle que lo rodea inmediatamente. Salir de varios niveles requiere una bandera comprobada por el bucle exterior.
  • Estado después del bucle. Las variables conservan los valores que tenían cuando se activó BREAK, y el contador del FOR no alcanza su valor final. No asumas que el contador es igual al límite del bucle después de una salida anticipada.
  • Coste de legibilidad. Varias instrucciones BREAK repartidas por un mismo bucle dificultan seguir el flujo de control. Es preferible una única condición de salida claramente comentada.
  • FOR, bucle contado del que BREAK puede salir antes de tiempo.
  • WHILE, bucle condicional del que BREAK puede salir antes de tiempo.
  • DO, palabra clave opcional que abre el cuerpo de un bucle.
  • NEXT, cierra un bucle FOR; la ejecución se reanuda después de él tras un BREAK.
  • TO, especificador de rango ascendente en bucles FOR.
  • DOWNTO, especificador de rango descendente en bucles FOR.
  • WEND, cierra un bucle WHILE; la ejecución se reanuda después de él tras un BREAK.
  • IF, bloque condicional que normalmente envuelve un BREAK.