BREAK
BREAK verlaat in ProBuilder onmiddellijk een FOR- of WHILE-loop. Gebruik het om te stoppen met itereren zodra een voorwaarde is vervuld en de resterende doorgangen door de loop over te slaan.
Syntaxis
BREAKHoe het werkt
Wanneer de uitvoering een BREAK-statement binnen een loop bereikt, eindigt de loop onmiddellijk. Er volgen geen verdere iteraties, de rest van de huidige iteratie wordt overgeslagen en de uitvoering gaat verder bij het eerste statement na het afsluitende keyword van de loop, NEXT voor een FOR-lus of WEND voor een WHILE-lus.
BREAK wordt vrijwel altijd in een IF-blok geplaatst, omdat een onvoorwaardelijke BREAK de loopbody maximaal één keer zou laten lopen. Het patroon is: itereren, een stopvoorwaarde testen en vroegtijdig afbreken wanneer doorgaan zinloos zou zijn. Dit is van belang voor de performance in scripts die veel bars terugscannen, omdat de scan kan stoppen bij de eerste bar die de vraag beantwoordt in plaats van altijd het hele bereik af te lopen.
Bij geneste loops verlaat BREAK alleen de binnenste loop waarin het staat. Ook een buitenste loop verlaten vereist een flagvariabele die de buitenste loop controleert, of een herstructurering van de logica.
BREAK heeft alleen betekenis binnen FOR- en WHILE-loops. Het elders plaatsen, bijvoorbeeld direct in een los IF-blok op het hoogste niveau van een script, is een compilatiefout.
Voorbeelden
Voorbeeld 1, Een reeks dalende bars tellen (Indicator)
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 ValueDe loop telt opeenvolgende bars die onder hun open sloten, en scant tot 20 bars terug. De eerste bar die de test niet doorstaat activeert BREAK, zodat de telling een ononderbroken reeks weergeeft in plaats van een totaal.
Voorbeeld 2, De meest recente swing high vinden (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 2De achterwaartse scan stopt bij de eerste swing high die in aanmerking komt. Zonder BREAK zou de loop doorgaan en het resultaat overschrijven met oudere, minder relevante swings.
Voorbeeld 3, Een zoekopdracht beperken met 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")De WHILE-loop zoekt tot 50 bars terug naar een volumepiek, en BREAK beëindigt de zoektocht zodra er een is gevonden.
Veelvoorkomende fouten en valkuilen
- Alleen geldig binnen loops. BREAK buiten een FOR- of WHILE-body compileert niet. Het kan niet worden gebruikt om de rest van de berekening van een bar over te slaan; herstructureer in plaats daarvan met IF-blokken.
- Alleen de binnenste loop wordt verlaten. Bij geneste loops verlaat BREAK de loop die er direct omheen zit. Meerdere niveaus verlaten vereist een flag die door de buitenste loop wordt gecontroleerd.
- Toestand na de loop. Variabelen houden de waarden die ze hadden toen BREAK afging, en de FOR-teller bereikt zijn eindwaarde niet. Ga er niet van uit dat de teller na een vroegtijdige uitstap gelijk is aan de loopgrens.
- Kosten voor de leesbaarheid. Meerdere BREAK-statements verspreid door één loop maken het besturingsverloop moeilijk te volgen. Geef de voorkeur aan één duidelijk becommentarieerde uitstapvoorwaarde.
Gerelateerde instructies
FOR, getelde loop die BREAK vroegtijdig kan verlaten.WHILE, voorwaardelijke loop die BREAK vroegtijdig kan verlaten.DO, optioneel keyword dat een loopbody opent.NEXT, sluit een FOR-loop af; na een BREAK gaat de uitvoering erna verder.TO, oplopende bereikaanduiding in FOR-loops.DOWNTO, aflopende bereikaanduiding in FOR-loops.WEND, sluit een WHILE-loop af; na een BREAK gaat de uitvoering erna verder.IF, voorwaardelijk blok dat normaal gesproken een BREAK omsluit.