FOR
FOR-loopen i ProBuilder upprepar ett kodblock ett bestämt antal gånger och räknar uppåt med TO eller nedåt med DOWNTO. Varje FOR-block avslutas med NEXT.
Syntax
FOR variable = start TO end DO
// commands repeated on each pass
NEXTRäkna nedåt:
FOR variable = start DOWNTO end DO
// commands repeated on each pass
NEXTSå fungerar det
På varje bar initierar loopen räknarvariabeln till startvärdet, kör blocket och ökar sedan räknaren med 1 (TO) eller minskar den med 1 (DOWNTO). När räknaren passerar slutvärdet fortsätter körningen efter NEXT. Nyckelordet DO är valfritt i nuvarande ProRealTime™-versioner men att behålla det förbättrar läsbarheten.
Räknaren är en vanlig variabel och används ofta som barförskjutning, så close[i] inuti en loop läser stängningspriset i barer bakåt. Det gör FOR till standardverktyget för att summera, söka igenom eller rita över ett intervall av historiska barer.
Loopar kan nästlas. Hela loopen körs igen på varje bar i diagrammet, så en loop med 100 genomlöp på ett diagram med 10,000 barer utför en miljon iterationer. Håll intervallen så små som beräkningen tillåter och använd BREAK för att avbryta tidigt när resultatet är känt.
Exempel
Exempel 1, Summa av öppningspriser över ett bar-intervall (Indikator)
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"Räknaren i går från baroffset 10 till baroffset 20 och ackumulerar varje öppningspris i a, som returneras när loopen är klar.
Exempel 2, Räkna bullish barer i ett fönster (ProScreener)
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")Loopen granskar de senaste 20 barerna och screenern listar instrument där minst 15 av dem stängde högre än de öppnade.
Exempel 3, Bakåtriktad skanning med DOWNTO (ProOrder)
// 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
ENDIFDOWNTO skannar från den äldsta förskjutningen mot den aktuella baren, vilket lämnar found vid den senaste offset där 50-barshögsta sattes.
Vanliga fel och fallgropar
- Saknad NEXT. Varje FOR behöver ett matchande NEXT. Med nästlade loopar kan kompilatorn flagga felet långt från den loop som faktiskt är oavslutad, så matcha paren inifrån och ut.
- Start bortom slut. A
FOR i = 10 TO 5loopen körs aldrig, och inte hellerFOR i = 5 DOWNTO 10. Riktningsnyckelordet måste stämma med intervallets riktning, annars hoppas blocket över utan varning. - Att ändra räknaren inuti loopen. Att tilldela loopvariabeln ett nytt värde inuti blocket stör den automatiska ökningen och kan ge överhoppade genomlöp eller oväntade avbrott. Använd en separat variabel för mellanliggande beräkningar.
- Prestanda vid stora intervall. Loopen körs om på varje bar, så breda intervall växer snabbt. Föredra inbyggda funktioner som
summationellerhighestnär en sådan finns, och avbryt tidigt med BREAK när svaret är hittat.
Relaterade instruktioner
TO, uppåtriktad intervallseparator inne i ett FOR-huvud.DOWNTO, nedåtriktad intervallseparator inne i ett FOR-huvud.NEXT, avslutar ett FOR-block och utlöser nästa varv.DO, valfritt nyckelord som avslutar ett FOR- eller WHILE-huvud.BREAK, avslutar den aktuella loopen innan intervallet är uttömt.WHILE, villkorsstyrd loop för ett okänt antal varv.WEND, avslutar ett WHILE-block.BarIndex, bar-räknare som är användbar för att avgränsa loopintervall.