Jetzt beitreten
Befehle/probuilder · probacktest · proorder · proscreener

ELSIF

ELSIF in ProBuilder prüft eine neue Bedingung, wenn die vorangehende IF-Bedingung fehlschlägt, sodass ein Block mehrere sich ausschließende Bedingungen in strenger Reihenfolge prüfen kann.

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

So funktioniert es

Bedingungen in einer IF/ELSIF-Kette werden von oben nach unten ausgewertet. Die erste wahre Bedingung gewinnt: ihr Block wird ausgeführt und alle übrigen Zweige, einschließlich ELSE, werden übersprungen. Wenn keine der Bedingungen wahr ist, läuft der ELSE-Block, sofern vorhanden, andernfalls tut die gesamte Anweisung nichts.

Eine IF-Anweisung kann beliebig viele ELSIF-Zweige enthalten, jeder mit seiner eigenen Bedingung und seinem eigenen THEN. Das ergibt eine flache Verzweigung mit mehreren Wegen, die leichter zu lesen ist als die entsprechenden verschachtelten IF-Anweisungen, und sie benötigt nur ein einziges ENDIF.

Die Reihenfolge ist wichtig. Da die Auswertung beim ersten Treffer endet, überdecken früh platzierte, breitere Bedingungen später platzierte, engere. Stellen Sie die spezifischsten Prüfungen an den Anfang.

Beispiele

Beispiel 1, Einen Oszillator in drei Zuständen bewerten (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)

Der ELSIF-Zweig wird nur erreicht, wenn der Detrended Price Oscillator nicht negativ ist. Ein positiver Wert erhöht die laufende Bewertung, ein Wert von genau null fällt zu ELSE durch.

Beispiel 2, RSI-Zonenfilter (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")

Jedes Instrument landet in genau einer Zone. Der Screener behält nur die überverkauften und überkauften Fälle und zeigt den rohen RSI-Wert an.

Beispiel 3, Trendregime mit gestaffelter 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

Der spezifische Fall, Preis über einem steigenden Durchschnittsstapel, wird vor dem allgemeineren geprüft. Ein Vertauschen der beiden Zweige würde den Block für den starken Trend unerreichbar machen.

Häufige Fehler und Stolperfallen

  • Fehlendes THEN nach der ELSIF-Bedingung. Jedes ELSIF benötigt sein eigenes THEN, genau wie IF. ELSIF (a > b) in einer eigenen Zeile ohne THEN lässt sich nicht kompilieren.
  • Die Schreibweise ELSEIF. Das Schlüsselwort ist ELSIF, mit einem E. Varianten aus anderen Sprachen wie ELSEIF oder ELIF werden vom Compiler abgelehnt.
  • Unerreichbare Zweige. Die Auswertung endet bei der ersten wahren Bedingung. Ein früher breiter Test wie r > 50 verhindert ein späteres r > 70 Zweig jemals ausgeführt wird, ohne Warnung.
  • ELSIF nach ELSE platziert. 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, öffnet die bedingte Kette.
  • ELSE, bedingungsloser Rückfall nach allen ELSIF-Zweigen.
  • ENDIF, schließt die gesamte Kette, eines pro IF unabhängig von der Anzahl der Zweige.
  • THEN, erforderlich nach jeder IF- und ELSIF-Bedingung.
  • AND, bildet zusammengesetzte Bedingungen innerhalb eines Zweigtests.
  • OR, alternative Bedingungen innerhalb eines Zweigtests.