DOWNTO
DOWNTO laat in ProBuilder een FOR-loop aflopend tellen van een hogere startwaarde naar een lagere eindwaarde, waarbij bij elke doorloop van de loop met één wordt verlaagd.
Syntaxis
FOR variable = startValue DOWNTO endValue DO
// loop body
NEXTHoe het werkt
Een FOR-lus met DOWNTO start de teller op startValue en verlaagt hem na elke doorloop met één, waarbij de body wordt uitgevoerd voor elke waarde tot en met endValue. Het is de aflopende tegenhanger van TO, die oploopt.
Richting is van belang zodra de iteratievolgorde het resultaat beïnvloedt. Barverschuivingen in ProBuilder lopen op met de leeftijd, dus close[20] is ouder dan close[0]. Een lus geschreven FOR i = 20 DOWNTO 0 doorloopt daarom bars van oudste naar nieuwste, wat de natuurlijke volgorde is voor berekeningen die chronologisch een toestand opbouwen, zoals het bijhouden van de meest recente keer dat een gebeurtenis optrad of het opnieuw doorlopen van een reeks bars op tijdsvolgorde.
De startwaarde moet groter dan of gelijk aan de eindwaarde zijn. Als startValue is kleiner dan endValue, wordt de body nooit uitgevoerd en gaat het script na NEXT verder zonder enige fout. BREAK blijft binnen de body beschikbaar om de loop vroegtijdig te verlaten.
Voorbeelden
Voorbeeld 1, Dalende bars tellen van oudste naar nieuwste (Indicator)
Value = 0
// Scan from 20 bars back toward the current bar
FOR i = 20 DOWNTO 0 DO
IF (Close[i] < Open[i]) THEN
Value = Value + 1
ELSE
BREAK
ENDIF
NEXT
RETURN ValueDe teller loopt van 20 omlaag naar 0, dus de scan begint bij de oudste bar in het venster en beweegt naar het heden, en stopt bij de eerste bar die op of boven zijn open sloot.
Voorbeeld 2, Offset van de meest recente opwaartse gap (Indicator)
lastGap = -1
// Visit bars oldest first so the final assignment is the newest gap
FOR i = 50 DOWNTO 1 DO
IF low[i - 1] > high[i] THEN
lastGap = i - 1
ENDIF
NEXT
RETURN lastGap AS "bars since last up gap"Omdat DOWNTO eerst oudere bars verwerkt, overschrijft elke gevonden gap de vorige, zodat de offset van de meest recente gap achterblijft in lastGap wanneer de lus eindigt.
Voorbeeld 3, Chronologische momentum-score (ProOrder)
score = 0
// Compare each bar with the one before it, oldest pair first
FOR i = 10 DOWNTO 1 DO
IF close[i] > close[i + 1] THEN
score = score + 1
ELSE
score = score - 1
ENDIF
NEXT
IF score >= 8 AND NOT ONMARKET THEN
BUY 1 CONTRACT AT MARKET
ENDIFDe loop doorloopt de laatste tien veranderingen van bar tot bar in chronologische volgorde en saldeert stijgingen tegen dalingen. Een score van 8 of meer duidt op een aanhoudende stijging en activeert een long-instap.
Veelvoorkomende fouten en valkuilen
- Start kleiner dan eind.
FOR i = 0 DOWNTO 20voert nul iteraties uit. Er wordt geen fout opgeworpen, dus latere variabelen behouden stilzwijgend hun beginwaarden. Controleer of de grenzen in afnemende orde staan. - De richting verandert het resultaat. Loops die een variabele overschrijven bij een match, of die BREAK uitvoeren bij een voorwaarde, geven met DOWNTO andere antwoorden dan met TO. Kies de richting die past bij de bedoelde chronologie.
- Off-by-one aan de randen. Beide grenzen zijn inclusief.
FOR i = 20 DOWNTO 0loopt 21 keer. Verwijzen naarclose[i + 1]binnen de body reikt ook één bar verder dan het genoemde venster. - Geen aangepaste stapgrootte. De teller beweegt altijd met precies één. Om elke tweede waarde over te slaan is rekenwerk op de teller binnen de body nodig in plaats van een stapclausule.
Gerelateerde instructies
FOR, de getelde loop die DOWNTO aanpast.TO, de oplopende tegenhanger van DOWNTO.NEXT, sluit de FOR-loop af en verplaatst de teller.DO, optionele markering tussen de loop-header en de body.BREAK, verlaat de loop voordat de teller de eindwaarde bereikt.WHILE, voorwaardegestuurd alternatief wanneer het aantal iteraties onbekend is.WEND, sluit een WHILE-lus af.BarIndex, huidige barnummer, vaak gecombineerd met aflopende scans.