Bli medlem i dag
Instruksjoner/probuilder · probacktest · proorder · proscreener

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

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

Slik 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)

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)

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)

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")

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)

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

Det 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 > 50 hindrer en senere r > 70 grenen 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.
  • IF, åpner den betingede kjeden.
  • ELSE, ubetinget reservegren etter alle ELSIF-grener.
  • ENDIF, lukker hele kjeden, én per IF uansett antall grener.
  • THEN, påkrevd etter hver IF- og ELSIF-betingelse.
  • AND, bygger sammensatte betingelser inne i en grentest.
  • OR, alternative betingelser inne i en grentest.