Iscriviti ora
Istruzioni/probuilder · probacktest · proorder · proscreener

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

probuilder
FOR variable = start TO end DO
  // actions executed on each iteration
NEXT

In un ciclo WHILE:

probuilder
WHILE condition DO
  // actions executed while the condition is true
WEND

Come 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)

probuilder
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 Value

Il 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)

probuilder
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)

probuilder
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
ENDIF

Un 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à.
  • 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.