BREAK
BREAK esce immediatamente da un ciclo FOR o WHILE in ProBuilder. Usalo per interrompere l'iterazione quando una condizione è soddisfatta e saltare i passaggi restanti del ciclo.
Sintassi
BREAKCome funziona
Quando l'esecuzione raggiunge un'istruzione BREAK all'interno di un ciclo, il ciclo termina immediatamente. Non viene eseguita nessuna ulteriore iterazione, il resto dell'iterazione corrente viene saltato e il controllo riprende dalla prima istruzione dopo la parola chiave di chiusura del ciclo, NEXT per un ciclo FOR o WEND per un ciclo WHILE.
BREAK è quasi sempre racchiuso in un blocco IF, poiché un BREAK incondizionato farebbe eseguire il corpo del ciclo al massimo una volta. Lo schema è: iterare, testare una condizione di arresto e uscire in anticipo quando proseguire sarebbe inutile. Questo conta per le prestazioni negli script che scorrono all'indietro su molte bar, perché la scansione può fermarsi alla prima bar che risponde alla domanda invece di percorrere sempre l'intero intervallo.
Con i cicli annidati, BREAK esce solo dal ciclo più interno che lo contiene. Uscire anche da un ciclo esterno richiede una variabile flag controllata dal ciclo esterno, oppure una ristrutturazione della logica.
BREAK ha senso solo all'interno dei cicli FOR e WHILE. Collocarlo altrove, per esempio direttamente dentro un semplice blocco IF al livello principale di uno script, è un errore di compilazione.
Esempi
Esempio 1, Conteggio di una serie di bar ribassiste (Indicatore)
Value = 0
FOR i = 1 TO 20 DO
IF (Close[i] < Open[i]) THEN
Value = Value + 1
ELSE
BREAK // stop at the first bar that is not a down bar
ENDIF
NEXT
RETURN ValueIl ciclo conta le bar consecutive che hanno chiuso sotto la propria apertura, scorrendo all'indietro fino a 20 bar. La prima bar che non supera il test attiva BREAK, così il conteggio riflette una serie ininterrotta e non un totale.
Esempio 2, Individuare il massimo di swing più recente (ProOrder)
DEFPARAM CumulateOrders = false
swingHigh = 0
FOR i = 2 TO 100 DO
// A local swing high: higher than its two neighbours
IF high[i] > high[i + 1] AND high[i] > high[i - 1] THEN
swingHigh = high[i]
BREAK // nearest swing found, no need to scan older bars
ENDIF
NEXT
// Enter long on a break of that level
IF swingHigh > 0 AND close CROSSES OVER swingHigh THEN
BUY 1 CONTRACT AT MARKET
ENDIF
SET STOP %LOSS 2La scansione all'indietro si ferma al primo massimo di swing valido. Senza BREAK il ciclo proseguirebbe e sovrascriverebbe il risultato con swing più vecchi e meno rilevanti.
Esempio 3, Limitare una ricerca con WHILE (ProScreener)
// Walk back until a bar with double the average volume is found
avgVol = Average[20](volume)
i = 1
found = 0
WHILE i <= 50 DO
IF volume[i] > 2 * avgVol THEN
found = i
BREAK // record the distance and stop searching
ENDIF
i = i + 1
WEND
// Keep instruments with a volume spike in the last 10 bars
SCREENER[found > 0 AND found <= 10] (found AS "Bars since spike")Il ciclo WHILE cerca un picco di volume fino a 50 bar indietro e BREAK termina la ricerca non appena ne viene trovato uno.
Errori e insidie comuni
- Valido solo dentro i cicli. BREAK fuori dal corpo di un FOR o di un WHILE non compila. Non può essere usato per saltare il resto del calcolo di una bar; ristruttura invece con blocchi IF.
- Esce solo il ciclo più interno. Nei cicli annidati, BREAK esce dal ciclo che lo racchiude immediatamente. Uscire da più livelli richiede un flag controllato dal ciclo esterno.
- Stato dopo il ciclo. Le variabili mantengono i valori che avevano quando BREAK è scattato e il contatore del FOR non raggiunge il suo valore finale. Non dare per scontato che dopo un'uscita anticipata il contatore sia uguale al limite del ciclo.
- Costo in leggibilità. Più istruzioni BREAK sparse in un unico ciclo rendono difficile seguire il flusso di controllo. Preferisci una sola condizione di uscita, chiaramente commentata.
Istruzioni correlate
FOR, ciclo con contatore da cui BREAK può uscire in anticipo.WHILE, ciclo condizionale da cui BREAK può uscire in anticipo.DO, parola chiave opzionale che apre il corpo di un ciclo.NEXT, chiude un ciclo FOR; l'esecuzione riprende dopo di esso in seguito a un BREAK.TO, specificatore di intervallo crescente nei cicli FOR.DOWNTO, specificatore di intervallo decrescente nei cicli FOR.WEND, chiude un ciclo WHILE; l'esecuzione riprende dopo di esso in seguito a un BREAK.IF, blocco condizionale che normalmente racchiude un BREAK.