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

WHILE

WHILE-loopen i ProBuilder repeterar ett kodblock så länge ett booleskt villkor förblir sant. Villkoret testas före varje varv, WEND avslutar loopen.

Syntax

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

Så fungerar det

Före varje varv utvärderar ProBuilder villkoret. Om det är sant körs blocket mellan DO och WEND, sedan återgår kontrollen till WHILE-raden och villkoret testas igen. Om det är falskt hoppar exekveringen förbi WEND. Eftersom testet sker först innebär ett villkor som är falskt vid ingången att blocket aldrig körs alls.

Något inuti loopen måste förr eller senare göra villkoret falskt. Till skillnad från FOR har WHILE ingen inbyggd räknare, så skriptet ansvarar för att uppdatera det som villkoret beror på. Ett villkor som aldrig kan bli falskt ger en oändlig loop, som ProRealTime™ avbryter med ett exekveringsfel i stället för att låta plattformen hänga sig.

Hela loopen körs om på varje bar i diagrammet. WHILE passar för öppna genomsökningar, till exempel att gå bakåt genom barer till dess att ett mönster bryts, där ett FOR-intervall antingen skulle vara slöseri eller okänt.

Exempel

Exempel 1, Räkna iterationer (Indikator)

probuilder
i = 0
count = 0
WHILE i <> 11 DO
  // advance the counter until it reaches 11
  i = i + 1
  count = count + 1
WEND
RETURN count

Loopen körs så länge i skiljer sig från 11. Varje varv ökar båda variablerna, så loopen avslutas efter 11 iterationer och indikatorn returnerar 11.

Exempel 2, Mäta en serie av uppåtcloser (ProScreener)

probuilder
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")

Loopen räknar stigande stängningar i följd och stannar vid den första baren som bryter serien. Den n < 100 gränsen garanterar avslut även i en ovanligt lång trend.

Exempel 3, Bestämma position size inom en riskbudget (ProOrder)

probuilder
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
ENDIF

Loopen ökar position size geometriskt till dess att ytterligare en dubblering skulle överskrida riskbudgeten, sedan handlar strategin den storleken.

Vanliga fel och fallgropar

  • Oändliga loopar. Om inget inuti blocket ändrar villkoret avslutas loopen aldrig och ProRealTime™ stoppar skriptet med ett fel. Lägg till en explicit säkerhetsgräns, till exempel ett maximalt räknarvärde, till varje villkor som styrs av marknadsdata.
  • Noll iterationer. Villkoret utvärderas före det första varvet. När det är falskt vid ingången hoppas blocket över helt, och variabler som bara tilldelas inuti loopen behåller sina tidigare värden.
  • WEND saknas. Varje WHILE behöver ett avslutande WEND. Kompilatorfelet kan peka nedanför den faktiska loopen, så kontrollera paren när meddelandet verkar felplacerat.
  • Utgångsvillkor baserade på likhet. Ett villkor som i <> 11 blir aldrig falskt om i stegar förbi 11 utan att landa på det, till exempel vid ökning med 2. Jämförelser med < eller > är säkrare exittester än <>.
  • WEND, avslutar ett WHILE-block och returnerar kontrollen till villkoret.
  • DO, nyckelord som avslutar ett WHILE- eller FOR-huvud.
  • FOR, räknardriven loop för ett känt antal varv.
  • NEXT, avslutar ett FOR-block.
  • BREAK, lämnar den aktuella loopen omedelbart.
  • IF, villkorlig exekvering utan repetition.
  • THEN, krävs mellan ett IF-villkor och dess block.
  • ENDIF, avslutar ett IF-block.