Le novità di Pine: variazioni di funzione, migliore gestione delle stringhe e tanto altro!

Dec 23, 2021

Il team Pine ha continuato a lavorare alacremente dopo il lancio della quinta versione per migliorare ulteriormente il prodotto. Ecco alcune delle novità degne di nota che sono state introdotte negli ultimi due mesi.

Variazioni di funzione

Le variazioni di una funzione (“function overloads”) possono essere definite in una libreria o incluse in uno script. Sono rappresentate con lo stesso nome della funzione originale, ma stabiliscono un diverso approccio a seconda della quantità o della tipologia dei parametri. Sono particolarmente utili all’interno delle librerie, dove è obbligatorio specificare la tipologia di parametro.

Nel seguente indicatore, ad esempio, si identifica una variante della funzione mult() che accetta tre argomenti:

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

// Due parametri
mult(x1, x2) =>
    x1 * x2

// Tre parametri
mult(x1, x2, x3) =>
    x1 * x2 * x3

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

In questo altro caso, si definiscono ulteriori varianti che agiscono in modo diverso a seconda della tipologia di parametro utilizzato. Nota: se il numero di parametri della variante è lo stesso della funzione originaria, è necessario esplicitare la tipologia di parametro, come evidenziato qui sotto:

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

// Accetta sia valori 'int' che 'float', poiché qualsiasi 'int' può essere trasformato automaticamente in 'float'
mult(float x1, float x2) =>
    x1 * x2

// Restituisce un valore 'bool' invece di un numero
mult(bool x1, bool x2) =>
    x1 and x2 ? true : false

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

// Ha tre parametri, pertanto non è necessario esplicitare la tipologia
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

L’iterazione di un array con for richiede attenzione, poiché è sempre necessario evitare l’entrata in un loop vuoto e l’iterazione al di fuori degli indici dell’array.

Con la formula for…in è tutto molto più facile. La sintassi è intuitiva: for array_element in array_id ripete l’esecuzione su tutti gli elementi di array_id a partire dall’indice zero, assegnando il valore alla variabile array_element durante ogni iterazione. Ciò significa che è impossibile avere degli errori causati dalle motivazioni addotte qui sopra, e che si possono perfino aggiungere/rimuovere elementi durante l’esecuzione del loop.

Nello script qui sotto, si utilizza for…in per trovare il numero maggiore all’interno dell’array 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))

Nuove funzioni per la manipolazione di stringhe

Queste nuove funzioni forniscono metodi aggiuntivi per elaborare le stringhe, ed introducono le espressioni regolari su Pine. A differenza delle funzioni di stringa definite dall’utente utilizzando array, queste possono restituire valori in formato “simple”, permettendo ad esempio la creazione di argomenti symbol per la funzione request.security().

str.contains(source, str)

Determina se la stringa source contiene la sotto-stringa str. Ad esempio, si può verificare se il grafico corrente è un futures continuo cercando la particella “!” nella variabile integrata syminfo.tickerid (ticker del simbolo):

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

str.pos(source, str)

Restituisce la posizione della sotto-stringa str all’interno della stringa source.

str.substring(source, begin_pos, end_pos)

Estrae la sotto-stringa dalla stringa sourceNell’esempio, vengono usate str.substring() e str.pos() per recuperare la sotto-stringa “AAPL” dalla stringa di input s:

s = input.string("Time to sell some NASDAQ:AAPL") 
pos = str.pos(s, ":")  // Ottieni la posizione del carattere ":"
tkr = str.substring(s, pos + 1) // "AAPL"

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

Al contrario della funzione esistente str.replace_all(), str.replace() permette il rimpiazzo selettivo di una sotto-stringa con un’altra. Nell’esempio qui sotto, viene sostituito il prefisso “FTX” con “BINANCE” nel primo simbolo della stringa di spread:

var source = "FTX:BTCUSD / FTX:BTCEUR"
// Rimpiazza la prima occorrenza di "FTX" con la stringa "BINANCE"
var newSource = str.replace(source, "FTX",  "BINANCE", 0)

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

Converte tutte le lettere della stringa source in minuscolo o maiuscolo:

s = str.lower("Time to Sell Some AAPL") // time to sell some aapl!
s = str.upper("Time to Sell Some AAPL!") // TIME TO SELL SOME AAPL!

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

Determina se la stringa source comincia o finisce con la sotto-stringa str.

str.match(source, regex)

Estrae la sotto-stringa corrispondente all’espressione regolare specificata. Ad esempio, con la regex [\\w]+:[\\w]+ è possibile trovare e restituire il nome del simbolo dalla stringa di riferimento “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"

Conversione valutaria

Molte funzioni appartenenti al dominio request.* possono ora convertire i valori da restituire in un’altra valuta. Se l’argomento currency è specificato nella chiamata della funzione, i valori di prezzo restituiti sono convertiti dalla valuta di origine a quella specificata. Il parametro currency è disponibile nelle seguenti funzioni:

Caselle di testo

L’oggetto box disponibile con Pine ora supporta le stringhe di testo! Basta aggiungere l’argomento text nella funzione box.new() e questo sarà mostrato all’interno del box. Puoi aggiustare le caratteristiche del testo impostando i parametri di text_size, text_color, text_valign e text_halign nel momento della creazione, o in un momento successivo utilizzando le seguenti funzioni con riferimento al box in questione:

Come esempio di questa funzionalità, ecco un l’indicatore integrato Multi-Time Period Charts modificato per mostrare il numero della settimana ed i valori di massimo e minimo evidenziati:

Per rimanere informati sulle nuove funzionalità di Pine, date un’occhiata alle Note di rilascio. In alternativa, anche seguendo l’account PineCoders troverete molti aggiornamenti (gli stessi autori gestiscono anche il canale Telegram Squawk Box, Twitter e la chat pubblica di Pine Script su TradingView).

Speriamo che queste funzionalità possano farvi comodo nello sviluppo di nuove soluzioni. Non vediamo l’ora di leggere i vostri feedback ed i vostri suggerimenti.

Look first Then leap

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