Rejoignez-nous
Instructions/probuilder · probacktest · proorder · proscreener

ELSIF

ELSIF en ProBuilder teste une nouvelle condition lorsque la condition IF précédente échoue, ce qui permet à un même bloc de vérifier plusieurs conditions exclusives en séquence stricte.

Syntaxe

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

Comment ça marche

Les conditions d'une chaîne IF/ELSIF sont évaluées de haut en bas. La première qui est vraie l'emporte : son bloc s'exécute et toutes les branches restantes, y compris ELSE, sont ignorées. Lorsque aucune des conditions n'est vraie, le bloc ELSE s'exécute s'il est présent, sinon l'instruction entière ne fait rien.

Une instruction IF peut porter un nombre quelconque de branches ELSIF, chacune avec sa propre condition et son propre THEN. Cela produit un branchement multiple à plat, plus facile à lire que les instructions IF imbriquées équivalentes, et il ne faut qu'un seul ENDIF.

L'ordre compte. Comme l'évaluation s'arrête à la première correspondance, des conditions larges placées tôt masqueront des conditions plus étroites placées plus tard. Placez les tests les plus spécifiques en premier.

Exemples

Exemple 1, Noter un oscillateur en trois états (Indicateur)

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)

La branche ELSIF n'est atteinte que lorsque le Detrended Price Oscillator n'est pas négatif. Une lecture positive incrémente le score cumulé, une lecture exactement nulle retombe sur ELSE.

Exemple 2, Filtre de zone RSI (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")

Chaque instrument tombe dans exactement une zone. Le screener ne conserve que les cas de survente et de surachat et affiche la valeur brute du RSI.

Exemple 3, Régime de tendance avec position size graduée (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

Le cas spécifique, le prix au-dessus d'un empilement de moyennes haussières, est testé avant le cas plus large. Inverser les deux branches rendrait le bloc de tendance forte inatteignable.

Erreurs et pièges courants

  • THEN manquant après la condition ELSIF. Chaque ELSIF exige son propre THEN, exactement comme IF. ELSIF (a > b) seul sur sa ligne sans THEN ne compile pas.
  • L'écrire ELSEIF. Le mot-clé est ELSIF, avec un seul E. Les variantes issues d'autres langages, comme ELSEIF ou ELIF, sont rejetées par le compilateur.
  • Branches inatteignables. L'évaluation s'arrête à la première condition vraie. Un test large placé tôt, tel que r > 50 empêche un futur r > 70 branche de jamais s'exécuter, sans aucun avertissement.
  • ELSIF placé après 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, ouvre la chaîne conditionnelle.
  • ELSE, branche de repli inconditionnelle après toutes les branches ELSIF.
  • ENDIF, ferme toute la chaîne, un par IF quel que soit le nombre de branches.
  • THEN, requis après chaque condition IF et ELSIF.
  • AND, construit des conditions composées à l'intérieur d'un test de branche.
  • OR, conditions alternatives à l'intérieur d'un test de branche.