ELSIF
ELSIF en ProBuilder evalúa una nueva condición cuando falla la condición IF precedente, lo que permite que un mismo bloque compruebe varias condiciones exclusivas en secuencia estricta.
Sintaxis
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
ENDIFCómo funciona
Las condiciones de una cadena IF/ELSIF se evalúan de arriba abajo. La primera que es verdadera gana: su bloque se ejecuta y todas las ramas restantes, incluida ELSE, se omiten. Cuando ninguna de las condiciones es verdadera, se ejecuta el bloque ELSE si existe, y en caso contrario la instrucción completa no hace nada.
Una instrucción IF puede llevar cualquier número de ramas ELSIF, cada una con su propia condición y su propio THEN. Esto produce una bifurcación plana de varias vías que es más fácil de leer que las instrucciones IF anidadas equivalentes, y solo necesita un único ENDIF.
El orden importa. Como la evaluación se detiene en la primera coincidencia, las condiciones más amplias colocadas al principio ocultarán las más específicas colocadas después. Pon primero los tests más específicos.
Ejemplos
Ejemplo 1, Puntuar un oscilador en tres estados (Indicador)
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 rama ELSIF solo se alcanza cuando el Detrended Price Oscillator no es negativo. Una lectura positiva incrementa la puntuación acumulada, una lectura de exactamente cero pasa a ELSE.
Ejemplo 2, Filtro de zonas del RSI (ProScreener)
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")Cada instrumento cae en exactamente una zona. El screener conserva solo los casos de sobreventa y de sobrecompra y muestra el valor bruto del RSI.
Ejemplo 3, Régimen de tendencia con position size graduado (ProOrder)
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
ENDIFEl caso específico, precio por encima de un conjunto de medias ascendentes, se evalúa antes que el más amplio. Invertir las dos ramas haría inalcanzable el bloque de tendencia fuerte.
Errores y trampas habituales
- Falta THEN tras la condición ELSIF. Cada ELSIF requiere su propio THEN, exactamente igual que IF.
ELSIF (a > b)en su propia línea sin THEN no compila. - Escribirlo ELSEIF. La palabra clave es ELSIF, con una sola E. El compilador rechaza las variantes de otros lenguajes, como ELSEIF o ELIF.
- Ramas inalcanzables. La evaluación se detiene en la primera condición verdadera. Una prueba amplia situada al principio, como
r > 50impide un posteriorr > 70rama se ejecute nunca, sin ningún aviso. - ELSIF colocado después de 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.
Instrucciones relacionadas
IF, abre la cadena condicional.ELSE, alternativa incondicional tras todas las ramas ELSIF.ENDIF, cierra toda la cadena, uno por IF sea cual sea el número de ramas.THEN, obligatorio tras cada condición IF y ELSIF.AND, construye condiciones compuestas dentro del test de una rama.OR, condiciones alternativas dentro del test de una rama.