0

BLOQUES: funciones de usuario y comandos ‘if’ y ‘for’

Esta no es una web de referencia para la programación en Pine (para más información visite Manual de Referencia y Tutorial PineScript)

Algunas instrucciones necesitan utilizar más de una línea de código, estos elementos funcionan como un bloque de comandos.
Las funciones pueden ser definidas como una sola línea o tener múltiples líneas también.
Los comandos “for” e “if” siempre tienen varias líneas de código (igual que las funciones multilíneas)
Los bloques de comandos se definen añadiendo un margen (un tabulador o 4 espacios) por cada nivel.
Cuando se combinan varias instrucciones “if” y “for” (o se utilizan dentro de una función de usuario) hay que añadir tabuladores por cada nivel de anidamiento separando los diferentes bloques de comandos.
Ejemplo de la estructura …
comandos del script
comandos del script
FunciónDeUsuario(param1,param2)=>
····comandos de la función
····var1=if close>open
········comandos del bloque if
········comandos del bloque if
········var2=for c=1 to 10 by 1
············comandos del bloque for
············comandos del bloque for
············valor para asignar a var2
········comandos del bloque if
········valor para asignar a var1 si la condición es verdadera
····else
········comandos del bloque if
········valor para asignar a var1 si la condición es falsa
····comandos de la función
····valor de respuesta de la función
comandos del script
comandos del script

Como puedes observar, los bloques se definen incluyendo un tabulador (4 espacios) o varios tabuladores (4 + 4 + 4 … espacios) anidados en base al número de niveles de los bloques.
Los bloques de instrucciones pueden reconocer variables declaradas fuera de ellos pero las variables definidas en su interior son locales (no pueden ser leídas en el resto del script)

SOBRE LA INSTRUCCIÓN ‘IF’
No puede tener comandos después de su definición en la primera línea.
La palabra “else” tiene que estar al mismo nivel de margen que la declaración “if” y no puede tener otros comandos en la misma línea.
La variable consigue su valor de la última línea tabulada del bloque (o de la última línea tabulada de cada sub-bloque “else”, dependiendo del resultado de la condición)
variable=if [condición]
····comandos si verdadero
····comandos si verdadero
····valor de retorno si verdadero
else
····comandos si falso
····comandos si falso
····valor de retorno si falso

SOBRE LA INSTRUCCIÓN ‘FOR’
La primera línea sólo puede albergar la configuración del bucle.
La variable usada para el contador de bucle no puede modificarse.
Se pueden incluir instrucciones “break” o “continue” para manipular las condiciones del bucle de manera interactiva.
La variable consigue su valor de la última línea tabulada del bloque.
variable=for [inicialización del contador] to [límite] by [valor incremental]
····comandos del bucle
····comandos del bucle
····continue
····comandos del bucle
····comandos del bucle
····break
····comandos del bucle
····valor de retorno

SOBRE LAS FUNCIONES DE USUARIO
Recuerda que las funciones deben situarse en la parte superior del script (siempre antes de ser llamadas).
No puedes declarar funciones dentro de otras funciones, esto no está permitido.
La definición de las funciones de usuario no pueden tener otros comandos antes (en la misma línea).
El compilador entiende que es una función multilínea cuando (en la primera línea) no hay nada después del símbolo ‘=>’
La función devuelve el valor de la última línea tabulada del bloque.
UserFunction(param1,param2)=>
····commands of function
····commands of function
····commands of function
····return value

EJEMPLO REAL
Aquí tienes un simple código mezclando todas las instrucciones de bloque…
//@version=2
study("WWW.PINESCRIPTS.COM",overlay=false)
myFun(param)=>
    v=for f=1 to param by 1
        if close[f]>close
            break
        f
plot(myFun(100), style=columns)

IMPORTANTE
Si sueles separar expresiones en varias líneas deberás recordar no incluir márgenes con tabuladores o con espacios en cantidad múltiple de 4, porque el intérprete puede confundirlos con bloques de comandos y devolver error. Puedes separar una expresión en varias líneas así:
// esto funciona bien
a=close>open?
  1:
  0
plot(a)

…pero el compilador devolverá error si incluyes un margen de separación de un tabulador o de 4 espacios (o múltiplo de 4):
// esto resulta error
a=close>open?
    1:
    0
plot(a)

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *