TO
TO imposta il valore finale del contatore di un ciclo FOR in ProBuilder, così il ciclo va dal suo valore iniziale fino a quel limite incluso, con un'iterazione per valore.
Sintassi
FOR variable = start_value TO end_value DO
// code executed on each iteration
NEXTCome funziona
Nell'intestazione di un ciclo FOR, TO separa il valore iniziale del contatore da quello finale. Il ciclo assegna il valore iniziale al contatore, esegue il corpo, e ogni passaggio attraverso NEXT incrementa il contatore di uno. L'iterazione continua finché il contatore non ha superato il valore dopo TO, ed entrambi gli estremi sono inclusi, quindi FOR i = 1 TO 20 viene eseguito venti volte.
TO descrive sempre un intervallo crescente. Quando il valore iniziale supera già il valore finale, il corpo non viene eseguito affatto, il ciclo viene semplicemente saltato. Per contare al ribasso serve la parola chiave complementare DOWNTO, che decrementa invece il contatore.
Il valore finale può essere un letterale, una variabile o un'espressione, il che rende TO utile per intervalli dipendenti dai dati come FOR i = 0 TO lastset($array) o ampiezze di finestra prese da una variabile di ottimizzazione. L'espressione viene valutata all'avvio del ciclo.
Poiché gli script vengono già eseguiti una volta per bar, gli intervalli TO scorrono tipicamente lunghezze di periodo, offset di bar storiche o indici di array all'interno della bar corrente, anziché nel tempo.
Esempi
Esempio 1, Accumulare un rapporto su 20 bar (Indicatore)
// Sum the close/open ratio of the last 20 bars
total = 0
FOR x = 1 TO 20 DO
total = total + close[x] / open[x]
NEXT
RETURN total AS "close/open sum"TO fissa il limite superiore a 20, quindi il corpo viene eseguito per x = 1 fino a 20 inclusi, leggendo una bar storica per iterazione.
Esempio 2, Valore finale variabile da dati memorizzati (ProBacktest)
// Record the range of each bar, then average all stored values
$ranges[max(0, lastset($ranges) + 1)] = high - low
sum = 0
n = lastset($ranges)
IF n >= 4 THEN
FOR i = 0 TO n DO
sum = sum + $ranges[i]
NEXT
avgRange = sum / (n + 1)
IF high - low > avgRange * 2 AND NOT onmarket THEN
BUY 1 CONTRACT AT MARKET
ENDIF
ENDIF
SET STOP %LOSS 1.5Il valore dopo TO è un'espressione, quindi il ciclo copre automaticamente esattamente la porzione riempita dell'array man mano che cresce.
Esempio 3, Scansionare più lookback in un solo passaggio (ProScreener)
// Count how many lookback windows show the close above its average
score = 0
FOR p = 10 TO 50 DO
IF close > average[p](close) THEN
score = score + 1
ENDIF
NEXT
SCREENER[score >= 35] (score AS "Trend score")TO termina la scansione al periodo 50, quindi il punteggio aggrega 41 diversi controlli di media mobile per strumento.
Errori e insidie comuni
- Limite inclusivo. Il contatore assume anche il valore finale, quindi
FOR i = 0 TO 9esegue dieci iterazioni, non nove. I limiti sbagliati di uno sono il bug di ciclo più frequente. - Intervallo decrescente con TO.
FOR i = 20 TO 10non entra mai nel corpo del ciclo perché il valore iniziale supera già il limite. Usa DOWNTO per contare a scendere. - Valore finale dipendente dal corpo del ciclo. Il limite dopo TO è fissato all'avvio del ciclo. Modificare all'interno del corpo le variabili da cui è stato calcolato non allunga né accorcia l'iterazione.
- Intervalli ampi su ogni bar. L'intero intervallo impostato da TO viene eseguito una volta per bar su tutto il grafico. Intervalli ampi intorno a chiamate costose come
average[p]rallentare sensibilmente il ricalcolo.
Istruzioni correlate
FOR, apre il ciclo contato il cui intervallo è definito da TO.DOWNTO, dichiara un intervallo decrescente anziché crescente.DO, separa l'intestazione del ciclo dal corpo del ciclo.NEXT, chiude il corpo del ciclo e avanza il contatore.BREAK, esce dal ciclo prima che il contatore raggiunga il limite TO.WHILE, ciclo guidato da una condizione per intervalli non noti in anticipo.