Word nu lid
Instructies/probuilder · probacktest · proorder · proscreener

WHILE

De WHILE-lus in ProBuilder herhaalt een codeblok zolang een booleaanse voorwaarde waar blijft. De voorwaarde wordt vóór elke doorloop getest, WEND beëindigt de lus.

Syntaxis

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

Hoe het werkt

Vóór elke doorloop evalueert ProBuilder de voorwaarde. Als die waar is, wordt het blok tussen DO en WEND uitgevoerd, waarna de besturing terugkeert naar de WHILE-regel en de voorwaarde opnieuw wordt getest. Als die onwaar is, springt de uitvoering voorbij WEND. Omdat de test eerst plaatsvindt, betekent een voorwaarde die bij binnenkomst onwaar is dat het blok helemaal nooit loopt.

Iets binnen de lus moet de voorwaarde uiteindelijk onwaar maken. Anders dan FOR heeft WHILE geen ingebouwde teller, dus het script is verantwoordelijk voor het bijwerken van alles waarvan de voorwaarde afhangt. Een voorwaarde die nooit onwaar kan worden levert een oneindige lus op, die ProRealTime™ afbreekt met een uitvoeringsfout in plaats van het platform te laten vastlopen.

De hele lus loopt opnieuw op elke bar van de grafiek. WHILE past bij open zoekopdrachten, zoals achterwaarts door bars lopen tot een patroon doorbroken wordt, waar een FOR-bereik ofwel verspillend ofwel onbekend zou zijn.

Voorbeelden

Voorbeeld 1, Iteraties tellen (Indicator)

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

De lus loopt zolang i verschilt van 11. Elke doorloop verhoogt beide variabelen, dus de lus stopt na 11 iteraties en de indicator geeft 11.

Voorbeeld 2, Een reeks closes omhoog meten (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")

De loop telt opeenvolgende stijgende slotkoersen en stopt bij de eerste bar die de reeks doorbreekt. De n < 100 grens garandeert beëindiging zelfs in een ongewoon lange trend.

Voorbeeld 3, Een position size bepalen binnen een risicobudget (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

De lus laat de position size geometrisch groeien totdat nog één verdubbeling het risicobudget zou overschrijden, en dan traadt de strategie die grootte.

Veelvoorkomende fouten en valkuilen

  • Oneindige lussen. Als niets binnen het blok de voorwaarde verandert, eindigt de lus nooit en stopt ProRealTime™ het script met een foutmelding. Voeg aan elke voorwaarde die door marktdata wordt gestuurd een expliciete veiligheidsgrens toe, zoals een maximale tellerwaarde.
  • Nul iteraties. De voorwaarde wordt vóór de eerste doorloop geëvalueerd. Wanneer die bij binnenkomst onwaar is, wordt het blok volledig overgeslagen en houden variabelen die alleen binnen de lus worden toegekend hun eerdere waarden.
  • WEND ontbreekt. Elke WHILE heeft een afsluitende WEND nodig. De compilerfout kan onder de eigenlijke lus wijzen, dus controleer de paren wanneer de melding misplaatst lijkt.
  • Uitstapvoorwaarden op basis van gelijkheid. Een voorwaarde zoals i <> 11 wordt nooit false als i stapt voorbij 11 zonder erop te landen, bijvoorbeeld bij het verhogen met 2. Vergelijkingen met < of > zijn veiligere uitstaptests dan <>.
  • WEND, sluit een WHILE-blok af en geeft de besturing terug aan de voorwaarde.
  • DO, sleutelwoord dat een WHILE- of FOR-header afsluit.
  • FOR, door een teller gestuurde lus voor een bekend aantal doorlopen.
  • NEXT, sluit een FOR-blok af.
  • BREAK, verlaat de huidige lus onmiddellijk.
  • IF, conditionele uitvoering zonder herhaling.
  • THEN, vereist tussen een IF-voorwaarde en het bijbehorende blok.
  • ENDIF, sluit een IF-blok af.