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

TO

TO stelt de eindwaarde van een FOR-loopteller in ProBuilder in, zodat de loop van zijn startwaarde tot en met die limiet loopt, met één iteratie per waarde.

Syntaxis

probuilder
FOR variable = start_value TO end_value DO
  // code executed on each iteration
NEXT

Hoe het werkt

In de kop van een FOR-loop scheidt TO de startwaarde van de teller van de eindwaarde. De loop kent de startwaarde aan de teller toe, voert het blok uit, en elke doorgang door NEXT verhoogt de teller met één. Het itereren gaat door zolang de teller de waarde na TO niet is voorbijgegaan, en beide grenzen horen erbij, dus FOR i = 1 TO 20 wordt twintig keer uitgevoerd.

TO beschrijft altijd een oplopend bereik. Wanneer de startwaarde de eindwaarde al overschrijdt, wordt de body helemaal niet uitgevoerd en wordt de loop simpelweg overgeslagen. Aflopend tellen vereist het bijbehorende keyword DOWNTO, dat de teller in plaats daarvan verlaagt.

De eindwaarde kan een literal, een variabele of een expressie zijn, wat TO nuttig maakt voor data-afhankelijke bereiken zoals FOR i = 0 TO lastset($array) of venstergroottes afgeleid van een optimalisatievariabele. De expressie wordt geëvalueerd wanneer de lus start.

Omdat scripts al eenmaal per bar worden uitgevoerd, lopen TO-bereiken doorgaans over periodelengtes, historische bar-offsets of array-indices binnen de huidige bar in plaats van over de tijd.

Voorbeelden

Voorbeeld 1, Een ratio accumuleren over 20 bars (Indicator)

probuilder
// Sum the close/open ratio of the last 20 bars
total = 0
FOR x = 1 TO 20 DO
  total = total + close[x] / open[x]
NEXT
RETURN total AS "close/open sum"

TO zet de bovengrens vast op 20, zodat de body loopt voor x = 1 tot en met 20, waarbij per iteratie één historische bar wordt gelezen.

Voorbeeld 2, Variabele eindwaarde uit opgeslagen data (ProBacktest)

probuilder
// Record the range of each bar, then average all stored values
$ranges[max(0, lastset($ranges) + 1)] = high - low

sum = 0
n = lastset($ranges)
IF n >= 4 THEN
  FOR i = 0 TO n DO
    sum = sum + $ranges[i]
  NEXT
  avgRange = sum / (n + 1)
  IF high - low > avgRange * 2 AND NOT onmarket THEN
    BUY 1 CONTRACT AT MARKET
  ENDIF
ENDIF

SET STOP %LOSS 1.5

De waarde na TO is een expressie, waardoor de loop automatisch precies het gevulde deel van de array dekt terwijl die groeit.

Voorbeeld 3, Meerdere lookbacks scannen in één doorloop (ProScreener)

probuilder
// Count how many lookback windows show the close above its average
score = 0
FOR p = 10 TO 50 DO
  IF close > average[p](close) THEN
    score = score + 1
  ENDIF
NEXT

SCREENER[score >= 35] (score AS "Trend score")

TO beëindigt de doorloop bij periode 50, zodat de score 41 verschillende controles van voortschrijdende gemiddelden per instrument samenvoegt.

Veelvoorkomende fouten en valkuilen

  • Inclusieve limiet. De teller neemt de eindwaarde zelf aan, dus FOR i = 0 TO 9 voert tien iteraties uit, niet negen. Off-by-one-grenzen zijn de meest voorkomende loopfout.
  • Aflopend bereik met TO. FOR i = 20 TO 10 komt nooit in de lus terecht omdat de startwaarde de limiet al overschrijdt. Gebruik DOWNTO om af te tellen.
  • Eindwaarde die afhangt van de body van de loop. De limiet na TO staat vast wanneer de loop begint. Het wijzigen van de variabelen waaruit die is berekend binnen de body verlengt of verkort de iteratie niet.
  • Grote bereiken op elke bar. Het volledige bereik dat met TO is gezet, loopt één keer per bar over de hele grafiek. Brede bereiken rond kostbare aanroepen zoals average[p] de herberekening merkbaar vertragen.
  • FOR, opent de getelde loop waarvan TO het bereik bepaalt.
  • DOWNTO, declareert een aflopend bereik in plaats van een oplopend bereik.
  • DO, scheidt de header van de loop van de body van de loop.
  • NEXT, sluit de body van de loop af en verhoogt de teller.
  • BREAK, verlaat de loop voordat de teller de TO-limiet bereikt.
  • WHILE, door een voorwaarde gestuurde loop voor bereiken die niet vooraf bekend zijn.