BREAK
BREAK avslutter en FOR- eller WHILE-løkke umiddelbart i ProBuilder. Bruk den til å stoppe itereringen når en betingelse er oppfylt og hoppe over de gjenstående gjennomløpene av løkken.
Syntaks
BREAKSlik fungerer det
Når utførelsen når en BREAK-setning inne i en løkke, avsluttes løkken umiddelbart. Ingen flere iterasjoner kjøres, resten av den gjeldende iterasjonen hoppes over, og kontrollen gjenopptas ved den første setningen etter løkkens avsluttende nøkkelord, NEXT for en FOR-løkke eller WEND for en WHILE-løkke.
BREAK omsluttes nesten alltid av en IF-blokk, siden en ubetinget BREAK ville gjøre at løkkekroppen kjører høyst én gang. Mønsteret er: iterer, test en stoppbetingelse, og avbryt tidlig når det ville være meningsløst å fortsette. Dette har betydning for ytelsen i skript som skanner bakover over mange bars, fordi skanningen kan stoppe ved den første baren som besvarer spørsmålet i stedet for alltid å gå gjennom hele intervallet.
Med nøstede løkker avslutter BREAK bare den innerste løkken som inneholder den. Å forlate en ytre løkke i tillegg krever en flaggvariabel som den ytre løkken sjekker, eller en omstrukturering av logikken.
BREAK har bare mening inne i FOR- og WHILE-løkker. Å plassere den noe annet sted, for eksempel direkte i en frittstående IF-blokk på skriptets øverste nivå, er en kompileringsfeil.
Eksempler
Eksempel 1, Telle en rekke med fallende bars (Indikator)
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 ValueLøkken teller sammenhengende bars som stengte under sin åpning, og skanner opptil 20 bars tilbake. Den første baren som ikke består testen utløser BREAK, slik at tellingen gjenspeiler en ubrutt rekke og ikke en totalsum.
Eksempel 2, Finne den seneste swing high (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 2Skanningen bakover stopper ved den første kvalifiserende swing high. Uten BREAK ville løkken fortsette og overskrive resultatet med eldre, mindre relevante swings.
Eksempel 3, Begrense et søk med 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")WHILE-løkken søker opptil 50 bars tilbake etter en volumtopp, og BREAK avslutter søket så snart en er funnet.
Vanlige feil og fallgruver
- Bare gyldig inne i løkker. BREAK utenfor en FOR- eller WHILE-kropp kompilerer ikke. Den kan ikke brukes til å hoppe over resten av beregningen for en bar; strukturer om med IF-blokker i stedet.
- Bare den innerste løkken avsluttes. I nøstede løkker forlater BREAK den løkken som omslutter den nærmest. Å gå ut av flere nivåer krever et flagg som den ytre løkken sjekker.
- Tilstand etter løkken. Variabler beholder de verdiene de hadde da BREAK utløste, og FOR-telleren når ikke sluttverdien sin. Ikke gå ut fra at telleren er lik løkkegrensen etter en tidlig utgang.
- Kostnad for lesbarheten. Flere BREAK-setninger spredt gjennom én løkke gjør kontrollflyten vanskelig å følge. Foretrekk én enkelt, tydelig kommentert utgangsbetingelse.
Relaterte instruksjoner
FOR, tellende løkke som BREAK kan avslutte tidlig.WHILE, betinget løkke som BREAK kan avslutte tidlig.DO, valgfritt nøkkelord som åpner en løkkekropp.NEXT, avslutter en FOR-løkke; etter en BREAK fortsetter kjøringen etter den.TO, stigende intervallangivelse i FOR-løkker.DOWNTO, synkende intervallangivelse i FOR-løkker.WEND, avslutter en WHILE-løkke; etter en BREAK fortsetter kjøringen etter den.IF, betinget blokk som vanligvis omslutter en BREAK.