ONCE
ONCE en ProBuilder exécute une affectation uniquement sur le premier bar traité par le script, ce qui évite que les valeurs initiales soient écrasées sur chaque bar suivant.
Syntaxe
ONCE variable = expressionComment ça marche
Un script ProBuilder s'exécute de haut en bas sur chaque bar du graphique, et les variables conservent leurs valeurs d'un bar au suivant. Une simple affectation telle que counter = 0 remet donc la variable à zéro à chaque bar. Préfixer la ligne par ONCE limite l'affectation à la première évaluation seulement, de sorte que les bars suivants laissent la variable intacte et qu'elle peut accumuler un état sur tout le graphique.
L'expression de droite est évaluée avec les données disponibles sur ce premier bar. L'historique est court à ce stade : les fonctions qui exigent une profondeur de calcul, comme lowest[10](low), travaillez avec les bars existants au démarrage du script.
La valeur définie par ONCE persiste jusqu'à ce que le script soit recalculé depuis le début, par exemple après une modification du code, un changement d'unité de temps ou un redémarrage de la plateforme. Dans les systèmes de trading, ONCE est la façon standard de définir des compteurs, des drapeaux et des réglages fixes que la logique d'entrée et de sortie lit à chaque bar.
Exemples
Exemple 1, Suivi des nouveaux plus bas par rapport à une référence initiale (Indicateur)
// capture the 10-bar low a single time when the script starts
ONCE myFirstLowest = lowest[10](low)
IF low < myFirstLowest OR low < recentLow THEN
recentLow = low
ELSE
recentLow = recentLow
ENDIF
RETURN recentLowmyFirstLowest est calculé sur le premier bar seulement et jamais rafraîchi. L'indicateur suit ensuite chaque nouveau plus bas imprimé après cette référence initiale.
Exemple 2, Constantes fixes de stratégie (ProOrder)
DEFPARAM CumulateOrders = false
// define risk settings a single time
ONCE stopPoints = 40
ONCE targetPoints = 80
IF NOT onmarket AND close CROSSES OVER Average[50](close) THEN
BUY 1 CONTRACT AT MARKET
SET STOP pLOSS stopPoints
SET TARGET pPROFIT targetPoints
ENDIFLes deux constantes de risque sont affectées lors de la première évaluation et réutilisées sur chaque bar ensuite, ce qui garde la configuration à un seul endroit évident en haut de la stratégie.
Exemple 3, Gain depuis le premier bar scanné (ProScreener)
// record the close of the first bar in the scanned history
ONCE startLevel = close
gainPct = (close - startLevel) / startLevel * 100
SCREENER[gainPct > 10] (gainPct AS "Gain %")startLevel fige la clôture du premier bar traité. Chaque bar suivant compare la clôture actuelle à celle-ci, et le screener retient les instruments en hausse de plus de 10 pour cent sur la fenêtre scannée.
Erreurs et pièges courants
- Attendre une réinitialisation à chaque session ou chaque jour. ONCE se déclenche à la première évaluation du script et plus jamais ensuite jusqu'à un recalcul complet. Les valeurs qui doivent être réinitialisées chaque jour nécessitent une logique explicite, par exemple comparer la date courante à une date stockée.
- Les données du premier bar sont limitées. L'expression est évaluée au moment où l'historique est le plus court. Une fonction de lookback placée dans ONCE peut voir moins de bars que demandé, ce qui peut rendre la valeur initiale non représentative. Dans les stratégies, PRELOADBARS contrôle la quantité d'historique disponible avant le démarrage.
- ONCE sur une ligne qui devrait s'exécuter à chaque bar. Seules de véritables initialisations ont leur place derrière ONCE. Marquer ainsi un calcul qui dépend des prix courants le rend définitivement obsolète après le premier bar.
- Auto-affectation redondante au lieu de ONCE. Écrire
x = xsur chaque bar pour conserver une valeur fonctionne mais masque l'intention.ONCE x = startValueénonce explicitement l'initialisation et évite les écrasements accidentels.
Instructions liées
IF, logique conditionnelle qui exploite généralement un état initialisé par ONCE.ELSE, branche de repli dans cette logique conditionnelle.ENDIF, ferme un bloc IF.BarIndex, compteur de bars, utile pour une logique liée aux premiers bars.DEFPARAM, réglages d'exécution au niveau du script, également définis en haut du code.RETURN, renvoie la valeur finale d'un indicateur.