DO
DO en ProBuilder marque le début du corps de boucle dans les instructions FOR et WHILE. Il est optionnel, n'effectue aucune opération et existe pour rendre les boucles lisibles.
Syntaxe
FOR variable = start TO end DO
// actions executed on each iteration
NEXTDans une boucle WHILE :
WHILE condition DO
// actions executed while the condition is true
WENDComment ça marche
DO est un mot-clé structurel. Il se place entre la déclaration de boucle, soit FOR variable = start TO end ou WHILE condition, et les instructions exécutées à chaque itération. Le compilateur accepte les boucles avec ou sans lui ; l'exécution est identique dans les deux cas. Son rôle est la lisibilité : il marque exactement où se termine l'en-tête de la boucle et où commence le corps.
Dans une boucle FOR, le corps situé entre DO et NEXT s'exécute une fois pour chaque valeur du compteur, en progressant vers le haut avec TO ou vers le bas avec DOWNTO. Dans une boucle WHILE, le corps situé entre DO et WEND se répète aussi longtemps que la condition est évaluée comme vraie, la condition étant retestée avant chaque passage.
Les boucles s'exécutent intégralement sur chaque bar du graphique ou du backtest, de sorte qu'une boucle qui balaie des centaines de bars refait ce balayage à chaque nouveau bar. BREAK sort de la boucle englobante par anticipation, ce qui limite le nombre d'itérations lorsque les passages restants ne peuvent pas changer le résultat.
Exemples
Exemple 1, Compter les bars consécutifs en baisse (Indicateur)
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 ValueLa boucle parcourt à rebours les 20 bars précédents et compte combien ont clôturé sous leur ouverture, en s'arrêtant au premier bar qui ne l'a pas fait. DO sépare l'en-tête de boucle de la logique de comptage.
Exemple 2, Bars consécutifs en hausse avec une boucle 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")La boucle WHILE compte la série actuelle de bars en hausse, limitée à 100 itérations, et le screener retient les instruments dont la série atteint trois ou plus.
Exemple 3, Filtre de pic de volatilité (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
ENDIFUne boucle FOR avec DO accumule les ranges des dix derniers bars pour construire une moyenne, qui conditionne ensuite l'entrée.
Erreurs et pièges courants
- Mauvais mot-clé de fermeture. Les boucles FOR se terminent par NEXT et les boucles WHILE se terminent par WEND. Associer FOR à WEND, ou WHILE à NEXT, est une erreur de compilation même lorsque DO est présent.
- DO sur sa propre ligne. DO doit figurer à la fin de la ligne d'en-tête de boucle. Le placer sur une ligne distincte, ou le répéter avant chaque instruction, ne compile pas.
- Boucles WHILE infinies. DO ne protège pas contre une condition qui ne devient jamais fausse. Le corps d'une boucle WHILE doit modifier un élément dont dépend la condition, ou inclure une limite stricte d'itérations, sinon le script se bloque.
- Supposer que DO est obligatoire. Omettre DO est licite, son absence dans du code existant n'est donc pas un bug. Des styles mélangés au sein d'un même script compilent sans problème mais nuisent à la lisibilité.
Instructions liées
FOR, boucle comptée dont DO introduit le corps.NEXT, ferme une boucle FOR et fait avancer le compteur.TO, sens de compteur croissant dans un en-tête FOR.DOWNTO, sens de compteur décroissant dans un en-tête FOR.WHILE, boucle pilotée par une condition qui accepte aussi DO.WEND, ferme une boucle WHILE.BREAK, sort de la boucle englobante avant sa fin.IF, logique conditionnelle couramment imbriquée dans le corps des boucles.