DOWNTO
DOWNTO i ProBuilder gör att en FOR-loop räknar nedåt från ett högre startvärde till ett lägre slutvärde, och minskar med ett för varje genomgång av loopen.
Syntax
FOR variable = startValue DOWNTO endValue DO
// loop body
NEXTSå fungerar det
En FOR-loop med DOWNTO startar räknaren på startValue och minskar det med ett efter varje varv, vilket kör kroppen för varje värde ner till och med endValue. Det är den nedåtgående motsvarigheten till TO, som räknar upp.
Riktningen spelar roll närhelst iterationsordningen påverkar resultatet. Barförskjutningar i ProBuilder växer med åldern, så close[20] är äldre än close[0]. En loop skriven FOR i = 20 DOWNTO 0 besöker därför barer från äldsta till nyaste, vilket är den naturliga ordningen för beräkningar som bygger upp tillstånd kronologiskt, som att hålla reda på den senaste förekomsten av en händelse eller spela upp en följd av barer i tidsordning.
Startvärdet måste vara större än eller lika med slutvärdet. Om startValue är mindre än endValue, körs kroppen aldrig och skriptet fortsätter efter NEXT utan något fel. BREAK är fortfarande tillgängligt inuti kroppen för att överge loopen tidigt.
Exempel
Exempel 1, Räkna fallande barer från äldst till nyast (Indikator)
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 ValueRäknaren går från 20 ned till 0, så skanningen börjar vid den äldsta baren i fönstret och rör sig mot nutiden, och stannar vid den första bar som stängde på eller över sin öppning.
Exempel 2, Offset för det senaste uppåtgapet (Indikator)
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"Eftersom DOWNTO behandlar äldre barer först skriver varje upptäckt gap över det föregående, så att det senaste gapets förskjutning hamnar i lastGap när loopen avslutas.
Exempel 3, Kronologisk momentum-poäng (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
ENDIFLoopen går igenom de senaste tio förändringarna från bar till bar i tidsordning och nettoräknar uppgångar mot nedgångar. En poäng på 8 eller mer indikerar en ihållande uppgång och utlöser en long-entry.
Vanliga fel och fallgropar
- Start mindre än slut.
FOR i = 0 DOWNTO 20utför noll iterationer. Inget fel genereras, så variabler längre ned behåller tyst sina ursprungliga värden. Verifiera att gränserna står i fallande ordning. - Riktningen ändrar resultatet. Loopar som skriver över en variabel vid träff, eller som använder BREAK vid ett villkor, ger andra svar med DOWNTO än med TO. Välj den riktning som matchar den avsedda kronologin.
- Ett fel på ett vid kanterna. Båda gränserna är inkluderande.
FOR i = 20 DOWNTO 0körs 21 gånger. Att referera tillclose[i + 1]inuti kroppen sträcker sig också en bar utanför det angivna fönstret. - Ingen egen stegstorlek. Räknaren flyttas alltid exakt ett steg. Att hoppa över varannat värde kräver aritmetik på räknaren inne i kroppen snarare än en stegklausul.
Relaterade instruktioner
FOR, den räknade loopen som DOWNTO modifierar.TO, den uppåtgående motsvarigheten till DOWNTO.NEXT, avslutar FOR-loopen och flyttar räknaren.DO, valfri markör mellan loopens huvud och kroppen.BREAK, avslutar loopen innan räknaren når slutvärdet.WHILE, villkorsstyrt alternativ när antalet iterationer är okänt.WEND, avslutar en WHILE-loop.BarIndex, det aktuella barens nummer, ofta använt tillsammans med nedåtgående skanningar.