Bli medlem idag
Instruktioner/probuilder · probacktest · proorder · proscreener

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

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

Så 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)

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

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

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)

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 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 > 50 förhindrar en senare r > 70 grenen 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.
  • IF, öppnar den villkorliga kedjan.
  • ELSE, villkorslös reservgren efter alla ELSIF-grenar.
  • ENDIF, avslutar hela kedjan, en per IF oavsett antal grenar.
  • THEN, krävs efter varje IF- och ELSIF-villkor.
  • AND, bygger sammansatta villkor inne i ett grentest.
  • OR, alternativa villkor inne i ett grentest.