NEXT
NEXT sluit in ProBuilder een FOR-lusblok af en stuurt de uitvoering terug naar de luskop totdat de teller zijn eindwaarde voorbij is. Elke FOR vereist één NEXT.
Syntaxis
FOR variable = start TO end DO
// statements executed on each iteration
NEXTHoe het werkt
Een FOR-lus in ProBuilder bestaat uit een kop, een blok en het afsluitende sleutelwoord NEXT. De kop kent een startwaarde toe aan de tellervariabele en declareert de eindwaarde met TO voor oplopende lussen of DOWNTO voor aflopende. Alles tussen DO en NEXT vormt het blok.
Elke keer dat de uitvoering NEXT bereikt, wordt de teller verhoogd (of met DOWNTO verlaagd) en vergeleken met de eindwaarde. Zit de teller nog binnen het bereik, dan springt de uitvoering terug naar het begin van het blok. Is hij de eindwaarde voorbij, dan gaat de uitvoering verder met de eerste instructie na NEXT. Beide grenzen horen erbij, dus FOR i = 10 TO 20 doorloopt elf iteraties.
NEXT is puur structureel, het neemt geen argumenten en levert geen waarde op. Elke FOR moet door precies één NEXT worden afgesloten, en geneste lussen vereisen één NEXT per FOR, waarbij van de binnenste lus naar buiten wordt afgesloten. Gebruik BREAK om een lus te verlaten voordat de teller is uitgeput; dat draagt de controle over aan de instructie die na de bijbehorende NEXT komt.
Omdat het hele script al één keer per bar wordt uitgevoerd, worden lussen die door NEXT worden afgesloten doorgaans gebruikt voor berekeningen over een reeks periodes of array-indices binnen één bar, niet om door de tijd te stappen.
Voorbeelden
Voorbeeld 1, Gemiddelden sommeren over een reeks periodes (Indicator)
a = 0
FOR i = 10 TO 20 DO
// accumulate the moving average of the open for each period length
a = average[i](open) + a
NEXT
RETURN a AS "compound averages direction"De lus loopt met i op 10 tot en met 20. NEXT verhoogt de teller en herhaalt de body, en na de laatste iteratie wordt de opgetelde som teruggegeven.
Voorbeeld 2, Bullish bars tellen in een venster (ProOrder)
// Count how many of the last 10 bars closed up
bullCount = 0
FOR k = 0 TO 9 DO
IF close[k] > open[k] THEN
bullCount = bullCount + 1
ENDIF
NEXT
IF bullCount >= 7 AND NOT onmarket THEN
BUY 1 CONTRACT AT MARKET
ENDIFHet blok tussen DO en NEXT bekijkt één historische bar per iteratie. Nadat NEXT de tiende doorloop heeft voltooid, voedt de telling de instapvoorwaarde.
Voorbeeld 3, Het gemiddelde nemen van een reeks closes (ProScreener)
// Mean close of the last 15 bars, computed manually
total = 0
FOR n = 0 TO 14 DO
total = total + close[n]
NEXT
meanClose = total / 15
SCREENER[close > meanClose * 1.02] (meanClose AS "15-bar mean")NEXT sluit de accumulatielus af, waarna het gemiddelde wordt vergeleken met de huidige close om instrumenten te filteren.
Veelvoorkomende fouten en valkuilen
- Ontbrekende of extra NEXT. Elke FOR heeft precies één NEXT nodig. Bij geneste lussen koppelt de compiler elke NEXT aan de dichtstbijzijnde open FOR, waardoor een ontbrekende NEXT vaak een foutmelding oplevert die enkele regels van de echte fout af ligt.
- De teller binnen het lusblok wijzigen. Het opnieuw toewijzen van de lusvariabele tussen DO en NEXT verandert hoeveel iteraties er resteren en kan lussen opleveren die nooit binnen de bar eindigen. Gebruik liever BREAK om vroegtijdig af te breken.
- Verkeerd richtingssleutelwoord.
FOR i = 20 TO 10komt nooit in de body omdat de teller de eindwaarde al overschrijdt. Aflopende reeksen vereisen DOWNTO in plaats van TO. - Zware lussen op elke bar. Het hele FOR...NEXT-blok wordt één keer per bar uitgevoerd. Grote bereiken in combinatie met zware aanroepen zoals
average[i]vermenigvuldigen de rekentijd over de hele grafiek.
Gerelateerde instructies
FOR, opent de getelde lus die NEXT afsluit.TO, declareert de oplopende eindwaarde van de lusteller.DOWNTO, declareert een aflopend lusbereik.DO, scheidt de luskop van het lusblok.BREAK, verlaat de lus voordat de teller is uitgeput.WHILE, alternatief voor een lus die door een voorwaarde wordt gestuurd.WEND, sluit een WHILE-lus af, de tegenhanger van NEXT.