Bli medlem idag
Instruktioner/probuilder · probacktest · proorder · proscreener

WEND

WEND markerar slutet på en WHILE-loop i ProBuilder. När exekveringen når WEND utvärderas loopvillkoret igen för att avgöra om den ska repeteras eller avslutas.

Syntax

probuilder
WHILE condition DO
  // statements repeated while the condition is true
WEND

Så fungerar det

WEND är inte en självständig instruktion. Den finns bara som avslutare av ett WHILE-block, på samma sätt som NEXT avslutar ett FOR-block och ENDIF avslutar ett IF-block. Allt mellan WHILE-huvudet och WEND utgör loopens kropp.

När exekveringen når WEND hoppar kontrollen tillbaka till WHILE-raden och villkoret testas igen. Ett sant resultat kör kroppen en gång till, ett falskt resultat flyttar exekveringen till den första satsen efter WEND. Villkoret kontrolleras därför en gång per varv, alltid i toppen, aldrig vid WEND självt, så en WHILE-loop kan inte bete sig som en do-while-loop som garanterar minst ett varv.

Ett skript med ett WHILE som saknar matchande WEND kompilerar inte. I nästlade loopar avslutar varje WEND det närmaste oavslutade WHILE ovanför sig.

Exempel

Exempel 1, Avsluta en räknande loop (Indikator)

probuilder
i = 0
Count = 0
WHILE i <> 11 DO
  // each pass advances the counter by one
  i = i + 1
  Count = Count + 1
WEND
RETURN Count

Varje gång exekveringen når WEND utvärderas villkoret i <> 11 testas igen. Efter 11 varv misslyckas testet, loopen avslutas vid WEND och indikatorn returnerar 11.

Exempel 2, Barer sedan den senaste nedåtclosen (ProScreener)

probuilder
n = 0
// step backward until a bar closed below its open
WHILE close[n] >= open[n] AND n < 50 DO
  n = n + 1
WEND
SCREENER[n >= 5] (n AS "Bars since down close")

WEND skickar kontrollen tillbaka till villkoret efter varje steg bakåt. Screenern listar instrument vars senaste 5 eller fler barer alla stängde på eller över sin open.

Exempel 3, Flytta en efterföljande nivå stegvis mot priset (ProOrder)

probuilder
DEFPARAM CumulateOrders = false
IF NOT onmarket AND close CROSSES OVER Average[20](close) THEN
  BUY 1 CONTRACT AT MARKET
ENDIF
// raise the stop level in fixed steps while it lags the market
step = AverageTrueRange[14](close)
stopLevel = positionprice - 2 * step
WHILE stopLevel + 3 * step < close DO
  stopLevel = stopLevel + step
WEND
IF onmarket THEN
  SELL AT stopLevel STOP
ENDIF

Loopen lyfter stoppnivån ett steg i taget. Varje varv slutar vid WEND, där avståndskontrollen avgör om ytterligare ett steg behövs.

Vanliga fel och fallgropar

  • WEND saknas. Varje WHILE kräver exakt ett WEND. Kompilatorn rapporterar ofta problemet i slutet av skriptet snarare än vid den oavslutade loopen, så räkna paren av WHILE och WEND när felets placering ser fel ut.
  • Att blanda ihop WEND med ENDIF eller NEXT. Varje blocktyp har sin egen avslutare. Att avsluta ett WHILE med ENDIF, eller ett IF med WEND, är ett syntaxfel även när indenteringen ser konsekvent ut.
  • Att förvänta sig ett test i botten. Villkoret utvärderas på WHILE-raden, inte vid WEND. Kod som förlitar sig på att kroppen körs minst en gång måste säkerställa att villkoret är sant innan loopen börjar.
  • Satser efter WEND inuti den avsedda loopen. Endast rader mellan WHILE och WEND repeteras. En sats som av misstag placeras efter WEND körs en gång per bar i stället för en gång per varv.
  • WHILE, inleder loopen som WEND avslutar.
  • DO, nyckelord som avslutar ett WHILE- eller FOR-huvud.
  • FOR, räknardriven loop som avslutas med NEXT.
  • NEXT, motsvarigheten till WEND för FOR.
  • BREAK, lämnar en loop utan att vänta på att villkoret blir falskt.
  • IF, villkorsblock som avslutas med ENDIF.