ONCE
ONCE in ProBuilder esegue un'assegnazione solo sul primo bar elaborato dallo script, evitando che i valori iniziali vengano sovrascritti su ogni bar successivo.
Sintassi
ONCE variable = expressionCome funziona
Uno script ProBuilder viene eseguito dall'alto verso il basso su ogni barra del grafico, e le variabili mantengono i loro valori da una barra alla successiva. Una semplice assegnazione come counter = 0 riporta quindi la variabile a zero su ogni bar. Far precedere la riga da ONCE limita l'assegnazione alla sola prima valutazione, così i bar successivi lasciano la variabile intatta ed essa può accumulare stato su tutto il grafico.
L'espressione sul lato destro viene valutata con i dati disponibili su quella prima barra. Lo storico è breve a quel punto, quindi le funzioni che richiedono un lookback, come lowest[10](low), lavorano con le bar esistenti all'avvio dello script.
Il valore impostato da ONCE persiste fino a quando lo script non viene ricalcolato da zero, per esempio dopo aver modificato il codice, cambiato il timeframe o riavviato la piattaforma. Nei sistemi di trading, ONCE è il modo standard per definire contatori, flag e impostazioni fisse che la logica di ingresso e di uscita legge su ogni bar.
Esempi
Esempio 1, Monitoraggio dei nuovi minimi rispetto a un riferimento iniziale (Indicatore)
// 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 è calcolato solo sulla prima barra e non viene mai aggiornato. L'indicatore segue poi ogni nuovo minimo registrato dopo quel riferimento iniziale.
Esempio 2, Costanti fisse della strategia (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
ENDIFLe due costanti di rischio vengono assegnate alla prima valutazione e riutilizzate su ogni bar successivo, mantenendo la configurazione in un unico punto evidente in cima alla strategia.
Esempio 3, Guadagno dal primo bar analizzato (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 congela la chiusura del primo bar elaborato. Ogni bar successivo confronta la chiusura corrente con essa, e lo screener trattiene gli strumenti in rialzo di più del 10 percento sulla finestra analizzata.
Errori e insidie comuni
- Aspettarsi un azzeramento a ogni sessione o giorno. ONCE scatta alla prima valutazione dello script e non più fino a un ricalcolo completo. I valori che devono azzerarsi ogni giorno richiedono una logica esplicita, per esempio confrontando la data corrente con una data memorizzata.
- I dati del primo bar sono scarsi. L'espressione viene valutata quando lo storico è al suo minimo. Una funzione di lookback all'interno di ONCE può vedere meno bar di quelli richiesti, il che può rendere il valore iniziale non rappresentativo. Nelle strategie, PRELOADBARS controlla quanto storico è disponibile prima dell'avvio.
- ONCE su una riga che dovrebbe essere eseguita a ogni bar. Dietro ONCE vanno solo vere inizializzazioni. Contrassegnare un calcolo che dipende dai prezzi correnti lo rende permanentemente obsoleto dopo il primo bar.
- Autoassegnazione ridondante invece di ONCE. Scrivere
x = xsu ogni bar per conservare un valore funziona ma nasconde l'intento.ONCE x = startValuedichiara esplicitamente l'inizializzazione ed evita sovrascritture accidentali.
Istruzioni correlate
IF, logica condizionale che tipicamente utilizza uno stato inizializzato con ONCE.ELSE, ramo alternativo all'interno di quella logica condizionale.ENDIF, chiude un blocco IF.BarIndex, contatore di bar, utile per logiche basate sui primi bar.DEFPARAM, impostazioni di esecuzione a livello di script, anch'esse definite in cima.RETURN, restituisce il valore finale di un indicatore.