Word nu lid
Instructies/probuilder · probacktest · proorder · proscreener

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

probuilder
BREAK

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

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

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

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

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

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

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