Únete hoy
Instrucciones/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.

Sintaxis

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

Cómo funciona

Una instrucción IF por sí sola ejecuta su bloque o no hace nada. Añadir ELSE la convierte en una bifurcación de dos vías: exactamente uno de los dos bloques se ejecuta en cada bar, nunca los dos y nunca ninguno. La ejecución continúa después de ENDIF sea cual sea la rama que se haya ejecutado.

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.

Como siempre se ejecuta una rama, un par IF/ELSE es la forma idiomática de garantizar que una variable reciba un valor en cada bar, evitando valores obsoletos arrastrados de bars anteriores.

Ejemplos

Ejemplo 1, Clasificar el bar actual (Indicador)

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

Cuando el máximo actual supera el máximo anterior, result es 1, en todos los demás casos la rama ELSE lo fija en -1. La variable tiene garantizado un valor nuevo en cada bar.

Ejemplo 2, Puntuar por encima o por debajo de una media móvil (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")

Los instrumentos que cotizan por encima de la media de 200 periodos reciben una puntuación porcentual, la rama ELSE pone a cero todo lo demás para que la condición del screener se mantenga limpia.

Ejemplo 3, Elegir una distancia de stop según el régimen (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 rama ELSE aporta la distancia de stop por defecto cuando la prueba de volatilidad falla, así que stopDist está definido antes de que la lógica de entrada lo use.

Errores y trampas habituales

  • 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.
  • Varias ramas ELSE. Cada instrucción IF acepta como máximo un ELSE. Los casos mutuamente excluyentes adicionales deben ir en ramas ELSIF colocadas antes del ELSE.
  • ELSE with its own condition. ELSE takes no condition and no THEN. Writing ELSE (condition) THEN es un error de sintaxis, la forma condicional es ELSIF.
  • Emparejamiento incorrecto de ramas en bloques anidados. En instrucciones IF anidadas, ELSE se asocia al IF sin cerrar más cercano. Omitir un ENDIF interno vincula silenciosamente el ELSE a la condición equivocada, lo que compila pero bifurca de forma incorrecta.
  • IF, abre el bloque condicional que ELSE amplía.
  • ELSIF, ramas alternativas condicionales evaluadas antes de ELSE.
  • ENDIF, cierra el bloque IF/ELSE.
  • THEN, obligatorio tras las condiciones IF y ELSIF, nunca tras ELSE.
  • AND, combina condiciones dentro del test IF.
  • OR, condiciones alternativas dentro del test IF.
  • NOT, niega una condición.