Benvenuto Pine Script v5!

Oct 7, 2021

È un grande giorno in casa TradingView: Pine cambia pelle e passa alla v5. La nuova versione del nostro linguaggio di programmazione, creato per permettere a trader ed investitori di sviluppare indicatori e strategie personalizzate, porta con sé tante funzionalità e miglioramenti. In termini di pura potenza, vengono letteralmente asfaltate le prestazioni precedenti. In questo articolo descriveremo solo alcune delle ultime novità introdotte; per ogni dettaglio, fate riferimento alle nostre Note di rilascio e alla Guida per la migrazione.

Convertitore v4 – v5

Sebbene gli script sviluppati con le versioni precedenti di Pine continueranno a girare senza intoppi, abbiamo aggiunto direttamente nell’Editor un comodo strumento di conversione per facilitare il passaggio dalla v4 alla v5. Questo perché le future funzionalità sviluppate da qui in avanti saranno solo compatibili con la v5, e raccomandiamo pertanto di non rimanere indietro. L’opzione per convertire uno script v4 alla v5 compare nel menù a tendina non appena questo viene caricato nell’Editor:

N.B.: Non tutti i codici v4 possono essere convertiti in automatico. Se riscontrate qualche problema o preferite fare la conversione manuale, la nostra Guida per la migrazione vi aiuterà con tutta la documentistica del caso.

Librerie

Una novità chiave di Pine v5 è l’introduzione delle librerie. Per libreria si intende un nuovo tipo di pubblicazione che permette di condividere funzioni personalizzate che possono poi essere riutilizzate in altri script. Una volta che una libreria è stata pubblicata infatti, altri script (indicatori, strategie o altre librerie) possono importarla e metterla in uso. L’idea è quella di includere in questo formato gli algoritmi più complessi o le funzioni più comunemente utilizzate, così da evitare inutili ridondanze.

Per cominciare a sperimentare con le librerie, dai un’occhiata alla sezione dedicata nel Manuale utente (ENG). Più sotto includeremo degli esempi di librerie pubblicate da alcuni membri del team PineCoders. Per il resto, saranno tutte incluse in un apposito feed qui.

Valori di default per le funzioni definite dall’utente

Una novità che va a braccetto con quella delle librerie: può essere stabilito un valore di default per i parametri delle funzioni definite dall’utente, rendendo l’input di quest’ultimo a tutti gli effetti opzionale. Nell’esempio qui sotto, si dichiara una funzione personalizzata customPow() che eleva base alla potenza exp. Se exp non è specificato quando la funzione viene chiamata, il valore utilizzato è 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 dichiarazione switch ha un che di familiare con la dichiarazione if. Soprattutto se siete abituati a creare enormi concatenazioni di blocchi if-else, apprezzerete la convenienza e la comodità d’uso di switch. Di base, si tratta di una struttura di controllo per distinguere i vari casi corrispondenti ai valori di una singola espressione (smoothingInput nel caso qui sotto), ed assegnare ad ognuno una risposta specifica. Per saperne di più potete consultare il nostro Manuale. Nell’esempio potete vedere l’indicatore Average True Range che ora usa la dichiarazione switch per consentire l’utilizzo di varie forme di livellamento/smoothing nell’algoritmo di calcolo:

//@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)

Gestione disegni

Un importante miglioramento nella gestione dei disegni tramite Pine: i nuovi array integrati (line.all, label.all, box.all e table.all) contengono gli ID di tutti i disegni applicati dal tuo script.

Ciò significa che puoi, ad esempio, limitare il numero di disegni mostrati sul grafico secondo un parametro definito dall’utente. Nello script qui sotto, si traccia una linea su ogni nuova apertura (fino ad un massimo di ~50, ovvero il limite di default di uno script per le linee). Si controlla poi se il numero di linee consentito dall’utente è stato ecceduto, ed in tal caso si procedere alla rimozione della linea più vecchia:

//@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

Una altra funzionalità che sbarca su Pine v5 è la dichiarazione while, che crea un loop che che continua sino a quando la condizione è falsa o viene utilizzato il comando break.

Ad esempio, l’indicatore qui sotto calcola la differenza tra il tempo medio intercorso per ritrovare nel passato la quantità di volumi rialzisti e ribassisti equivalenti al volume totale delle ultime n barre. Più si va indietro per trovare il volume rialzista/ribassista, più il valore sarà indicativo di long/short:

//@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)

Il loop while presente nello script continua fino a che non trova il volume richiesto (sia rialzista che ribassista), a patto che non si sia andati oltre il numero massimo di barre consentite. Lo script introduce anche un’altra novità di Pine v5: runtime.error().

runtime.error()

La funzione runtime.error() permette di fermare l’esecuzione di uno script e mostrare un messaggio di errore a seguito di qualsiasi condizione definibile tramite Pine. Molto utile per i creatori che vogliono evitare che il loro script sia utilizzato nel modo scorretto. All’occorrenza, può anche essere uno strumento di debug non convenzionale, per terminare l’esecuzione di uno script durante un loop o all’interno di una funzione.

Per usare la nuova funzione, basta chiamare runtime.error() quando le condizioni si realizzano. Nel momento dell’esecuzione di tale funzione, lo script si blocca e mostra un punto esclamativo di fianco al nome, con il messaggio specificato nel codice che compare nel momento in cui l’utente ci clicca sopra.

Il codice qui sotto rappresenta l’indicatore VWAP con due errori personalizzati. Il primo compare quando il simbolo non ha i dati sul volume, poiché, banalmente, il VWAP senza quei dati non può essere calcolato. Il secondo si manifesta quando il timeframe sul grafico è giornaliero o superiore, perché l’indicatore resetta il calcolo ad ogni nuovo giorno e sarebbe inutile nei grafici daily o superiori.

//@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)

Nuovi parametri strategia

Buone notizie per chi sviluppa strategie. Abbiamo aggiunto tante nuove variabili e funzioni che permettono di ottenere informazioni aggiuntive sulle operazioni, con statistiche e metriche sempre disponibili e che si aggiornano man mano che l’emulatore broker esegue gli ordini, così da avere piena contezza della performance della strategia anche mentre è in divenire.

Clicca qui per vedere un elenco con relativi link per i dettagli

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 rinnovata

Confrontandoci con la nostra comunità di sviluppatori Pine, abbiamo inutito che c’è molta soddisfazione per tutte le novità introdotte negli ultimi anni. La nostra intenzione è quella di mantenere questo ritmo forsennato anche nel futuro. Questo però crea un flusso ininterrotto di nuove funzionalità e variabili. Per sostenere una crescita del genere, abbiamo bisogno di stabilire una nomenclatura più chiara ed organizzata per le oltre 600 voci presenti nel nostro manuale. È con questo ideale che sono state apportate alcune modifiche per facilitare l’utilizzo e la comprensione di variabili e funzioni.

Un esempio è il nuovo prefisso ta., che precede tutte le variabili e le funzioni relative all’analisi tecnica. Ciò rende più facile navigare sul Manuale per ricercare i metodi per ottenere i valori degli indicatori più comuni. Seguendo questo principio, sma() è ora diventata ta.sma(). Ricordare la nuova nomenclatura non è comunque imperativo; basta scrivere il vecchio nome di una funzione nell’Editor ed utilizzare la scorciatoia per il completamento automatico (Ctrl + Spazio su Win, Cmd + Spazio su MacOS), per visualizzare un popup con i suggerimenti corrispondenti:

Lo stesso ragionamento si applica con il Manuale: scrivere il vecchio nome di una funzione ricondurrà alla rispettiva nuova nomenclatura. La lista completa delle variazioni di Pine v5 è presente sulla Guida per la migrazione.

Librerie pubblicate

Ecco alcuni esempi di librerie pubblicate su TradingView dal team di PineCoders (che ci hanno aiutato a testare le novità):

ColorScheme by RicardoSantos

Matrix_Functions_Lib_JD by Duyck

Enchanced_ta by HeWhoMustNotBeNamed

Siamo convinti che troverete tutte le novità super interessanti, e siamo impazienti di vedere le vostre creazioni pubblicate. Per feedback e suggerimenti, siamo sempre disponibili. TradingView è vostro, ed il vostro contributo sarà sempre fondamentale.

Look first Then leap

TradingView è realizzato per te. Assicurati di sfruttare al massimo tutte le sue funzionalità
Apri grafico