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
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
ENDIFHoe 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)
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)
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)
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
ENDIFHet 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 > 50voorkomt een laterer > 70tak 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.
Gerelateerde instructies
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.