BREAK
BREAK avbryter en FOR- eller WHILE-loop omedelbart i ProBuilder. Använd det för att sluta iterera när ett villkor är uppfyllt och hoppa över de återstående varven i loopen.
Syntax
BREAKSå fungerar det
När exekveringen når en BREAK-sats inuti en loop avslutas loopen omedelbart. Inga ytterligare iterationer körs, resten av den aktuella iterationen hoppas över, och kontrollen återupptas vid den första satsen efter loopens avslutande nyckelord, NEXT för en FOR-loop eller WEND för en WHILE-loop.
BREAK ligger nästan alltid inuti ett IF-block, eftersom ett villkorslöst BREAK skulle göra att loopkroppen körs högst en gång. Mönstret är: iterera, testa ett stoppvillkor och avbryt i förtid när det är meningslöst att fortsätta. Det har betydelse för prestandan i skript som söker bakåt över många barer, eftersom sökningen kan stanna vid den första baren som besvarar frågan i stället för att alltid gå igenom hela intervallet.
Med nästlade loopar avslutar BREAK bara den innersta loopen som innehåller det. Att lämna även en yttre loop kräver en flaggvariabel som den yttre loopen kontrollerar, eller en omstrukturering av logiken.
BREAK är bara meningsfullt inuti FOR- och WHILE-loopar. Att placera det någon annanstans, till exempel direkt i ett ensamt IF-block på skriptets toppnivå, är ett kompileringsfel.
Exempel
Exempel 1, Räkna en serie av nedgångsbarer (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 ValueLoopen räknar sammanhängande barer som stängde under sin öppning, och söker upp till 20 barer bakåt. Den första baren som inte klarar testet utlöser BREAK, så räkningen speglar en obruten serie snarare än en totalsumma.
Exempel 2, Hitta den senaste swing-toppen (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 2Sökningen bakåt stannar vid den första swing-toppen som uppfyller villkoret. Utan BREAK skulle loopen fortsätta och skriva över resultatet med äldre, mindre relevanta swings.
Exempel 3, Begränsa en sökning 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-loopen söker upp till 50 barer bakåt efter en volymspik, och BREAK avslutar sökningen så snart en hittas.
Vanliga fel och fallgropar
- Bara giltigt inuti loopar. BREAK utanför en FOR- eller WHILE-kropp kompilerar inte. Det kan inte användas för att hoppa över resten av en bars beräkning; strukturera om med IF-block i stället.
- Bara den innersta loopen avslutas. I nästlade loopar lämnar BREAK den loop som omedelbart omger det. Att lämna flera nivåer kräver en flagga som den yttre loopen kontrollerar.
- Tillstånd efter loopen. Variabler behåller de värden de hade när BREAK utlöstes, och FOR-räknaren når inte sitt slutvärde. Antag inte att räknaren är lika med loopens gräns efter ett tidigt avbrott.
- Kostnad i läsbarhet. Flera BREAK-satser utspridda i samma loop gör kontrollflödet svårt att följa. Föredra ett enda, tydligt kommenterat utgångsvillkor.
Relaterade instruktioner
FOR, räknad loop som BREAK kan avbryta i förtid.WHILE, villkorsstyrd loop som BREAK kan avbryta i förtid.DO, valfritt nyckelord som inleder en loopkropp.NEXT, avslutar en FOR-loop; exekveringen återupptas efter den vid en BREAK.TO, specificerare för stigande intervall i FOR-loopar.DOWNTO, intervallangivelse för nedåträkning i FOR-loopar.WEND, avslutar en WHILE-loop; exekveringen återupptas efter den vid en BREAK.IF, villkorsblock som normalt omsluter en BREAK.