WHILE
WHILE-løkken i ProBuilder gjentar en kodeblokk så lenge en boolsk betingelse holder seg sann. Betingelsen testes før hvert gjennomløp, WEND avslutter løkken.
Syntaks
WHILE condition DO
// statements repeated while the condition is true
WENDSlik fungerer det
Før hvert gjennomløp evaluerer ProBuilder betingelsen. Hvis den er sann, kjøres blokken mellom DO og WEND, deretter returnerer kontrollen til WHILE-linjen og betingelsen testes på nytt. Hvis den er falsk, hopper kjøringen forbi WEND. Fordi testen skjer først, betyr en betingelse som er falsk ved inngangen at blokken aldri kjøres i det hele tatt.
Noe inne i løkken må til slutt gjøre betingelsen falsk. I motsetning til FOR har WHILE ingen innebygd teller, så skriptet har ansvaret for å oppdatere det betingelsen avhenger av. En betingelse som aldri kan bli falsk gir en uendelig løkke, som ProRealTime™ avbryter med en kjøringsfeil i stedet for å la plattformen henge.
Hele løkken kjøres på nytt på hver bar i diagrammet. WHILE egner seg for åpne søk, som å gå bakover gjennom barer til et mønster brytes, der et FOR-intervall ville være enten sløsing eller ukjent.
Eksempler
Eksempel 1, Telling av iterasjoner (Indikator)
i = 0
count = 0
WHILE i <> 11 DO
// advance the counter until it reaches 11
i = i + 1
count = count + 1
WEND
RETURN countLøkken kjører så lenge i er forskjellig fra 11. Hver gjennomgang øker begge variablene, så løkken avsluttes etter 11 iterasjoner og indikatoren returnerer 11.
Eksempel 2, Måling av en rekke med lukkinger opp (ProScreener)
n = 0
// walk backward while each close is above the previous one
WHILE close[n] > close[n + 1] AND n < 100 DO
n = n + 1
WEND
SCREENER[n >= 3] (n AS "Up streak")Løkken teller sammenhengende stigende slutkurser og stopper ved den første baren som bryter rekken. Den n < 100 grense garanterer terminering selv i en uvanlig lang trend.
Eksempel 3, Posisjonsstørrelse innenfor et risikobudsjett (ProOrder)
DEFPARAM CumulateOrders = false
maxRisk = 400
size = 1
// double the position size while the risk budget allows it
WHILE (size * 2) * AverageTrueRange[14](close) <= maxRisk DO
size = size * 2
WEND
IF close CROSSES OVER Average[50](close) AND NOT onmarket THEN
BUY size CONTRACT AT MARKET
ENDIFLøkken øker position size geometrisk til én dobling mer ville overskride risikobudsjettet, og deretter handler strategien den størrelsen.
Vanlige feil og fallgruver
- Uendelige løkker. Hvis ingenting inne i blokken endrer betingelsen, avsluttes løkken aldri, og ProRealTime™ stopper skriptet med en feil. Legg til en eksplisitt sikkerhetsgrense, for eksempel en maksimal tellerverdi, på enhver betingelse som styres av markedsdata.
- Null iterasjoner. Betingelsen evalueres før det første gjennomløpet. Når den er falsk ved inngangen, hoppes blokken helt over, og variabler som bare tilordnes inne i løkken beholder sine tidligere verdier.
- Manglende WEND. Hver WHILE trenger en avsluttende WEND. Kompilatorfeilen kan peke nedenfor den faktiske løkken, så sjekk par når meldingen virker feilplassert.
- Utgangsbetingelser basert på likhet. En betingelse som
i <> 11blir aldri false hvisigår forbi 11 uten å treffe det, for eksempel ved økning med 2. Sammenligninger med<eller>er tryggere utgangstester enn<>.
Relaterte instruksjoner
WEND, avslutter en WHILE-blokk og returnerer kontrollen til betingelsen.DO, nøkkelord som avslutter et WHILE- eller FOR-hode.FOR, tellerdrevet løkke for et kjent antall gjennomløp.NEXT, avslutter en FOR-blokk.BREAK, går ut av den gjeldende løkken umiddelbart.IF, betinget kjøring uten gjentakelse.THEN, påkrevd mellom en IF-betingelse og blokken.ENDIF, avslutter en IF-blokk.