DO
DO i ProBuilder markerar början på loopkroppen i FOR- och WHILE-satser. Det är valfritt, utför ingen operation och finns för att göra loopar läsbara.
Syntax
FOR variable = start TO end DO
// actions executed on each iteration
NEXTI en WHILE-loop:
WHILE condition DO
// actions executed while the condition is true
WENDSå fungerar det
DO är ett strukturellt nyckelord. Det står mellan loopdeklarationen, antingen FOR variable = start TO end eller WHILE condition, och de satser som körs vid varje iteration. Kompilatorn accepterar loopar med eller utan den; exekveringen är identisk i båda fallen. Dess syfte är läsbarhet, att markera exakt var loopens huvud slutar och kroppen börjar.
I en FOR-loop körs kroppen mellan DO och NEXT en gång för varje värde på räknaren, uppåt med TO eller nedåt med DOWNTO. I en WHILE-loop upprepas kroppen mellan DO och WEND så länge villkoret utvärderas till sant, och villkoret testas om före varje genomgång.
Loopar körs i sin helhet på varje bar i diagrammet eller backtestet, så en loop som skannar hundratals barer kör den skanningen igen på varje ny bar. BREAK avslutar den omslutande loopen i förtid, vilket håller nere antalet iterationer när de återstående genomgångarna inte kan ändra resultatet.
Exempel
Exempel 1, Räkna sammanhängande fallande barer (Indikator)
Value = 0
FOR i = 1 TO 20 DO
// Stop counting at the first bar that is not a down bar
IF (Close[i] < Open[i]) THEN
Value = Value + 1
ELSE
BREAK
ENDIF
NEXT
RETURN ValueLoopen går tillbaka genom de föregående 20 barerna och räknar hur många som stängde under sin öppning, och stannar vid den första bar som inte gjorde det. DO skiljer loopens huvud från räknelogiken.
Exempel 2, Sammanhängande stigande barer med en WHILE-loop (ProScreener)
i = 0
count = 0
// Walk backward while each bar closed above its open
WHILE (close[i] > open[i]) AND (i < 100) DO
count = count + 1
i = i + 1
WEND
SCREENER[count >= 3] (count AS "up bars in a row")WHILE-loopen räknar den pågående serien av stigande barer, begränsad till 100 iterationer, och screenern matchar instrument med en serie på tre eller fler.
Exempel 3, Volatilitetsspikfilter (ProBacktest)
total = 0
// Sum the range of the previous 10 completed bars
FOR i = 1 TO 10 DO
total = total + Range[i]
NEXT
avgRange = total / 10
// Enter when the current bar's range doubles the recent average
IF Range > 2 * avgRange AND NOT ONMARKET THEN
BUY 1 CONTRACT AT MARKET
ENDIFEn FOR-loop med DO ackumulerar intervallen för de senaste tio barerna för att bygga ett medelvärde, som sedan styr entryvillkoret.
Vanliga fel och fallgropar
- Fel avslutande nyckelord. FOR-loopar avslutas med NEXT och WHILE-loopar avslutas med WEND. Att kombinera FOR med WEND, eller WHILE med NEXT, är ett kompileringsfel även när DO finns med.
- DO på en egen rad. DO hör till i slutet av loopens rubrikrad. Att placera det på en separat rad, eller upprepa det före varje sats, kompilerar inte.
- Oändliga WHILE-loopar. DO skyddar inte mot ett villkor som aldrig blir falskt. En WHILE-kropp måste ändra något som villkoret beror på, eller innehålla ett hårt iterationstak, annars hänger skriptet.
- Att anta att DO är obligatoriskt. Att utesluta DO är tillåtet, så dess frånvaro i befintlig kod är inte ett fel. Blandade stilar i ett och samma skript kompilerar utan problem men försämrar läsbarheten.
Relaterade instruktioner
FOR, räknad loop vars kropp DO inleder.NEXT, avslutar en FOR-loop och stegar fram räknaren.TO, stigande räknarriktning i en FOR-rubrik.DOWNTO, fallande räknarriktning i en FOR-rubrik.WHILE, villkorsstyrd loop som också godtar DO.WEND, avslutar en WHILE-loop.BREAK, avbryter den omslutande loopen innan den är klar.IF, villkorslogik som ofta nästlas inuti loopkroppar.