ELSIF
ELSIF i ProBuilder tester en ny betingelse når den foregående IF-betingelsen feiler, slik at én blokk kan sjekke flere utelukkende betingelser i streng rekkefølge.
Syntaks
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
ENDIFSlik fungerer det
Betingelser i en IF/ELSIF-kjede evalueres fra øverst til nederst. Den første som er sann vinner: dens blokk kjøres og alle gjenstående grener, inkludert ELSE, hoppes over. Når ingen av betingelsene er sanne, kjøres ELSE-blokken hvis den finnes, ellers gjør hele setningen ingenting.
En IF-setning kan bære et vilkårlig antall ELSIF-grener, hver med sin egen betingelse og sin egen THEN. Dette gir en flat forgrening i flere retninger som er lettere å lese enn de tilsvarende nøstede IF-setningene, og den trenger bare én ENDIF.
Rekkefølgen betyr noe. Fordi evalueringen stopper ved første treff, vil bredere betingelser plassert tidlig skygge for smalere betingelser plassert senere. Sett de mest spesifikke testene først.
Eksempler
Eksempel 1, Poengsetting av en oscillator i tre tilstander (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 bare når Detrended Price Oscillator ikke er negativ. En positiv verdi øker den løpende poengsummen, en verdi på nøyaktig null faller gjennom til ELSE.
Eksempel 2, RSI-sonefilter (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")Hvert instrument havner i nøyaktig én sone. Screeneren beholder bare de oversolgte og overkjøpte tilfellene og viser den rå RSI-verdien.
Eksempel 3, Trendregime med gradert 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 spesifikke tilfellet, pris over en stigende stabel av gjennomsnitt, testes før det bredere. Å bytte om på de to grenene ville gjøre blokken for sterk trend uoppnåelig.
Vanlige feil og fallgruver
- Manglende THEN etter ELSIF-betingelsen. Hver ELSIF krever sin egen THEN, akkurat som IF.
ELSIF (a > b)på egen linje uten THEN kompilerer ikke. - Å stave det ELSEIF. Nøkkelordet er ELSIF, med én E. Varianter fra andre språk, som ELSEIF eller ELIF, avvises av kompilatoren.
- Uoppnåelige grener. Evalueringen stopper ved den første sanne betingelsen. En tidlig bred test som
r > 50hindrer en senerer > 70grenen fra noen gang å kjøre, uten advarsel. - ELSIF plassert etter 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.