Iscriviti ora
Istruzioni/probuilder · probacktest · proorder · proscreener

WHILE

Il ciclo WHILE in ProBuilder ripete un blocco di codice finché una condizione booleana rimane vera. La condizione viene verificata prima di ogni passaggio, WEND termina il ciclo.

Sintassi

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

Come funziona

Prima di ogni passaggio, ProBuilder valuta la condizione. Se è vera, il blocco tra DO e WEND viene eseguito, poi il controllo torna alla riga WHILE e la condizione viene verificata di nuovo. Se è falsa, l'esecuzione salta oltre WEND. Poiché il test avviene per primo, una condizione falsa all'ingresso significa che il blocco non viene eseguito affatto.

Qualcosa all'interno del ciclo deve prima o poi rendere falsa la condizione. A differenza di FOR, WHILE non ha un contatore integrato, quindi lo script è responsabile dell'aggiornamento di ciò da cui dipende la condizione. Una condizione che non può mai diventare falsa produce un ciclo infinito, che ProRealTime™ interrompe con un errore di esecuzione anziché lasciare la piattaforma bloccata.

L'intero ciclo viene eseguito di nuovo su ogni bar del grafico. WHILE è adatto alle scansioni aperte, come percorrere i bar a ritroso finché un pattern non si interrompe, dove un intervallo FOR sarebbe sprecato o sconosciuto.

Esempi

Esempio 1, Contare le iterazioni (Indicatore)

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

Il ciclo gira finché i è diverso da 11. Ogni passaggio incrementa entrambe le variabili, quindi il ciclo termina dopo 11 iterazioni e l'indicatore restituisce 11.

Esempio 2, Misurare una serie di chiusure al rialzo (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")

Il ciclo conta le chiusure consecutive in rialzo, fermandosi alla prima bar che interrompe la serie. Il n < 100 il limite garantisce la terminazione anche in un trend insolitamente lungo.

Esempio 3, Dimensionare una posizione entro un budget di rischio (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

Il ciclo aumenta la position size geometricamente fino a quando un ulteriore raddoppio supererebbe il budget di rischio, poi la strategia opera con quella dimensione.

Errori e insidie comuni

  • Cicli infiniti. Se nulla all'interno del blocco cambia la condizione, il ciclo non termina mai e ProRealTime™ interrompe lo script con un errore. Aggiungi un limite di sicurezza esplicito, come un valore massimo del contatore, a ogni condizione guidata dai dati di mercato.
  • Zero iterazioni. La condizione viene valutata prima del primo passaggio. Quando è falsa all'ingresso, il blocco viene saltato completamente, e tutte le variabili assegnate solo all'interno del ciclo mantengono i loro valori precedenti.
  • WEND mancante. Ogni WHILE ha bisogno di un WEND di chiusura. L'errore del compilatore può indicare un punto sotto il ciclo effettivo, quindi controlla le coppie quando il messaggio sembra fuori posto.
  • Condizioni di uscita basate sull'uguaglianza. Una condizione come i <> 11 non diventa mai falso se i supera 11 senza toccarlo, per esempio quando si incrementa di 2. I confronti con < o > sono test di uscita più sicuri di <>.
  • WEND, chiude un blocco WHILE e restituisce il controllo alla condizione.
  • DO, parola chiave che termina l'intestazione di un WHILE o FOR.
  • FOR, ciclo guidato da contatore per un numero noto di passaggi.
  • NEXT, chiude un blocco FOR.
  • BREAK, esce immediatamente dal ciclo corrente.
  • IF, esecuzione condizionale senza ripetizione.
  • THEN, richiesto tra una condizione IF e il suo blocco.
  • ENDIF, chiude un blocco IF.