DO
DO in ProBuilder segna l'inizio del corpo del ciclo nelle istruzioni FOR e WHILE. È opzionale, non esegue alcuna operazione ed esiste per rendere i cicli leggibili.
Sintassi
FOR variable = start TO end DO
// actions executed on each iteration
NEXTIn un ciclo WHILE:
WHILE condition DO
// actions executed while the condition is true
WENDCome funziona
DO è una parola chiave strutturale. Si trova tra la dichiarazione del ciclo, sia FOR variable = start TO end o WHILE condition, e le istruzioni che vengono eseguite a ogni iterazione. Il compilatore accetta i cicli con o senza di essa; l'esecuzione è identica in entrambi i casi. Il suo scopo è la leggibilità, segnando esattamente dove finisce l'intestazione del ciclo e dove inizia il corpo.
In un ciclo FOR, il corpo tra DO e NEXT viene eseguito una volta per ogni valore del contatore, procedendo verso l'alto con TO o verso il basso con DOWNTO. In un ciclo WHILE, il corpo tra DO e WEND si ripete finché la condizione risulta vera, con la condizione ritestata prima di ogni passaggio.
I cicli vengono eseguiti per intero su ogni bar del grafico o del backtest, quindi un ciclo che analizza centinaia di bar ripete quella scansione su ogni nuova bar. BREAK esce in anticipo dal ciclo che lo contiene, il che riduce il numero di iterazioni quando i passaggi restanti non possono cambiare il risultato.
Esempi
Esempio 1, Conteggio di bar consecutive in ribasso (Indicatore)
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 ValueIl ciclo ripercorre le 20 bar precedenti e conta quante hanno chiuso sotto la propria apertura, fermandosi alla prima bar che non lo ha fatto. DO separa l'intestazione del ciclo dalla logica di conteggio.
Esempio 2, Bar consecutive in rialzo con un ciclo 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")Il ciclo WHILE conta la serie corrente di bar in rialzo, con un limite di 100 iterazioni, e lo screener seleziona gli strumenti con una serie di tre o più.
Esempio 3, Filtro sui picchi di 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
ENDIFUn ciclo FOR con DO accumula i range degli ultimi dieci bar per costruire una media, che poi regola la condizione di ingresso.
Errori e insidie comuni
- Parola chiave di chiusura errata. I cicli FOR terminano con NEXT e i cicli WHILE terminano con WEND. Abbinare FOR a WEND, o WHILE a NEXT, è un errore di compilazione anche quando DO è presente.
- DO su una riga a sé. DO va alla fine della riga di intestazione del ciclo. Metterlo su una riga separata, o duplicarlo prima di ogni istruzione, non compila.
- Cicli WHILE infiniti. DO non protegge da una condizione che non diventa mai falsa. Il corpo di un WHILE deve modificare qualcosa da cui dipende la condizione, oppure includere un limite rigido di iterazioni, altrimenti lo script si blocca.
- Supporre che DO sia obbligatorio. Omettere DO è lecito, quindi la sua assenza nel codice esistente non è un bug. Stili misti all'interno di uno stesso script compilano senza problemi ma penalizzano la leggibilità.
Istruzioni correlate
FOR, ciclo contato di cui DO introduce il corpo.NEXT, chiude un ciclo FOR e fa avanzare il contatore.TO, direzione crescente del contatore in un'intestazione FOR.DOWNTO, direzione decrescente del contatore in un'intestazione FOR.WHILE, ciclo guidato da una condizione che accetta anch'esso DO.WEND, chiude un ciclo WHILE.BREAK, esce dal ciclo che lo racchiude prima che finisca.IF, logica condizionale comunemente annidata nei corpi dei cicli.