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

ELSE

ELSE in ProBuilder runs an alternative block of code when the preceding IF condition is false. Each IF statement accepts a single ELSE branch before ENDIF.

Syntaxe

probuilder
IF (condition) THEN
  // statements when the condition is true
ELSE
  // statements when the condition is false
ENDIF

Comment ça marche

Une instruction IF seule exécute son bloc ou ne fait rien. L'ajout de ELSE en fait un branchement à deux voies : exactement un des deux blocs s'exécute sur chaque bar, jamais les deux et jamais aucun. L'exécution se poursuit ensuite après ENDIF, quelle que soit la branche exécutée.

ELSE cannot stand alone. It must appear inside an IF block, after the THEN block and any ELSIF branches, and before ENDIF. Each IF statement accepts at most one ELSE, and it must be the final branch. When several conditions need to be tested in order, chain them with ELSIF and reserve ELSE for the case where none of them matched.

Parce qu'une branche s'exécute toujours, un couple IF/ELSE est la manière idiomatique de garantir qu'une variable reçoit une valeur sur chaque bar, en évitant les valeurs obsolètes reportées des bars précédentes.

Exemples

Exemple 1, Classer la bar en cours (Indicateur)

probuilder
// compare the current high with the previous bar's high
IF (High > High[1]) THEN
  result = 1
ELSE
  result = -1
ENDIF
RETURN result

Lorsque le haut actuel dépasse le haut précédent, result vaut 1 ; dans tous les autres cas, la branche ELSE la fixe à -1. La variable reçoit à coup sûr une nouvelle valeur à chaque barre.

Exemple 2, Noter au-dessus ou en dessous d'une moyenne mobile (ProScreener)

probuilder
ma = Average[200](close)
// score the instrument by its position relative to the average
IF close > ma THEN
  score = (close - ma) / ma * 100
ELSE
  score = 0
ENDIF
SCREENER[score > 5] (score AS "Percent above MA")

Les instruments qui cotent au-dessus de la moyenne à 200 périodes reçoivent un score en pourcentage, la branche ELSE met tout le reste à zéro afin que la condition du screener reste propre.

Exemple 3, Choisir une distance de stop selon le régime (ProOrder)

probuilder
DEFPARAM CumulateOrders = false
atr = AverageTrueRange[14](close)
// widen the stop in volatile conditions, tighten it otherwise
IF atr > Average[100](atr) THEN
  stopDist = 3 * atr
ELSE
  stopDist = 1.5 * atr
ENDIF
IF close CROSSES OVER Average[50](close) AND NOT onmarket THEN
  BUY 1 CONTRACT AT MARKET
  SET STOP pLOSS stopDist
ENDIF

La branche ELSE fournit la distance de stop par défaut chaque fois que le test de volatilité échoue, donc stopDist est défini avant que la logique d'entrée ne l'utilise.

Erreurs et pièges courants

  • ELSE without a matching IF. ELSE is only valid between an IF ... THEN block and its ENDIF. A stray ELSE, or one separated from its IF by a misplaced ENDIF, fails to compile.
  • Plusieurs branches ELSE. Chaque instruction IF accepte au maximum un ELSE. Les cas mutuellement exclusifs supplémentaires doivent figurer dans des branches ELSIF placées avant le ELSE.
  • ELSE with its own condition. ELSE takes no condition and no THEN. Writing ELSE (condition) THEN est une erreur de syntaxe, la forme conditionnelle est ELSIF.
  • Mauvais appariement des branches dans les blocs imbriqués. Dans des instructions IF imbriquées, ELSE se rattache au IF non fermé le plus proche. L'oubli d'un ENDIF interne rattache silencieusement le ELSE à la mauvaise condition, ce qui compile mais se branche incorrectement.
  • IF, ouvre le bloc conditionnel que ELSE prolonge.
  • ELSIF, branches alternatives conditionnelles testées avant ELSE.
  • ENDIF, ferme le bloc IF/ELSE.
  • THEN, requis après les conditions IF et ELSIF, jamais après ELSE.
  • AND, combine des conditions à l'intérieur du test IF.
  • OR, conditions alternatives à l'intérieur du test IF.
  • NOT, nie une condition.