FOR
El bucle FOR en ProBuilder repite un bloque de código un número fijo de veces, contando hacia arriba con TO o hacia abajo con DOWNTO. Todo bloque FOR se cierra con NEXT.
Sintaxis
FOR variable = start TO end DO
// commands repeated on each pass
NEXTContando hacia abajo:
FOR variable = start DOWNTO end DO
// commands repeated on each pass
NEXTCómo funciona
En cada bar, el bucle inicializa la variable contador con el valor inicial, ejecuta el bloque y después incrementa el contador en 1 (TO) o lo reduce en 1 (DOWNTO). Cuando el contador pasa del valor final, la ejecución continúa después de NEXT. La palabra clave DO es opcional en las versiones actuales de ProRealTime™, pero mantenerla mejora la legibilidad.
El contador es una variable normal y se usa habitualmente como desplazamiento de bars, por lo que close[i] dentro de un bucle lee el precio de cierre i bars atrás. Esto convierte a FOR en la herramienta estándar para sumar, recorrer o dibujar sobre un rango de bars históricas.
Los bucles pueden anidarse. El bucle completo se ejecuta de nuevo en cada bar del gráfico, por lo que un bucle de 100 pasadas en un gráfico de 10,000 bars ejecuta un millón de iteraciones. Mantén los rangos tan pequeños como permita el cálculo y usa BREAK para salir antes en cuanto se conozca el resultado.
Ejemplos
Ejemplo 1, Suma de los precios de apertura en un rango de bars (Indicador)
a = 0
FOR i = 10 TO 20 DO
// add the open of each bar in the range to the running total
a = open[i] + a
NEXT
RETURN a AS "Sum of Opens"El contador i recorre desde el desplazamiento de bar 10 hasta el desplazamiento de bar 20, acumulando cada precio de apertura en a, que se devuelve una vez que el bucle termina.
Ejemplo 2, Contar bars alcistas en una ventana (ProScreener)
count = 0
FOR i = 0 TO 19 DO
// count the bars that closed above their open
IF close[i] > open[i] THEN
count = count + 1
ENDIF
NEXT
SCREENER[count >= 15] (count AS "Bullish bars")El bucle examina los últimos 20 bars y el screener lista los instrumentos en los que al menos 15 de ellos cerraron por encima de su apertura.
Ejemplo 3, Recorrido hacia atrás con DOWNTO (ProOrder)
// find the most recent bar that matches the 50-bar high
hh = highest[50](high)
found = 50
FOR i = 50 DOWNTO 0 DO
IF high[i] = hh THEN
found = i
ENDIF
NEXT
// enter only if the high was printed within the last 5 bars
IF found <= 5 AND NOT onmarket THEN
BUY 1 CONTRACT AT MARKET
ENDIFDOWNTO recorre desde el desplazamiento más antiguo hacia el bar actual, dejando found en el desplazamiento más reciente donde se fijó el máximo de 50 bars.
Errores y trampas habituales
- Falta NEXT. Cada FOR necesita un NEXT que le corresponda. Con bucles anidados el compilador puede señalar el error lejos del bucle que realmente está sin cerrar, así que empareja los pares desde dentro hacia fuera.
- Inicio más allá del final. A
FOR i = 10 TO 5el bucle nunca se ejecuta, y tampocoFOR i = 5 DOWNTO 10. La palabra clave de dirección debe coincidir con la dirección del rango; de lo contrario el bloque se omite sin avisar. - Modificar el contador dentro del bucle. Reasignar la variable del bucle dentro del bloque interfiere con el incremento automático y puede producir pasadas omitidas o salidas inesperadas. Usa una variable aparte para los cálculos intermedios.
- Rendimiento en rangos grandes. El bucle se vuelve a ejecutar en cada bar, por lo que los rangos amplios se multiplican rápidamente. Prefiere funciones integradas como
summationohighestcuando existe, y salir pronto con BREAK cuando se encuentra la respuesta.
Instrucciones relacionadas
TO, separador de rango ascendente dentro de una cabecera FOR.DOWNTO, separador de rango descendente dentro de una cabecera FOR.NEXT, cierra un bloque FOR y provoca la siguiente pasada.DO, palabra clave opcional que cierra una cabecera FOR o WHILE.BREAK, sale del bucle actual antes de agotar el rango.WHILE, bucle gobernado por una condición para un número desconocido de pasadas.WEND, cierra un bloque WHILE.BarIndex, contador de bars útil para acotar los rangos de los bucles.