¡Bienvenidos a Pine Script v5!

Oct 7, 2021

Es un gran día en TradingView: Pine ha sido actualizado a la v5. La nueva versión de nuestro lenguaje de programación, creada para que los traders e inversores puedan desarrollar sus propios indicadores y estrategias, trae consigo muchas características y mejoras. En este artículo, describiremos sólo algunas de las últimas incorporaciones; para más detalles, consulte nuestras Notas de la versión y la Guía de migración.

Convertidor v4 – v5

Aunque los scripts desarrollados con versiones anteriores de Pine seguirán funcionando sin problemas, hemos añadido una herramienta de conversión directamente en el Editor para facilitar la transición de la v4 a la v5. Esto se debe a que las futuras funciones desarrolladas de aquí en adelante sólo serán compatibles con la v5, por lo que le recomendamos que no se quede atrás. La opción de convertir un script v4 a v5 aparece en el menú desplegable en cuanto se carga en el Editor:

Tenga en cuenta que no todos los códigos v4 pueden convertirse automáticamente. Si encuentra algún problema o prefiere hacer la conversión manualmente, nuestra Guía de Migración le ayudará con toda la documentación necesaria.

Biblioteca

Una de las principales novedades de Pine v5 es la introducción de las bibliotecas. Una biblioteca es un nuevo tipo de publicación que permite compartir funciones personalizadas que luego pueden ser reutilizadas en otros scripts. Una vez publicada una biblioteca, otros scripts (indicadores, estrategias u otras bibliotecas) pueden importarla y ponerla en uso. La idea es incluir en este formato los algoritmos más complejos o las funciones más utilizadas para evitar redundancias innecesarias.

Para empezar a experimentar con las bibliotecas, eche un vistazo a la sección dedicada en la Guía del Usuario (ENG). A continuación incluiremos ejemplos de bibliotecas publicadas por algunos miembros del equipo de PineCoders. Para el resto, se incluirán todos en un feed separado aquí.

Valores por defecto de las funciones definidas por el usuario

Una nueva característica que va de la mano con la de las bibliotecas: se puede establecer un valor por defecto para los parámetros de las funciones definidas por el usuario, haciendo que la entrada del usuario sea a todos los efectos opcional. En el ejemplo siguiente, declaramos una función personalizada customPow() que eleva exp por potencia. Si no se especifica exp cuando se llama a la función, el valor utilizado es 2:

//@version=5
indicator("")
customPow(base, exp = 2) =>
    result = 1
    for i = 1 to exp
        result *= base
plot(customPow(11)) // 11^2
plot(customPow(11, 4)) // 11^4

Switch

La expresión switch tiene una sensación familiar con la expresión if. Especialmente si está acostumbrado a crear enormes encadenamientos de bloques if-else, apreciará la conveniencia y comodidad de utilizar switch. Básicamente, se trata de una estructura de control para distinguir los distintos casos correspondientes a los valores de una misma expresión (smoothingInput en el caso de abajo), y asignar una respuesta específica a cada uno. Puede encontrar más información en nuestro Manual.

En el ejemplo se puede ver que el indicador Average True Range utiliza ahora la declaración del switch para permitir que se utilicen varias formas de suavizado/alisado en el algoritmo de cálculo:

//@version=5
indicator(title="Average True Range", shorttitle="ATR", timeframe="")
lengthInput = input.int(title="Length", defval=14, minval=1)
smoothingInput = input.string(title="Smoothing", defval="RMA", options = ["RMA", "SMA", "EMA", "WMA"])

maFunction(source, length) =>
    switch smoothingInput
        "RMA" => ta.rma(source, length)
        "SMA" => ta.sma(source, length)
        "EMA" => ta.ema(source, length)
        => ta.wma(source, length)

plot(maFunction(ta.tr(true), lengthInput), title = "ATR", color=#B71C1C)

Gestión de dibujos

Una importante mejora en la gestión de dibujos de Pine: las nuevas matrices integradas (line.all, label.all, box.all y table.all) contienen los ID de todos los dibujos aplicados por su script.

Esto significa que ahora puede, por ejemplo, limitar el número de dibujos mostrados en el gráfico según un parámetro definido por el usuario. En el siguiente script, se dibuja una línea en cada nueva apertura (hasta un máximo de ~50, que es el límite por defecto del script para las líneas). A continuación, se comprueba si se ha superado el número de líneas permitido por el usuario y, en caso afirmativo, se elimina la línea más antigua:

//@version=5
indicator("Daily Open", overlay = true)

qtyOfLinesInput = input.int(10, "Draw only last n lines", minval = 0, maxval = 50)

if ta.change(time("1D"))
    line.new(bar_index, open, bar_index + 1, open, extend = extend.right)
    if array.size(line.all) > qtyOfLinesInput
        line.delete(array.get(line.all, 0))

While

Otra característica que llega a Pine v5 es la expresión while, que crea un bucle que continúa hasta que la condición es falsa o se utiliza el comando break.

Por ejemplo, el indicador que aparece a continuación calcula la diferencia entre el tiempo medio que se tarda en encontrar la cantidad de volumen alcista y bajista equivalente al volumen total de las últimas n barras en el pasado. Cuanto más atrás se encuentre el volumen alcista/bajista, el valor será más indicativo de largo/corto:

//@version=5
var int MAX_BARS_BACK = 500
indicator("Volume bias", max_bars_back = MAX_BARS_BACK)

int lookBackInput = input.int(20, "Volume Look Back (bars)", minval = 2, maxval = int(MAX_BARS_BACK / 4))

// Stop the script if the chart does not contain volume data.
bool noVol = na(volume) and nz(math.sum(nz(volume), 200) == 0, true)
if noVol
    runtime.error("No volume data.")

volumeBias(lookBack, maxLookBack) =>
    bool  barUp = ta.rising(close, 1)
    bool  barDn = ta.falling(close, 1)
    float upVolume = 0.
    float dnVolume = 0.
    float avgVolume = math.sum(nz(volume), lookBack)
    int[] upBarNos = array.new_int(0)
    int[] dnBarNos = array.new_int(0)
    int   bar = 1
    bool  volumeFound = false
    while (not volumeFound) and bar < maxLookBack
        if barUp[bar] and upVolume < avgVolume
            upVolume += nz(volume[bar])
            array.push(upBarNos, bar)
        else if barDn[bar] and dnVolume < avgVolume
            dnVolume += nz(volume[bar])
            array.push(dnBarNos, bar)
        bar += 1
        volumeFound := upVolume >= avgVolume and dnVolume >= avgVolume
    float volumeBias = bar >= maxLookBack ? na : array.avg(dnBarNos) - array.avg(upBarNos)

float bias = volumeBias(lookBackInput, MAX_BARS_BACK)
plot(bias, "Volume Bias", bias > 0 ? color.lime : color.fuchsia)
hline(0)

El bucle while en el script continúa hasta que encuentra el volumen requerido (ya sea alcista o bajista), siempre y cuando no haya superado el número máximo de barras permitido. El script también introduce otra nueva característica de Pine v5: runtime.error().

runtime.error()

La función runtime.error() permite detener la ejecución de un script y mostrar un mensaje de error tras cualquier condición que pueda definirse mediante Pine. Esto es muy útil para los creadores que quieren evitar que su guión se utilice de forma incorrecta. Si es necesario, también puede ser una herramienta de depuración no convencional, para terminar la ejecución de un script durante un bucle o dentro de una función.

Para utilizar la nueva función, basta con ejecutar runtime.error() cuando se cumplan las condiciones. Cuando se ejecute esta función, el script se colgará y mostrará un signo de exclamación junto a su nombre, y el mensaje especificado en el código aparecerá cuando el usuario haga clic en él.

El código siguiente representa el indicador VWAP con dos errores personalizados. La primera aparece cuando el símbolo no tiene datos de volumen, ya que, trivialmente, no se puede calcular el VWAP sin esos datos. La segunda ocurre cuando el marco temporal del gráfico es diario o superior, porque el indicador reinicia el cálculo con cada nuevo día y sería inútil en gráficos diarios o superiores.

//@version=5
indicator("VWAP with custom errors")
if na(volume) // Will be true on symbols with no volume data e.g. TVC:SPX
    runtime.error("There is no volume data for this symbol.")
else if timeframe.isdwm // Will be true on 1D and higher timeframes
    runtime.error("Session-based VWAP does not show meaningful data on timeframes >= 1D.
     Please switch to a lower timeframe.")
plot(ta.vwap)

Nuevos parámetros de estrategia

Buenas noticias para los desarrolladores de estrategia. Hemos añadido un montón de nuevas variables y funciones que le proporcionan información adicional sobre sus operaciones, con estadísticas y métricas que están siempre disponibles y se actualizan a medida que el emulador de brokers ejecuta las órdenes, para que pueda ver cómo se comporta su estrategia incluso mientras está en curso.

Haga clic aquí para ver una lista con enlaces para más detalles

strategy.closedtrades.entry_price() / strategy.opentrades.entry_price()

strategy.closedtrades.entry_bar_index() / strategy.opentrades.entry_bar_index()

strategy.closedtrades.entry_time() / strategy.opentrades.entry_time()

strategy.closedtrades.size() / strategy.opentrades.size()

strategy.closedtrades.profit() / strategy.opentrades.profit()

strategy.closedtrades.commission() / strategy.opentrades.commission()

strategy.closedtrades.max_runup() / strategy.opentrades.max_runup()

strategy.closedtrades.max_drawdown() / strategy.opentrades.max_drawdown()

strategy.closedtrades.exit_price()

strategy.closedtrades.exit_bar_index()

strategy.closedtrades.exit_time()

strategy.convert_to_account()

strategy.convert_to_symbol()

strategy.account_currency

 

Nomenclatura renovada

En las conversaciones con nuestra comunidad de desarrolladores de Pine, hemos comprobado que hay una gran satisfacción con todas las innovaciones que se han introducido en los últimos años. Nuestra intención es mantener este ritmo también en el futuro. Sin embargo, esto crea un flujo ininterrumpido de nuevas características y variables. Para mantener este crecimiento, necesitamos establecer una nomenclatura más clara y organizada para las más de 600 entradas de nuestro manual. Teniendo esto en cuenta, se han realizado una serie de cambios para facilitar el uso y la comprensión de las variables y las funciones.

Un ejemplo es el nuevo prefijo ta., que precede a todas las variables y funciones relacionadas con el análisis técnico. Esto facilita la navegación por el Manual en busca de métodos para obtener los valores de los indicadores más comunes. Siguiendo este principio, sma() se ha convertido en ta.sma(). Sin embargo, no es imprescindible recordar la nueva nomenclatura; basta con escribir el nombre antiguo de una función en el Editor y utilizar el atajo de teclado de autocompletar (Ctrl + Espacio en Win, Cmd + Espacio en MacOS), para que aparezca una ventana emergente con las sugerencias correspondientes:

El mismo razonamiento se aplica con el Manual: si se escribe el nombre antiguo de una función, se obtendrá la nueva nomenclatura correspondiente. La lista completa de los cambios de Pine v5 se encuentra en la Guía de Migración.

Bibliotecas publicadas

Aquí hay algunos ejemplos de bibliotecas publicadas en TradingView por el equipo de PineCoders (que nos ayudó a probar las nuevas características):

ColorScheme by RicardoSantos

Matrix_Functions_Lib_JD by Duyck

Enchanced_ta by HeWhoMustNotBeNamed

Estamos convencidos de que todas las novedades le resultarán súper interesantes y estamos deseando ver sus creaciones publicadas. Si desea recibir comentarios y sugerencias, estamos siempre a su disposición. TradingView es suyo, y su aportación siempre será de vital importancia.

Look first Then leap

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