Recordando una variable

Si eres un programador novato de PineScript, te habrás encontrado en la situación de necesitar recordar un valor durante los ciclos.

El gráfico dibuja las barras de izquierda a derecha y desde el principio (o en un momento determinado), podemos asignar un valor a una variable (aunque no sea dibujada en el gráfico) y mantener su recuerdo a lo largo del tiempo.

Para recordar un valor entre una barra y la siguiente es necesario copiar el valor anterior en la variable actual.

variable = variable[1]

La primera barra no tiene una barra previa. Entonces, para asignar un primer valor debes utilizar la función nz( ) que detecta si una variable está sin inicializar (vacía) y de ser así, le asigna un valor inicial …

variable = nz(variable[1],23)

En este ejemplo, el valor inicial es 23. Esta variable siempre tendrá el valor 23 porque este código copia su valor desde la barra anterior.
Si necesitas asignar otro valor cuando se da una condición, entonces puedes usar este código…

variable = condition? new_value : nz(variable[1],23)

PineScripts.

El parámetro ‘precision’

Los comandos ‘study’ y ‘strategy’ tienen este parámetro.

Se trata del número de dígitos después del punto flotante para valores en el eje de precios. Tiene que ser un entero no negativo. La precisión 0 utiliza normas especiales para el formato de números muy largos (como el volumen, por ejemplo, ‘5482’ puede ser formateado como ‘5K’. Por defecto, el valor es 4.

Pero recuerda:

EL PARÁMETRO PRECISIÓN SIRVE SÓLO PARA MOSTRAR EL EJE DE PRECIOS EN EL GRÁFICO PERO NO AFECTA A LOS CÁLCULOS DEL SCRIPT.

Esto significa que los precios en coma flotante no serán son redondeados a los decimales dependiendo del parámetro «precision».

PineScripts.

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.ORG",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)