Iscriviti ora
Istruzioni/probuilder · probacktest · proorder · proscreener

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

probuilder
BREAK

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

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

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

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

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

probuilder
// 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.
  • 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.