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

DO

DO markeert in ProBuilder het begin van de loop-body in FOR- en WHILE-instructies. Het is optioneel, voert geen bewerking uit en bestaat om loops leesbaar te maken.

Syntaxis

probuilder
FOR variable = start TO end DO
  // actions executed on each iteration
NEXT

In een WHILE-loop:

probuilder
WHILE condition DO
  // actions executed while the condition is true
WEND

Hoe het werkt

DO is een structureel keyword. Het staat tussen de lusdeclaratie, hetzij FOR variable = start TO end of WHILE condition, en de statements die bij elke iteratie worden uitgevoerd. De compiler accepteert loops met of zonder; de uitvoering is in beide gevallen identiek. Het doel is leesbaarheid, door precies te markeren waar de loopheader eindigt en de body begint.

In een FOR-loop wordt de body tussen DO en NEXT één keer uitgevoerd voor elke waarde van de teller, oplopend met TO of aflopend met DOWNTO. In een WHILE-loop herhaalt de body tussen DO en WEND zich zolang de voorwaarde waar is, waarbij de voorwaarde voor elke doorloop opnieuw wordt getest.

Loops worden volledig uitgevoerd op elke bar van de grafiek of backtest, dus een loop die honderden bars doorloopt, voert die scan opnieuw uit op elke nieuwe bar. BREAK verlaat de omliggende loop vroegtijdig, wat het aantal iteraties beperkt wanneer de resterende doorlopen het resultaat niet meer kunnen veranderen.

Voorbeelden

Voorbeeld 1, Opeenvolgende dalende bars tellen (Indicator)

probuilder
Value = 0
FOR i = 1 TO 20 DO
  // Stop counting at the first bar that is not a down bar
  IF (Close[i] < Open[i]) THEN
    Value = Value + 1
  ELSE
    BREAK
  ENDIF
NEXT
RETURN Value

De loop loopt terug door de vorige 20 bars en telt hoeveel er onder hun open sloten, en stopt bij de eerste bar die dat niet deed. DO scheidt de loop-header van de tellogica.

Voorbeeld 2, Opeenvolgende stijgende bars met een WHILE-loop (ProScreener)

probuilder
i = 0
count = 0
// Walk backward while each bar closed above its open
WHILE (close[i] > open[i]) AND (i < 100) DO
  count = count + 1
  i = i + 1
WEND
SCREENER[count >= 3] (count AS "up bars in a row")

De WHILE-loop telt de huidige reeks stijgende bars, begrensd op 100 iteraties, en de screener selecteert instrumenten met een reeks van drie of meer.

Voorbeeld 3, Filter voor volatiliteitspieken (ProBacktest)

probuilder
total = 0
// Sum the range of the previous 10 completed bars
FOR i = 1 TO 10 DO
  total = total + Range[i]
NEXT
avgRange = total / 10

// Enter when the current bar's range doubles the recent average
IF Range > 2 * avgRange AND NOT ONMARKET THEN
  BUY 1 CONTRACT AT MARKET
ENDIF

Een FOR-loop met DO accumuleert de ranges van de laatste tien bars om een gemiddelde te bouwen, dat vervolgens de instapvoorwaarde bepaalt.

Veelvoorkomende fouten en valkuilen

  • Verkeerd afsluitend keyword. FOR-loops eindigen met NEXT en WHILE-loops eindigen met WEND. FOR combineren met WEND, of WHILE met NEXT, is een compilatiefout, zelfs wanneer DO aanwezig is.
  • DO op een eigen regel. DO hoort aan het einde van de regel met de loop-header. Het op een aparte regel plaatsen, of het voor elke instructie herhalen, compileert niet.
  • Oneindige WHILE-loops. DO beschermt niet tegen een voorwaarde die nooit onwaar wordt. Een WHILE-body moet iets wijzigen waarvan de voorwaarde afhangt, of een harde limiet op het aantal iteraties bevatten, anders loopt het script vast.
  • Aannemen dat DO verplicht is. DO weglaten is toegestaan, dus de afwezigheid ervan in bestaande code is geen bug. Gemengde stijlen binnen één script compileren prima, maar schaden de leesbaarheid.
  • FOR, getelde loop waarvan DO de body inleidt.
  • NEXT, sluit een FOR-loop af en zet de teller vooruit.
  • TO, oplopende richting van de teller in een FOR-header.
  • DOWNTO, aflopende richting van de teller in een FOR-header.
  • WHILE, door een voorwaarde gestuurde loop die ook DO accepteert.
  • WEND, sluit een WHILE-lus af.
  • BREAK, verlaat de omsluitende loop voordat deze klaar is.
  • IF, conditionele logica die vaak in loop-bodies wordt genest.