Novedades de Pine: cambios en las funciones, mejor gestión de las cadenas y mucho más!

Dec 23, 2021

El equipo de Pine ha seguido trabajando duro desde el lanzamiento de la quinta versión para seguir mejorando el producto. Estas son algunas de las novedades más destacadas que se han introducido en los últimos dos meses.

Variaciones de la función

Las variaciones de una función («function overloads») pueden definirse en una biblioteca o incluirse en un script. Se representan con el mismo nombre que la función original, pero establecen un enfoque diferente según la cantidad o el tipo de parámetros. Son especialmente útiles dentro de las bibliotecas, donde es obligatorio especificar el tipo de parámetro.

En el siguiente indicador, por ejemplo, identificamos una variante de la función mult() que acepta tres argumentos:

//@version=5
indicator("Function overload")

// Dos parámetros
mult(x1, x2) =>
    x1 * x2

// Tres parámetros
mult(x1, x2, x3) =>
    x1 * x2 * x3

plot(mult(7, 4))
plot(mult(7, 4, 2))

En este otro caso, se definen otras variantes que actúan de forma diferente según el tipo de parámetro utilizado. Nota: si el número de parámetros de la variante es el mismo que el de la función original, el tipo de parámetro debe hacerse explícito, como se muestra a continuación:

//@version=5
indicator("Function overload")

// Acepta tanto valores 'int' como 'float', ya que cualquier 'int' puede transformarse automáticamente en 'float'.
mult(float x1, float x2) =>
    x1 * x2

// Devuelve un valor 'bool' en lugar de un número
mult(bool x1, bool x2) =>
    x1 and x2 ? true : false

mult(string x1, string x2) =>
    str.tonumber(x1) * str.tonumber(x2)

// Tiene tres parámetros, por lo que no es necesario especificar la tipología
mult(x1, x2, x3) =>
    x1 * x2 * x3

plot(mult(7, 4))
plot(mult(7.5, 4.2))
plot(mult(true, false) ? 1 : 0)
plot(mult("5", "6"))
plot(mult(7, 4, 2))

for…in

La iteración de un array con for requiere cuidado, ya que siempre hay que evitar entrar en un bucle vacío e iterar fuera de los índices del array.

Con la fórmula for…in, esto es mucho más fácil. La sintaxis es intuitiva: for array_element in array_id repite la ejecución en todos los elementos de array_id desde el índice cero, asignando el valor a la variable array_element durante cada iteración. Esto significa que es imposible que se produzcan errores por las razones expuestas anteriormente, y que incluso se pueden añadir/eliminar elementos durante la ejecución del bucle.

En el siguiente script, utilizamos for…in para encontrar el mayor número de la matriz a1:

//@version=5
indicator("For...in cycle")
var int[] a1 = array.from(1, 3, 6, 3, 8, 0, -9, 5)

highest(array) =>
    var int highestNum = na
    for element in array
        if na(highestNum) or element > highestNum
            highestNum := element
    highestNum

plot(highest(a1))

Nuevas funciones para la manipulación de cadenas

Estas nuevas funciones proporcionan métodos adicionales para procesar cadenas, e introducen expresiones regulares en Pine. A diferencia de las funciones de cadena definidas por el usuario que utilizan matrices, éstas pueden devolver valores en formato «simple», lo que permite, por ejemplo, la creación de argumentos de symbol para la función request.security().

str.contains(source, str)

Determina si la cadena source contiene la subcadena str. Por ejemplo, puede comprobar si el gráfico actual es un futuro continuo buscando la partícula «!» en la variable incorporada syminfo.tickerid (ticket del símbolo):

var isContinuous = str.contains(syminfo.tickerid, "!")  
plot(isContinuous ? 1 : 0)

str.pos(source, str)

Devuelve la posición de la subcadena str dentro de la cadena source.

str.substring(source, begin_pos, end_pos)

Extrae la subcadena de la cadena source. En el ejemplo, str.substring() y str.pos() se utilizan para recuperar la subcadena «AAPL» de la cadena de entrada s:

s = input.string("Time to sell some NASDAQ:AAPL") 
pos = str.pos(s, ":")  // Obtener la posición del carácter ":"
tkr = str.substring(s, pos + 1) // "AAPL"

str.replace(source, target, replacement, occurrence)

A diferencia de la función existente str.replace_all(), str.replace() permite la sustitución selectiva de una subcadena por otra. En el ejemplo siguiente, el prefijo «FTX» se sustituye por «BINANCE» en el primer símbolo de la cadena de difusión:

var source = "FTX:BTCUSD / FTX:BTCEUR"
// Sustituya la primera aparición de "FTX" por la cadena "BINANCE".
var newSource = str.replace(source, "FTX",  "BINANCE", 0)

str.lower(source) and str.upper(source)

Convierte todas las letras de la cadena source en minúsculas o mayúsculas:

s = str.lower("Time to Sell Some AAPL") // hora de vender algo de aapl
s = str.upper("Time to Sell Some AAPL") // HORA DE VENDER ALGO DE AAPL

str.startswith(source, str) and str.endswith(source, str)

Determina si la cadena source comienza o termina con la subcadena str.

str.match(source, regex)

Extrae la subcadena correspondiente a la expresión regular especificada. Por ejemplo, con el regex [\\w]+:[\\w]+ es posible encontrar y devolver el nombre del símbolo de la cadena de referencia “It’s time to sell some NASDAQ:AAPL!”:

s = "It's time to sell some NASDAQ:AAPL!"
var string tickerId = str.match(s, "[\\w]+:[\\w]+") //"NASDAQ:AAPL"

Conversión de divisas

Muchas funciones pertenecientes al dominio request.* pueden ahora convertir los valores a devolver en otra divisa. Si se especifica el argumento currency en la llamada a la función, los valores de precio devueltos se convierten de la divisa de origen a la divisa especificada. El argumento currency está disponible en las siguientes funciones:

Cuadros de texto

¡El objeto cuadro disponible con Pine ahora soporta cadenas de texto! Sólo tiene que añadir el argumento text  en la función box.new() y se mostrará dentro del cuadro. Puede ajustar las características del texto configurando los parámetros text_size, text_color, text_valign y text_halign en el momento de la creación, o bien posteriormente mediante las siguientes funciones con referencia a el cuadro en cuestión:

Como ejemplo de esta funcionalidad, a continuación se muestra el indicador integrado Multi-Time Period Charts modificado para mostrar el número de la semana y los valores máximos y mínimos resaltados:

Para mantenerse informado sobre las nuevas características de Pine, eche un vistazo a las Notas de la versión. También puede seguir la cuenta de PineCoders para obtener muchas actualizaciones (los mismos autores también dirigen el canal de Telegram de Squawk Box, Twitter y el chat público de Pine Script en TradingView).

Esperamos que estas funciones le resulten útiles a la hora de desarrollar nuevas soluciones. Estamos deseando leer sus comentarios y sugerencias.

Look first Then leap

TradingView está hecho para usted, asegúrese de aprovechar al máximo nuestras increíbles funciones
Abrir gráfico