Oggi siamo lieti di annunciare il rilascio di Pine Script® v6! Questa versione aggiornata del nostro linguaggio di programmazione include una serie di ottimizzazioni e miglioramenti richiesti da tempo, che offrono maggiore efficienza e utilità ai programmatori di Pine Script®, ponendo le basi per portare il linguaggio a nuovi livelli.
Questo post illustra alcuni degli aggiornamenti più importanti di Pine v6. Consultate le nostre note di rilascio per saperne di più sulle novità di v6 e per rimanere aggiornati sui miglioramenti futuri.
Strumento di conversione v6
Come per i precedenti cambiamenti di versione, gli aggiornamenti inclusi in Pine v6 non influiscono sugli script personali o pubblicati scritti nelle versioni precedenti di Pine, ma tutte le nuove funzionalità d’ora in poi saranno implementate esclusivamente nell’ultima versione di Pine, quindi vi consigliamo di convertire i vostri script alla v6 se volete accedere alle nuove funzionalità. Il metodo più semplice è quello di utilizzare il nostro strumento di conversione, che si può attivare selezionando “Converti codice in v6” dal menù “Gestisci script” dell’editor.
N.B.: non tutti gli script possono essere convertiti automaticamente in v6 e in alcuni casi sono necessarie modifiche manuali per garantire che lo script convertito funzioni come previsto. Se si riscontrano problemi con la conversione automatica o si preferisce convertire manualmente gli script in v6, consultare la nostra guida alla migrazione.
Richieste dinamiche
TradingView fornisce l’accesso a decine di migliaia di simboli per strumenti negoziabili, metriche finanziarie e indicatori economici di tutto il mondo. La famiglia di funzioni request.*() consente agli script Pine di recuperare i dati di qualsiasi simbolo disponibile su diversi timeframe, indipendentemente dal simbolo e dal timeframe utilizzati dal grafico.
Queste funzioni sono potenti utility con numerosi casi d’uso. Tuttavia, in precedenza avevano una limitazione significativa: richiedevano l’uso di valori stringa per specificare il simbolo e il timeframe della richiesta, il che significava che il contesto doveva essere noto alla prima barra e non poteva cambiare in seguito. Inoltre, tutte le chiamate request.*() dovevano essere eseguite rigorosamente nello scope globale dello script. In altre parole, ogni singola istanza request.*() poteva recuperare dati per un solo simbolo e per un solo intervallo di tempo e non erano consentite chiamate request.*() all’interno di loop, strutture condizionali o librerie.
In Pine Script® v6 abbiamo eliminato queste limitazioni. Ora gli script possono utilizzare serie di stringhe per definire il contesto di qualsiasi chiamata request.*(). Inoltre, le chiamate sono consentite all’interno degli scope locali. Grazie a queste modifiche, è possibile calcolare o modificare i simboli su qualsiasi barra storica e richiederne i dati in modo dinamico, creare collezioni di simboli e recuperarne i dati all’interno di loop e fare molte altre cose con le funzioni request.*() che prima non erano possibili. Per saperne di più, consultare la sezione Richieste dinamiche del Manuale dell’utente.
Per un esempio di ciò che si può fare con le richieste dinamiche, date un’occhiata al funzionamento interno dell’indicatore integrato Performance. L’indicatore divide in array gli elenchi di stringhe di simboli e di timeframe separati da virgole, quindi richiama request.security() in modo dinamico all’interno di loop per recuperare i valori da ciascun set di dati. In passato, uno script di questo tipo avrebbe richiesto più chiamate a input.symbol() e input.timeframe(), e ogni combinazione di simboli e timeframe avrebbe richiesto una chiamata separata a request.security() nel codice:
Per ulteriori riferimenti, date un’occhiata a questi script pubblicati dall’account TradingView, che utilizzano anche richieste dinamiche per recuperare dati da altri contesti.
- Forex Heatmap. Questo indicatore crea ticker ID per le combinazioni di coppie di valute in base a un elenco di codici di valuta specificato dall’utente. Richiede dinamicamente i dati per ogni combinazione di coppie all’interno di loop e poi utilizza i dati per popolare una tabella colorata.
- Ticker Tape. Questo indicatore crea un array di ticker ID da un elenco di simboli definito dall’utente. Richiede dinamicamente le informazioni sul prezzo e sulle variazioni giornaliere per ciascun ID dall’array all’interno di un ciclo, quindi utilizza i dati per aggiornare una visualizzazione a nastro.
- LibraryCOT. In passato, questa libreria forniva solo strumenti per la creazione di ticker ID per la richiesta di dati CFTC Commitment of Traders (COT), poiché le librerie non potevano esportare funzioni contenenti chiamate request.*(). Con le richieste dinamiche, questa limitazione non si applica più. La libreria esporta ora una funzione requestCommitmentOfTraders() che chiama internamente request.security() per recuperare direttamente i dati COT, offrendo maggiore comodità e versatilità ai programmatori.
Inoltre, tutti i codici dei report CFTC erano precedentemente conservati all’interno di istruzioni switch per restituire valori semplici, limitando in modo significativo i ticker disponibili per la richiesta. Con le richieste dinamiche, gli ID dei ticker a stringa non sono più necessari, consentendo alla libreria di memorizzare i codici di report in una map e di supportare un maggior numero di simboli.
Ottimizzazione booleana
Uno dei miglioramenti più degni di nota di Pine Script® v6 potrebbe non essere evidente in superficie, ma noterete una differenza nell’efficienza del codice. Abbiamo rielaborato l’implementazione interna dei valori “bool” e abbiamo introdotto la valutazione a corto circuito (o “lazy evaluation”), consentendo alle operazioni and e or di interrompere la valutazione di ulteriori espressioni quando non sono necessarie per determinare il risultato.
Queste modifiche migliorano le prestazioni della maggior parte degli script su TradingView. La differenza di efficienza è particolarmente evidente con gli script relativamente grandi che si basano molto sulle condizioni e utilizzano molti valori “bool”, come abbiamo confermato nei nostri test su alcuni dei più popolari script della Community open-source.
Inoltre, la valutazione lazy dei “bool” spesso consente di ottenere un codice più pulito e conciso. Ad esempio, se avete una condizione che si basa su elementi di un array, potreste dover controllare la dimensione dell’array per assicurarvi che l’indice dell’elemento esista, poiché lo script si fermerà e solleverà un errore se l’indice è fuori dai limiti. Pine v6, con la sua valutazione, consente di creare una singola espressione condizionale che controlla l’array prima di accedere a un elemento, cosa che non era possibile nella v5.
//@version=6 indicator("Lazy evaluation demo") //@variable A "bool" array without a fixed size. array<bool> myArray = array.new<bool>() // Push a new value into `myArray` when the `close` is above the `open`. if close > open myArray.push(true) // Line 13 causes an error in v5 because `myArray.first()` always executes, even if the first expression is `false`. // It works in v6 though because `myArray.first()` executes only if the first expression evaluates to `true`. if myArray.size() != 0 and myArray.first() label.new(bar_index, high, "Test")
Dimensioni e formattazione del testo
Tutti i tipi di disegno che visualizzano testo (boxes, labels e tables) possono ora utilizzare dimensioni del testo specificate in punti, come negli editor di testo standard. In precedenza, era necessario scegliere tra le costanti arbitrarie size.* , come size.large (24) e size.huge (36). Con la nuova specifica è possibile garantire che le dimensioni del testo siano esattamente quelle desiderate. È persino possibile creare dimensioni di testo enormi, impossibili da ottenere nelle precedenti versioni di Pine.
Inoltre, abbiamo introdotto un nuovo parametro text_formatting che si può usare per rendere il testo in corsivo, in grassetto o in entrambi i modi.
//@version=6 indicator("Text size showcase", overlay = true) var t = table.new(position.bottom_center, 1, 2, bgcolor = color.yellow, frame_color = color.black, frame_width = 1) if barstate.islastconfirmedhistory t.cell(0, 0, "text_size = size.huge", text_size = size.huge) t.cell(0, 1, "text_size = 60, bold & italicized", text_size = 60, text_formatting = text.format_bold + text.format_italic)
Taglio degli ordini della strategia
Gli utenti che utilizzano script di strategie sapranno che in Pine v5 una strategia può simulare fino a 9000 operazioni prima di interrompere i calcoli e generare un errore, a meno che non si utilizzi la modalità di Backtesting esteso. Questa limitazione è particolarmente fastidiosa per le strategie con operazioni frequenti che creano trigger di alert.
In Pine Script® v6, le strategie non interrompono più i calcoli nè generano un errore dopo aver raggiunto il limite di 9000 operazioni. Al contrario, la strategia taglia gli ordini più vecchi per fare spazio a quelli nuovi. Gli ordini tagliati non appaiono nello Tester strategia, ma la strategia continua a calcolare senza problemi. Per verificare l’indice dell’ordine non tagliato più vecchio, è possibile utilizzare la nuova variabile strategy.closedtrades.first_index. L’indice è utilizzabile come argomento trade_num nelle chiamate di funzione strategy.closedtrades.*().
Indici negativi degli array
In Pine v6, le funzioni array.get(), array.set(), array.insert() e array.remove() possono ora accettare argomenti di indice negativo per fare riferimento ad elementi che partono dalla fine di un array, offrendo un modo più conciso e comodo per fare riferimento ad elementi in ordine inverso. Ad esempio, la chiamata array.get(myArray, -2) recupera il penultimo elemento di myArray, che è equivalente a array.get(myArray, array.size(myArray) – 2).
Per rimanere aggiornati sugli ultimi miglioramenti apportati all’esperienza di Pine Script®, tenete d’occhio le note di rilascio del Manuale utente; la sezione relativa alla versione 6 include anche alcune modifiche aggiuntive che non sono state inserite in questo post.
Ci auguriamo che queste funzioni vi siano utili come pensiamo, e vi invitiamo a continuare a inviarci i vostri feedback e suggerimenti per rendere la piattaforma la migliore possibile. Costruiamo TradingView per voi e siamo sempre desiderosi di ascoltare le vostre opinioni.
— Team TradingView