TO
TO définit la valeur de fin du compteur d'une boucle FOR dans ProBuilder, de sorte que la boucle s'exécute de sa valeur de départ jusqu'à cette limite incluse, une itération par valeur.
Syntaxe
FOR variable = start_value TO end_value DO
// code executed on each iteration
NEXTComment ça marche
Dans l'en-tête d'une boucle FOR, TO sépare la valeur de départ du compteur de sa valeur de fin. La boucle affecte la valeur de départ au compteur, exécute le corps, et chaque passage par NEXT incrémente le compteur de un. L'itération continue tant que le compteur n'a pas dépassé la valeur qui suit TO, et les deux bornes sont incluses, donc FOR i = 1 TO 20 s'exécute vingt fois.
TO décrit toujours une plage ascendante. Lorsque la valeur de départ dépasse déjà la valeur de fin, le corps ne s'exécute jamais, la boucle est simplement ignorée. Compter à rebours exige le mot-clé associé DOWNTO, qui décrémente le compteur à la place.
La valeur finale peut être un littéral, une variable ou une expression, ce qui rend TO utile pour des plages dépendant des données, comme FOR i = 0 TO lastset($array) ou des tailles de fenêtre issues d'une variable d'optimisation. L'expression est évaluée au démarrage de la boucle.
Puisque les scripts s'exécutent déjà une fois par bar, les plages TO balaient typiquement des longueurs de période, des décalages de bars historiques ou des indices de tableau au sein du bar courant plutôt que le temps.
Exemples
Exemple 1, Accumuler un ratio sur 20 bars (Indicateur)
// 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 fixe la borne supérieure à 20, de sorte que le corps s'exécute pour x = 1 jusqu'à 20 inclus, en lisant un bar historique par itération.
Exemple 2, Valeur de fin variable issue de données mémorisées (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.5La valeur après TO est une expression, de sorte que la boucle couvre automatiquement exactement la portion remplie du tableau à mesure qu'elle grandit.
Exemple 3, Balayer plusieurs périodes d'observation en une seule passe (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 termine le balayage à la période 50, de sorte que le score agrège 41 vérifications de moyennes mobiles différentes par instrument.
Erreurs et pièges courants
- Limite incluse. Le compteur prend aussi la valeur finale, donc
FOR i = 0 TO 9effectue dix itérations, pas neuf. Les bornes décalées d'une unité sont l'erreur de boucle la plus fréquente. - Plage descendante avec TO.
FOR i = 20 TO 10n'entre jamais dans le corps de la boucle parce que le début dépasse déjà la limite. Utilisez DOWNTO pour compter à rebours. - Valeur de fin dépendant du corps de la boucle. La limite après TO est fixée au démarrage de la boucle. Modifier dans le corps les variables à partir desquelles elle a été calculée n'allonge ni ne raccourcit l'itération.
- Grandes plages à chaque bar. La plage complète définie par TO est parcourue une fois par barre sur tout le graphique. Des plages larges autour d'appels coûteux comme
average[p]ralentir sensiblement le recalcul.
Instructions liées
FOR, ouvre la boucle comptée dont TO définit la plage.DOWNTO, déclare une plage descendante au lieu d'une plage ascendante.DO, sépare l'en-tête de la boucle de son corps.NEXT, ferme le corps de la boucle et fait avancer le compteur.BREAK, sort de la boucle avant que le compteur n'atteigne la limite TO.WHILE, boucle pilotée par une condition pour des plages qui ne sont pas connues à l'avance.