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

FOR

De FOR-loop in ProBuilder herhaalt een codeblok een vast aantal keren, oplopend met TO of aflopend met DOWNTO. Elk FOR-blok wordt afgesloten met NEXT.

Syntaxis

probuilder
FOR variable = start TO end DO
  // commands repeated on each pass
NEXT

Omlaag tellen:

probuilder
FOR variable = start DOWNTO end DO
  // commands repeated on each pass
NEXT

Hoe het werkt

Op elke bar initialiseert de loop de tellervariabele op de startwaarde, voert het blok uit en verhoogt de teller vervolgens met 1 (TO) of verlaagt die met 1 (DOWNTO). Wanneer de teller de eindwaarde voorbijgaat, gaat de uitvoering verder na NEXT. Het sleutelwoord DO is optioneel in huidige ProRealTime™-versies, maar het behouden ervan verbetert de leesbaarheid.

De teller is een normale variabele en wordt vaak als bar-offset gebruikt, dus close[i] binnen een loop leest de slotkoers i bars terug. Daarmee is FOR het standaardgereedschap om te sommeren, te scannen of te tekenen over een reeks historische bars.

Loops kunnen genest worden. De hele loop draait opnieuw op elke bar van de grafiek, dus een loop van 100 doorlopen op een grafiek met 10,000 bars voert een miljoen iteraties uit. Houd bereiken zo klein als de berekening toelaat en gebruik BREAK om vroegtijdig te stoppen zodra het resultaat bekend is.

Voorbeelden

Voorbeeld 1, Som van openingskoersen over een reeks bars (Indicator)

probuilder
a = 0
FOR i = 10 TO 20 DO
  // add the open of each bar in the range to the running total
  a = open[i] + a
NEXT
RETURN a AS "Sum of Opens"

De teller i loopt van baroffset 10 naar baroffset 20 en telt elke openingsprijs op in a, die wordt teruggegeven zodra de lus klaar is.

Voorbeeld 2, Bullish bars tellen in een venster (ProScreener)

probuilder
count = 0
FOR i = 0 TO 19 DO
  // count the bars that closed above their open
  IF close[i] > open[i] THEN
    count = count + 1
  ENDIF
NEXT
SCREENER[count >= 15] (count AS "Bullish bars")

De loop bekijkt de laatste 20 bars en de screener toont instrumenten waarbij er minstens 15 hoger sloten dan ze openden.

Voorbeeld 3, Achterwaartse scan met DOWNTO (ProOrder)

probuilder
// find the most recent bar that matches the 50-bar high
hh = highest[50](high)
found = 50
FOR i = 50 DOWNTO 0 DO
  IF high[i] = hh THEN
    found = i
  ENDIF
NEXT
// enter only if the high was printed within the last 5 bars
IF found <= 5 AND NOT onmarket THEN
  BUY 1 CONTRACT AT MARKET
ENDIF

DOWNTO scant van de oudste offset richting de huidige bar, waardoor found op de meest recente offset waar de 50-bar high werd gezet.

Veelvoorkomende fouten en valkuilen

  • Ontbrekende NEXT. Elke FOR heeft een bijbehorende NEXT nodig. Bij geneste loops kan de compiler de fout ver van de loop melden die werkelijk niet is afgesloten, dus match de paren van binnen naar buiten.
  • Start voorbij eind. A FOR i = 10 TO 5 lus wordt nooit uitgevoerd, en ook niet FOR i = 5 DOWNTO 10. Het richtingskeyword moet overeenkomen met de richting van het bereik, anders wordt het blok stilzwijgend overgeslagen.
  • De teller binnen de loop aanpassen. Het opnieuw toewijzen van de loopvariabele binnen het blok verstoort de automatische verhoging en kan overgeslagen doorlopen of onverwacht verlaten van de loop veroorzaken. Gebruik een aparte variabele voor tussenliggende berekeningen.
  • Prestaties bij grote bereiken. De loop wordt op elke bar opnieuw uitgevoerd, dus grote bereiken lopen snel op. Gebruik liever ingebouwde functies zoals summation of highest wanneer die bestaat, en stap vroeg uit met BREAK wanneer het antwoord gevonden is.
  • TO, opwaartse bereikscheider binnen een FOR-header.
  • DOWNTO, neerwaartse bereikscheider binnen een FOR-header.
  • NEXT, sluit een FOR-blok en start de volgende doorloop.
  • DO, optioneel sleutelwoord dat een FOR- of WHILE-header afsluit.
  • BREAK, verlaat de huidige lus voordat het bereik is uitgeput.
  • WHILE, door een voorwaarde gestuurde lus voor een onbekend aantal doorlopen.
  • WEND, sluit een WHILE-blok.
  • BarIndex, barteller die nuttig is om lusbereiken te begrenzen.