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
IF (condition) THEN
// statements when the condition is true
ELSE
// statements when the condition is false
ENDIFCó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)
// compare the current high with the previous bar's high
IF (High > High[1]) THEN
result = 1
ELSE
result = -1
ENDIF
RETURN resultCuando 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)
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)
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
ENDIFLa 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) THENes 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.
Instrucciones relacionadas
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.