ELSIF
ELSIF i ProBuilder testar ett nytt villkor när det föregående IF-villkoret misslyckas, vilket låter ett block kontrollera flera uteslutande villkor i strikt ordning.
Syntax
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
ENDIFSå fungerar det
Villkor i en IF/ELSIF-kedja utvärderas från topp till botten. Det första som är sant vinner: dess block körs och alla återstående grenar, inklusive ELSE, hoppas över. När inget av villkoren är sant körs ELSE-blocket om det finns, annars gör hela satsen ingenting.
En IF-sats kan bära hur många ELSIF-grenar som helst, var och en med sitt eget villkor och sitt eget THEN. Detta ger en platt flervägsgren som är lättare att läsa än motsvarande nästlade IF-satser, och den behöver bara ett enda ENDIF.
Ordningen spelar roll. Eftersom utvärderingen stoppar vid den första träffen skymmer bredare villkor som placeras tidigt smalare villkor som placeras senare. Placera de mest specifika testen först.
Exempel
Exempel 1, Poängsätta en oscillator i tre tillstånd (Indikator)
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)ELSIF-grenen nås bara när Detrended Price Oscillator inte är negativ. Ett positivt värde ökar den löpande poängen, ett värde på exakt noll faller igenom till ELSE.
Exempel 2, RSI-zonfilter (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")Varje instrument hamnar i exakt en zon. Screenern behåller bara de översålda och överköpta fallen och visar det råa RSI-värdet.
Exempel 3, Trendregim med graderad 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
ENDIFDet specifika fallet, pris över en stigande medelvärdesstapel, testas före det bredare. Att byta plats på de två grenarna skulle göra blocket för stark trend onåbart.
Vanliga fel och fallgropar
- Saknat THEN efter ELSIF-villkoret. Varje ELSIF kräver sitt eget THEN, precis som IF.
ELSIF (a > b)på en egen rad utan THEN kompilerar inte. - Att stava det ELSEIF. Nyckelordet är ELSIF, med ett E. Varianter från andra språk, som ELSEIF eller ELIF, avvisas av kompilatorn.
- Onåbara grenar. Utvärderingen stannar vid det första sanna villkoret. Ett tidigt brett test som
r > 50förhindrar en senarer > 70grenen från att någonsin köras, utan varning. - ELSIF placerat efter ELSE. 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.