TO
TO establece el valor final del contador de un bucle FOR en ProBuilder, de modo que el bucle se ejecuta desde su valor inicial hasta ese límite inclusive, una iteración por valor.
Sintaxis
FOR variable = start_value TO end_value DO
// code executed on each iteration
NEXTCómo funciona
En la cabecera de un bucle FOR, TO separa el valor inicial del contador de su valor final. El bucle asigna el valor inicial al contador, ejecuta el cuerpo, y cada paso por NEXT incrementa el contador en uno. La iteración continúa mientras el contador no haya superado el valor que sigue a TO, y ambos límites se incluyen, por lo que FOR i = 1 TO 20 se ejecuta veinte veces.
TO describe siempre un rango ascendente. Cuando el valor inicial ya supera el valor final, el cuerpo no se ejecuta en absoluto, el bucle simplemente se omite. Contar hacia abajo requiere la palabra clave complementaria DOWNTO, que en su lugar decrementa el contador.
El valor final puede ser un literal, una variable o una expresión, lo que hace que TO sea útil para rangos dependientes de los datos como FOR i = 0 TO lastset($array) o tamaños de ventana tomados de una variable de optimización. La expresión se evalúa cuando comienza el bucle.
Como los scripts ya se ejecutan una vez por bar, los rangos de TO suelen recorrer longitudes de periodo, desplazamientos de bars históricas o índices de array dentro de la bar actual, en lugar de recorrer el tiempo.
Ejemplos
Ejemplo 1, Acumular un ratio a lo largo de 20 bars (Indicador)
// Sum the close/open ratio of the last 20 bars
total = 0
FOR x = 1 TO 20 DO
total = total + close[x] / open[x]
NEXT
RETURN total AS "close/open sum"TO fija el límite superior en 20, por lo que el cuerpo se ejecuta para x = 1 hasta 20 inclusive, leyendo una bar histórica por iteración.
Ejemplo 2, Valor final variable a partir de datos almacenados (ProBacktest)
// Record the range of each bar, then average all stored values
$ranges[max(0, lastset($ranges) + 1)] = high - low
sum = 0
n = lastset($ranges)
IF n >= 4 THEN
FOR i = 0 TO n DO
sum = sum + $ranges[i]
NEXT
avgRange = sum / (n + 1)
IF high - low > avgRange * 2 AND NOT onmarket THEN
BUY 1 CONTRACT AT MARKET
ENDIF
ENDIF
SET STOP %LOSS 1.5El valor que sigue a TO es una expresión, por lo que el bucle cubre automáticamente exactamente la parte llena del array a medida que crece.
Ejemplo 3, Escanear varias ventanas de retroceso en una sola pasada (ProScreener)
// Count how many lookback windows show the close above its average
score = 0
FOR p = 10 TO 50 DO
IF close > average[p](close) THEN
score = score + 1
ENDIF
NEXT
SCREENER[score >= 35] (score AS "Trend score")TO termina el recorrido en el periodo 50, por lo que la puntuación agrega 41 comprobaciones distintas de medias móviles por instrumento.
Errores y trampas habituales
- Límite inclusivo. El contador toma también el valor final, así que
FOR i = 0 TO 9ejecuta diez iteraciones, no nueve. Los límites desplazados en uno son el error de bucle más frecuente. - Rango descendente con TO.
FOR i = 20 TO 10nunca entra en el cuerpo del bucle porque el inicio ya supera el límite. Usa DOWNTO para contar hacia abajo. - Valor final que depende del cuerpo del bucle. El límite que sigue a TO se fija cuando el bucle comienza. Cambiar dentro del cuerpo las variables a partir de las que se calculó no alarga ni acorta la iteración.
- Rangos grandes en cada bar. El rango completo fijado por TO se ejecuta una vez por bar en todo el gráfico. Los rangos amplios en torno a llamadas costosas como
average[p]ralentizar el recálculo notablemente.
Instrucciones relacionadas
FOR, abre el bucle contado cuyo rango define TO.DOWNTO, declara un rango descendente en lugar de uno ascendente.DO, separa la cabecera del bucle del cuerpo del bucle.NEXT, cierra el cuerpo del bucle y avanza el contador.BREAK, sale del bucle antes de que el contador alcance el límite de TO.WHILE, bucle guiado por condición para rangos que no se conocen por adelantado.