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

ELSIF

ELSIF in ProBuilder test een nieuwe voorwaarde wanneer de voorgaande IF-voorwaarde mislukt, waardoor één blok meerdere uitsluitende voorwaarden in strikte volgorde kan controleren.

Syntaxis

probuilder
IF (condition1) THEN
  // runs when condition1 is true
ELSIF (condition2) THEN
  // runs when condition1 is false and condition2 is true
ELSE
  // runs when no condition matched
ENDIF

Hoe het werkt

Voorwaarden in een IF/ELSIF-keten worden van boven naar beneden geëvalueerd. De eerste die waar is wint: zijn blok wordt uitgevoerd en elke resterende tak, inclusief ELSE, wordt overgeslagen. Als geen van de voorwaarden waar is, wordt het ELSE-blok uitgevoerd indien aanwezig, anders doet het hele statement niets.

Een IF-statement kan een willekeurig aantal ELSIF-takken bevatten, elk met zijn eigen voorwaarde en zijn eigen THEN. Dit levert een platte meerwegvertakking op die makkelijker te lezen is dan de equivalente geneste IF-statements, en er is slechts één ENDIF nodig.

De volgorde is van belang. Omdat de evaluatie stopt bij de eerste match, overschaduwen bredere voorwaarden die vroeg staan de nauwere die later komen. Zet de meest specifieke tests eerst.

Voorbeelden

Voorbeeld 1, Een oscillator in drie toestanden scoren (Indicator)

probuilder
myDPO = DPO[21](typicalprice)
IF (myDPO < 0) THEN
  // negative oscillator lowers the score
  result = result - 1
ELSIF (myDPO > 0) THEN
  // positive oscillator raises the score
  result = result + 1
ELSE
  // exactly zero leaves the score unchanged
  result = result
ENDIF
RETURN result
COLOURED(124,252,0)

De ELSIF-tak wordt alleen bereikt wanneer de Detrended Price Oscillator niet negatief is. Een positieve waarde verhoogt de lopende score, een waarde van precies nul valt door naar ELSE.

Voorbeeld 2, RSI-zonefilter (ProScreener)

probuilder
r = RSI[14](close)
// map the RSI reading onto three zones
IF r < 30 THEN
  zone = -1
ELSIF r > 70 THEN
  zone = 1
ELSE
  zone = 0
ENDIF
SCREENER[zone <> 0] (r AS "RSI 14")

Elk instrument valt in precies één zone. De screener houdt alleen de oversold- en overbought-gevallen over en toont de ruwe RSI-waarde.

Voorbeeld 3, Trendregime met gegradeerde position size (ProOrder)

probuilder
DEFPARAM CumulateOrders = false
fast = Average[20](close)
slow = Average[50](close)
// grade the trend from strong to absent
IF fast > slow AND close > fast THEN
  size = 2
ELSIF fast > slow THEN
  size = 1
ELSE
  size = 0
ENDIF
IF size > 0 AND NOT onmarket THEN
  BUY size CONTRACT AT MARKET
ENDIF

Het specifieke geval, koers boven een stijgende stapel gemiddelden, wordt vóór het bredere getest. Het omwisselen van de twee takken zou het sterke-trendblok onbereikbaar maken.

Veelvoorkomende fouten en valkuilen

  • Ontbrekende THEN na de ELSIF-voorwaarde. Elke ELSIF vereist zijn eigen THEN, net als IF. ELSIF (a > b) op een eigen regel zonder THEN compileert niet.
  • Het als ELSEIF spellen. Het sleutelwoord is ELSIF, met één E. Varianten uit andere talen, zoals ELSEIF of ELIF, worden door de compiler afgewezen.
  • Onbereikbare takken. De evaluatie stopt bij de eerste ware conditie. Een vroege brede test zoals r > 50 voorkomt een latere r > 70 tak ooit wordt uitgevoerd, zonder waarschuwing.
  • ELSIF na ELSE geplaatst. ELSE must be the final branch. Any ELSIF following it is a syntax error, so keep the chain in the order IF, ELSIF, ELSE, ENDIF.
  • IF, opent de voorwaardelijke keten.
  • ELSE, onvoorwaardelijke terugvaloptie na alle ELSIF-takken.
  • ENDIF, sluit de hele keten, één per IF ongeacht het aantal takken.
  • THEN, vereist na elke IF- en ELSIF-voorwaarde.
  • AND, bouwt samengestelde voorwaarden binnen een taktest.
  • OR, alternatieve voorwaarden binnen een taktest.