Rejoignez-nous
Instructions/probuilder · probacktest · proorder · proscreener

WHILE

La boucle WHILE en ProBuilder répète un bloc de code tant qu'une condition booléenne reste vraie. La condition est testée avant chaque passage, WEND termine la boucle.

Syntaxe

probuilder
WHILE condition DO
  // statements repeated while the condition is true
WEND

Comment ça marche

Avant chaque passage, ProBuilder évalue la condition. Si elle est vraie, le bloc entre DO et WEND s'exécute, puis le contrôle revient à la ligne WHILE et la condition est testée à nouveau. Si elle est fausse, l'exécution saute après WEND. Comme le test a lieu en premier, une condition fausse à l'entrée signifie que le bloc ne s'exécute jamais.

Quelque chose à l'intérieur de la boucle doit finir par rendre la condition fausse. Contrairement à FOR, WHILE n'a pas de compteur intégré, le script est donc responsable de la mise à jour de ce dont dépend la condition. Une condition qui ne peut jamais devenir fausse produit une boucle infinie, que ProRealTime™ interrompt avec une erreur d'exécution plutôt que de laisser la plateforme se bloquer.

La boucle entière s'exécute à nouveau sur chaque bar du graphique. WHILE convient aux parcours ouverts, comme remonter les bars en arrière jusqu'à ce qu'une figure se rompe, où une plage FOR serait soit inutilement coûteuse, soit inconnue.

Exemples

Exemple 1, Compter les itérations (Indicateur)

probuilder
i = 0
count = 0
WHILE i <> 11 DO
  // advance the counter until it reaches 11
  i = i + 1
  count = count + 1
WEND
RETURN count

La boucle s'exécute tant que i diffère de 11. Chaque passage incrémente les deux variables, donc la boucle sort après 11 itérations et l'indicateur renvoie 11.

Exemple 2, Mesurer une série de clôtures en hausse (ProScreener)

probuilder
n = 0
// walk backward while each close is above the previous one
WHILE close[n] > close[n + 1] AND n < 100 DO
  n = n + 1
WEND
SCREENER[n >= 3] (n AS "Up streak")

La boucle compte les clôtures haussières consécutives et s'arrête à la première bar qui rompt la série. Le n < 100 borne garantit la terminaison même dans une tendance exceptionnellement longue.

Exemple 3, Dimensionner une position dans un budget de risque (ProOrder)

probuilder
DEFPARAM CumulateOrders = false
maxRisk = 400
size = 1
// double the position size while the risk budget allows it
WHILE (size * 2) * AverageTrueRange[14](close) <= maxRisk DO
  size = size * 2
WEND
IF close CROSSES OVER Average[50](close) AND NOT onmarket THEN
  BUY size CONTRACT AT MARKET
ENDIF

La boucle augmente la position size de façon géométrique jusqu'à ce qu'un doublement supplémentaire dépasse le budget de risque, puis la stratégie trade cette taille.

Erreurs et pièges courants

  • Boucles infinies. Si rien à l'intérieur du bloc ne modifie la condition, la boucle ne se termine jamais et ProRealTime™ arrête le script sur une erreur. Ajoutez une borne de sécurité explicite, comme une valeur maximale de compteur, à toute condition pilotée par les données de marché.
  • Zéro itération. La condition est évaluée avant le premier passage. Lorsqu'elle est fausse à l'entrée, le bloc est entièrement ignoré, et toutes les variables affectées uniquement à l'intérieur de la boucle conservent leurs valeurs précédentes.
  • WEND manquant. Chaque WHILE a besoin d'un WEND de fermeture. L'erreur du compilateur peut pointer en dessous de la boucle réelle, vérifiez donc les paires lorsque le message semble mal placé.
  • Conditions de sortie basées sur l'égalité. Une condition telle que i <> 11 ne devient jamais faux si i dépasse 11 sans tomber dessus, par exemple lors d'une incrémentation de 2. Les comparaisons avec < ou > sont des tests de sortie plus sûrs que <>.
  • WEND, ferme un bloc WHILE et renvoie le contrôle à la condition.
  • DO, mot-clé terminant un en-tête WHILE ou FOR.
  • FOR, boucle pilotée par un compteur pour un nombre de passages connu.
  • NEXT, ferme un bloc FOR.
  • BREAK, sort immédiatement de la boucle en cours.
  • IF, exécution conditionnelle sans répétition.
  • THEN, requis entre une condition IF et son bloc.
  • ENDIF, ferme un bloc IF.