DO
DO en ProBuilder marca el inicio del cuerpo del bucle en las instrucciones FOR y WHILE. Es opcional, no realiza ninguna operación y existe para hacer legibles los bucles.
Sintaxis
FOR variable = start TO end DO
// actions executed on each iteration
NEXTEn un bucle WHILE:
WHILE condition DO
// actions executed while the condition is true
WENDCómo funciona
DO es una palabra clave estructural. Se sitúa entre la declaración del bucle, ya sea FOR variable = start TO end o WHILE condition, y las instrucciones que se ejecutan en cada iteración. El compilador acepta bucles con o sin ella; la ejecución es idéntica en ambos casos. Su propósito es la legibilidad, marcando exactamente dónde acaba la cabecera del bucle y empieza el cuerpo.
En un bucle FOR, el cuerpo entre DO y NEXT se ejecuta una vez por cada valor del contador, avanzando hacia arriba con TO o hacia abajo con DOWNTO. En un bucle WHILE, el cuerpo entre DO y WEND se repite mientras la condición se evalúe como verdadera, y la condición se vuelve a comprobar antes de cada pasada.
Los bucles se ejecutan por completo en cada barra del gráfico o del backtest, por lo que un bucle que recorre cientos de barras repite ese recorrido en cada nueva barra. BREAK sale antes del bucle que lo contiene, lo que mantiene bajo el número de iteraciones cuando las pasadas restantes no pueden cambiar el resultado.
Ejemplos
Ejemplo 1, Contar barras consecutivas a la baja (Indicador)
Value = 0
FOR i = 1 TO 20 DO
// Stop counting at the first bar that is not a down bar
IF (Close[i] < Open[i]) THEN
Value = Value + 1
ELSE
BREAK
ENDIF
NEXT
RETURN ValueEl bucle recorre hacia atrás las 20 barras anteriores y cuenta cuántas cerraron por debajo de su apertura, deteniéndose en la primera barra que no lo hizo. DO separa el encabezado del bucle de la lógica de conteo.
Ejemplo 2, Barras consecutivas al alza con un bucle WHILE (ProScreener)
i = 0
count = 0
// Walk backward while each bar closed above its open
WHILE (close[i] > open[i]) AND (i < 100) DO
count = count + 1
i = i + 1
WEND
SCREENER[count >= 3] (count AS "up bars in a row")El bucle WHILE cuenta la racha actual de barras al alza, limitada a 100 iteraciones, y el screener selecciona los instrumentos con una racha de tres o más.
Ejemplo 3, Filtro de picos de volatilidad (ProBacktest)
total = 0
// Sum the range of the previous 10 completed bars
FOR i = 1 TO 10 DO
total = total + Range[i]
NEXT
avgRange = total / 10
// Enter when the current bar's range doubles the recent average
IF Range > 2 * avgRange AND NOT ONMARKET THEN
BUY 1 CONTRACT AT MARKET
ENDIFUn bucle FOR con DO acumula los rangos de los últimos diez bars para construir una media, que después controla la condición de entrada.
Errores y trampas habituales
- Palabra clave de cierre incorrecta. Los bucles FOR terminan con NEXT y los bucles WHILE terminan con WEND. Emparejar FOR con WEND, o WHILE con NEXT, es un error de compilación incluso cuando DO está presente.
- DO en su propia línea. DO va al final de la línea de encabezado del bucle. Colocarlo en una línea aparte, o duplicarlo antes de cada instrucción, no compila.
- Bucles WHILE infinitos. DO no protege frente a una condición que nunca llega a ser falsa. El cuerpo de un WHILE debe modificar algo de lo que dependa la condición, o incluir un límite fijo de iteraciones; de lo contrario el script se bloquea.
- Suponer que DO es obligatorio. Omitir DO es legal, por lo que su ausencia en código existente no es un error. Mezclar estilos dentro de un mismo script compila sin problemas pero perjudica la legibilidad.
Instrucciones relacionadas
FOR, bucle contado cuyo cuerpo introduce DO.NEXT, cierra un bucle FOR y avanza el contador.TO, dirección ascendente del contador en una cabecera FOR.DOWNTO, dirección descendente del contador en una cabecera FOR.WHILE, bucle dirigido por condición que también acepta DO.WEND, cierra un bucle WHILE.BREAK, sale del bucle que lo contiene antes de que termine.IF, lógica condicional habitualmente anidada dentro del cuerpo de los bucles.