Creare un Indicatore con Tradingview

Questo articolo fa anche parte della serie introduttiva su Tradingview. In questo tutorial, seguiremo passaggi simili a quelli descritti nell’articolo Tradingview: il primo Script, con la differenza che in questo caso si vuole creare un indicatore invece che una strategia.

Se non sai come aprire l’editor di pine-script, ti suggerisco di leggere l’articolo menzionato sopra. Ti guiderà attraverso l’apertura di un grafico e l’accesso all’editor.

L'indicatore

Prima di iniziare a sporcarci le mani, è opportuno descrivere la logica dell’indicatore che si vuole creare. In questo articolo si descrive come creare un indicatore RSI con un doppio intervallo di tempo. L’indicatore traccia i valori RSI relativi a 2 timeframe. La prima linea tracciata corrisponde al timeframe corrente del grafico, mentre la seconda è relativa ad un timeframe selezionato dall’utente. L’idea base consiste nel ritenere probabile un’inversione del trend (o almeno un ritorno verso la media) di uno strumento quando il prezzo è ipercomprato / ipervenduto contemporaneamente su due diversi timeframe. Questo indicatore è adatto in condizioni di mercato laterale.

Gli argomenti di base trattati in questo tutorial sono:

  • Comprensione della funzione di studio
  • Aggiunta degli ingressi dell’indicatore
  • Importazione dei dati relativi ad un diverso timeframe
  • Chiamata ad una funzione RSI
  • Mostrare graficamente le linee orizzontali e le linee RSI

Ok, vediamo in dettaglio l’implementazione di questo indicatore

Il Codice

Di seguito puoi trovare il codice completo. A seguire si descrive in dettaglio la logica di ogni sezione di questo codice.
//@version=3
study("Dual Strength RSI", "DS-RSI")
 
// Inputs
otf = input(defval="D", title="Second Momentum Timeframe", type=resolution)
otf_period = input(defval=14, title="Look Back Period (2nd Timeframe)", type=integer)
ctf_period = input(defval=14, title="Look Back Period (Chart Timeframe)", type=integer)
ob = input(defval=70, title="Overbought Area", type=integer)
os = input(defval=30, title="Oversold Area", type=integer)
 
//Get the data
otf_rsi = security(tickerid, otf, rsi(close, otf_period))
 
//Calculate RSI Values
ctf_rsi = rsi(close, ctf_period)
 
//Plot
hline(ob, title='Overbought Line', color=black, linestyle=dashed, linewidth=1)
hline(os, title='Oversold Line', color=black, linestyle=dashed, linewidth=1)
plot(otf_rsi, title='OTF RSI', color=blue, style=line, linewidth=3)
plot(ctf_rsi, title='CTF RSI', color=green, style=line, linewidth=3)

Spiegazione del Codice

Iniziato dall’intestazione del codice con la funzione study().
study("Dual Strength RSI", "DS-RSI")

La funzione study deve essere inclusa in ogni script. Tradingview classifica questo tipo di funzione come una “funzione di annotazione“. Come suggerisce il nome, queste funzioni annotano le informazioni che appaiono sul grafico. Ad esempio, assegnando un titolo all’indicatore presente nel grafico. Nell’esempio precedente si assegna all’indicatore un titolo completo e una notazione breve.

 

Inputs

otf = input(defval="D", title="Second Momentum Timeframe", type=resolution)
otf_period = input(defval=14, title="Look Back Period (2nd Timeframe)", type=integer)
ctf_period = input(defval=14, title="Look Back Period (Chart Timeframe)", type=integer)
ob = input(defval=80, title="Overbought Area", type=integer)
os = input(defval=20, title="Oversold Area", type=integer)

A seguire si ha la sezione degli input. Gli input forniscono i parametri dell’indicatore che possono essere modificati dopo aver aggiunto l’indicatore al grafico. Offrono agli altri utenti la possibilità di modificare le impostazioni dell’indicatore nel caso non condividino le impostazioni di default. Inoltre, gli utenti possono salvare la propria configurazione per qualsiasi indicatore. Non c’è bisogno di codificare queste logiche perchè sono integrate nelle funzionalità stardand della piattaforma.

  • defval = valore predefinito per il parametro
  • title = Il testo che appare nella casella di input
  • type = il tipo di valore che deve essere inserito. Si noti che un parametro è di tipo “resolution“. Questa è una variabile speciale che fornisce l’elenco di tutti i timeframe supportati.

Di seguito si mostra un esempio della rappresentazione grafica di questi input.

 

Import di altri dati

//Get the data
otf_rsi = security(tickerid, otf, rsi(close, otf_period))
Vediamo ora l’importazione dei dati. Questa linea di codice usa una funzione chiamata security() per importare i dati all’interno dello script. I dati importati potrebbero provenire da un diverso timeframe dello stesso strumento, dallo stesso timeframe ma di uno strumento diverso oppure da un timeframe e uno strumento completamente diversi da quelli rappresentati nel grafico principale.
  • tickerid = È un’altra variabile speciale che si riferisce allo strumento nel grafico principale. Questo ci consente di ottenere facilmente un altro timeframe dello stesso strumento. Ancora più importante, dato che non si specifica il nome di uno strumento (ad esempio LON: VOD), questo indicatore può essere applicato a qualsiasi strumento senza bisogno di modificare il codice.
  • otf = È la variabile restituita dalla funzione di input che abbiamo aggiunto sopra.
  • rsi (close, otf_period) = Restituisce una serie RSI per il timeframe selezionato. In questo caso l’RSI è calcolato  a partire dai valori close di ogni barra di quel timeframe.
Plotting
//Plot
hline(ob, title='Overbought Line', color=black, linestyle=dashed, linewidth=1)
hline(os, title='Oversold Line', color=black, linestyle=dashed, linewidth=1)
plot(otf_rsi, title='OTF RSI', color=blue, style=line, linewidth=3)
plot(ctf_rsi, title='CTF RSI', color=green, style=line, linewidth=3)
Infine si tracciano tutte le linee sul grafico. La funzione hline() traccia le linee orizzontali. La funzione plot() traccia i valori della serie RSI. Per concludere penso che gli argomenti delle keyword siano abbastanza autoesplicativi.

Il Risultato

Per vedere il risultato finale del nostro indicatore è sufficiente:

  1. Aprire Tradingview
  2. Scrivere il codice nell’editor di pine-script.
  3. Premere il pulsante “Aggiungi al grafico”
Questo è tutto quello che c’è da fare per creare un indicatore con pine-script di tradingview. Con questo codice di partenza prova a giocare con il setup dei dati importando diversi strumenti, prova un mix di indicatori, gioca con le funzioni di disegno e vedi se riesci a trovare qualche combinazione interessante.

Tradingview: lookahead dei dati realtime e dei dati storici

Per quanto la documentazione di pine-script sia ben fatta, ci sono ancora parti non spiegate sufficientemente bene, oppure è rivolta ad un target di pubblico con competenze molto avanzate. Ho quindi deciso di scrivere questo articolo dopo aver speso un po’ di tempo a studiare le differenze tra i dati “in tempo reale” e i dati storici e come l’utilizzo di un tipo o dell’altro possa modificare i calcoli prodotti da un indicatore. Questo è particolarmente vero quando si inizia ad utilizzare la keyword lookahead. Ne parleremo più avanti …

Nota: se hai appena iniziato ad utilizzare pine-script, ho scritto un’introduzione nell’articolo “Trading View: il primo Script”

Dati Storici vs Dati Real-time

I dati “real-time” di Tradingview non devono essere confusi con i dati in tempo reale forniti dalle borse e dagli exchange. In pine-script i dati in tempo reale sono tutti i dati acquisiti durante la creazione di una candela (anche se i dati stessi sono in ritardo). Al contrario, i dati storici si riferiscono a qualsiasi candela chiusa prima di aggiungere qualsiasi indicatore sul grafico. Sembra logico vero? E’ necessario però fare attenzione a un paio di cose:

  • I calcoli effettuati su dati in tempo reale quasi sempre hanno risultati diversi rispetto a quelli effettuati sui dati storici. Questo può sembrare ovvio, ma negli esempi seguenti si evidenzia come questo può provocare effetti indesiderati.
  • I dati in tempo reale non diventano dati storici una volta completata la candela. In altre parole, tali dati non sono elaborati nello stesso modo in cui sono elaborati i dati storici quando si aggiunge l’indicatore per la prima volta. Anche in questo caso, i seguenti esempi evidenziano queste criticità.

Andiamo avanti con un esempio pratico e creiamo un indicatore.

L'indicatore

L’indicatore che si vuol utilizzare è un semplice indicatore che sovrappone i valori giornalieri di High e Low su un grafico infragiornaliero. Questo potrebbe essere utile quando si cercano breakout sopra / sotto il massimo / minimo del giorno precedente.

Esempio 1 - Livelli Base

Il seguente codice è l’esempio più semplice di questo articolo. L’indicatore raccoglie semplicemente valori alti e bassi per lo stesso strumento usando un timeframe giornaliero. Quindi traccia questi valori nel timeframe corrente.

//@version=3
study("Barmerge Tests", overlay=true)
 
daily_high = security(tickerid, "D", high)
daily_low = security(tickerid, "D", low)
 
plot(daily_high, style=cross, color=green)
plot(daily_low, style=cross, color=red)

Come al solito, puoi copiare ed incollare il codice precedente direttamente nell’editor di pine-script di Tradingview ed aggiungire l’indicatore al tuo grafico.

Risultati dell'esempio 1

Nell’immagine precedente si può notare come i dati storici sono calcolati e tracciati come previsto. Si ha una bella linea retta dall’inizio alla fine di ogni giorno. Tuttavia, guarda cosa succede quando arrivano i dati in tempo reale. Le barre si spostano verso l’alto nel bel mezzo della giornata! Dopo aver esaminato più da vicino le linee generate dopo l’aggiunta dell’indicatore (dati in tempo reale), si può notare come le linee hanno iniziato a far riferimento ai valori High / Low del giorno corrente.

Lookahead

Il Lookahead permette di includere i dati futuri nei calcoli di un indicatore. Se si dichiara "lookahead_on", l’indicatore guarderà avanti per trovare alti e bassi per il resto della giornata. Li userà quindi per tracciare ogni barra infragiornaliera quel giorno, indipendentemente dal fatto che siamo prima o dopo il massimo o il minimo di quel giorno. L’esempio seguente mostra questo in modo più dettagliato.

Example 2 – lookahead attivo

Nell’esempio seguente si utilizza attivamente la funzionalità di lookahead. Se non si fornisce un argomento per la kyword “lookaheda”, il valore di default è OFF (barmerge.lookahead_off).
//@version=3
study("Barmerge Tests", overlay=true)
 
daily_high = security(tickerid, "D", high, lookahead=barmerge.lookahead_on)
daily_low = security(tickerid, "D", low, lookahead=barmerge.lookahead_on)
 
plot(daily_high, style=cross, color=green)
plot(daily_low, style=cross, color=red)

Risultati dell'esempio 2

Nella figura precedente si mostra l’indicatore appena stato aggiunto al grafico. Per i dati storici, il massimo e il minimo della giornata sono tracciati prima che questi avvengano effettivamente durante la giornata!

Non utilizzare mai questo tipo di indicatore per il backtest. Ad esempio, è possibile overfittare i risultati aprendo una posizione short all’inizio della giornata e chiudendola prima della fine della stessa giornata. Si avrebbero ottime prestazioni ma non sarebbero applicabili nel mondo reale.

Per i dati in tempo reale, il calcolo restituisce valori diversi all’interno della stessa giornata, quando il prezzo si sposta oltre il massimo o il minimo corrente. Questo è ovvio perché non possiamo conoscere in anticipo il valore delle candele che si devono ancora formare e che potrebbero avere high più alti e low più bassi.

Di seguito è riportato il grafico dell’indicatore che utilizza i dati in tempo reale dove il prezzo si sposta oltre i dati storici High e Low già noti.

Esempio 3 - Lookahead on e l'index.

In questo caso si può vedere che le linee High e Low rappresentano i valori relativi ai giorni precedenti. Inoltre, i dati in tempo reale forniscono lo stesso valore.
//@version=3
study("Barmerge Tests", overlay=true)
 
daily_high = security(tickerid, "D", high[1], lookahead=barmerge.lookahead_on)
daily_low = security(tickerid, "D", low[1], lookahead=barmerge.lookahead_on)
 
plot(daily_high, style=cross, color=green)
plot(daily_low, style=cross, color=red)

Risultati dell'esempio 3

Qui possiamo vedere che le linee High e Low rappresentanto i valori relativi ai giorni precedenti. Inoltre, i dati in tempo reale forniscono lo stesso valore.

Tradingview: il primo Script

Tradingview sta rapidamente diventando uno degli strumenti grafici più popolari del settore. Con i suoi strumenti di charting facili da usare, gli indicatori e l’integrazione con i social network, gli operatori hanno un set completo di strumenti per eseguire analisi tecniche e condividere idee. Oltre a ciò, Tradingview ha anche sviluppato un proprio linguaggio di scripting che consente agli operatori di creare indicatori personalizzati e sviluppare strategie.

Prima di entrare nel codice, per prima cosa. Se non lo hai già fatto, ti suggerisco di registrarti per un account sul sito Web Tradingview. Una volta che hai un account sarai in grado di salvare i tuoi script.

Quando ho iniziato a dare un’occhiata a Tradingview per effettuare un backtesting, sono rimasto colpito immediatamente dalla semplicità della piattaforma. Questo lo rende una scelta eccellente per i  principianti del backtesting. Non solo il linguaggio Pine Script è abbastanza semplice da capire, ma Tradingview rende molto facile l’accesso alle informazioni e tutorial.

Per esempio:

  • Passa il mouse sopra le funzioni per aiuto. Questo fornisce informazioni di aiuto in forma abbreviata.
  • Controllo della versione integrata. Ogni volta che premi il pulsante Salva, Tradingview salva lo script come una nuova versione. Questo semplifica la vita se accidentalmente vai troppo lontano dal percorso e devi tornare indietro.
  • CTL + Click per visualizzare la documentazione dettagliata (opzione + click per utenti Mac). Una cosa bella della finestra della guida pop-up è che puoi ancora digitare nel riquadro dello script dietro di essa. Non è necessario aprire e chiudere costantemente la schermata della guida mentre si lavora attraverso i parametri di input della una funzione.

Galleria (clicca su un’immagine per ingrandirla)

Un aspetto negativo che ho notato (al momento della scrittura) è non aver a disposizione (o non sono riuscito a trovarla) un’opzione per stampare le stringhe sulla console di output. Questo può rendere il debug un po ‘complicato. Soprattutto nei casi in cui si desidera verificare il valore di una determinata variabile.

La Piattaforma

Se sei completamente nuovo di tradingview, può essere utile esaminare le funzionalità di questa web-application e di come accedere all’editor del codice di pine-script.

Prima carica un grafico:

  • Apri Tradingview.
  • Fai clic su “Chart” nel menu della home page.
  • Se questa è la prima volta che usi la funzione di creazione di grafici, verrai rimandato ad un grafico. In caso contrario, verrà visualizzato un menu a discesa con un modello di grafico “senza nome”.
  • Il pine editor comprare sul fondo della pagina. Clicca sul tab del pine editor.
Quando si crea una strategia, non iniziare dalla pagina di default di pine script. Questo template è utilizzato per gli indicatori. Si può utilizzare uno specifico template per le strategie. Il template indicatore di default è simile a quanto segue:
Come puoi vedere è un po ‘spartano. Per avere un template base per una strategia devi fare clic su “Nuovo -> Script strategia vuoto”. In questo modo si ottiene un template di base per iniziare.
Si ottiene il template di un codice che assomiglia a quanto segue:

Come puoi notare, questo ci fornisce tutto il necessario per eseguire uno script:

  • La strategia è inizializzata
  • Viene fornito un trigger per andare long
  • Viene fornito un trigger per andare short.

Se vuoi, puoi andare avanti e premere il pulsante “Aggiungi al grafico” e avere il tuo primo script. Tuttavia, se vuoi andare un po’ oltre e apportare alcune modifiche, continua a leggere.

La Strategia

La strategia che implementeremo segue le stesse regole descritte nell’articolo “Backtrader: Primo Script“. L’ho fatto per coerenza e in modo che coloro che devono ancora decidere quale piattaforma utilizzare per il backtest possano avere un confronto coerente. È una semplicissima strategia long che ha l’obiettivo di rimanere dalla parte giusta di un mercato rialzista dei titoli azionari

Entry

  • Entrata Long quando RSI < 30

Exit

  • Entrata Long quando RSI > 70

Gestione del Trade e Dimensionamento della Posizione

  • Non è implementata nessuna gestione del trade e nessun ridimensionamento in / out. Solo semplici acquisti e vendite con un’unica posizione aperta alla volta.
  • Per quanto riguarda la posizione, si prevedono cose semplici e si mantiene il default proposto da Tradingview cioè quello di acquistare e vendere 1 contratto.

Parametri dell’Indicatore

  • Periodo = 21
  • Si utilizza un periodo di ricerca più grande rispetto a quello predefinito a 14. In teoria ciò si traduce in meno falsi segnali e il prezzo dovrebbe dimunuire / aumentare di più prima di essere considerato ipercomprato / ipervenduto.

Il Codice

//@version=3
strategy("Simple RSI", overlay=true, initial_capital=10000, currency='USD')
 
fromYear = year > 2014
toYear = year < 2016
 
longCondition = rsi(close, 21) < 30 if (longCondition and fromYear and toYear) strategy.entry("Long 1", strategy.long) closeCondition = rsi(close, 21) > 70
if (closeCondition)
    strategy.close("Long 1")

Da notare la semplicità e la brevità di questo codice rispetto a quello descritto nell’articolo “Backtrader: primo Script“, si apprezza sicuramente quanto sia più facile iniziare a lavorare! Quello che si rinuncia in termini di funzionalità e di controllo, torna indietro in termini di semplicità e di tempo.

Se lo si confronta con il template vuoto della strategia vuoto mostrato in precedenza, si può notare le seguenti modifiche:

  • L’entrata short è stata convertita in una funzione di chiusura in modo da non andare short (in conformità con le regole della strategia)
  • Le funzioni del crossover SMA sono state modificate per verificare se l’indicatore RSI è sopra o sotto un certo livello.
  • L’istruzione if per la condizione long è stata estesa.

Per prima cosa diamo un’occhiata all’inizializzazione della strategia e parliamo di un’altra caratteristica davvero interessante. Ci sono pochissimi parametri obbligatori necessari durante l’impostazione della strategia. In realtà, è richiesto solo il titolo e corrisponde al nome con cui la strategia può essere salvata. Tutti i parametri della strategia possono essere modificati visivamente tramite un modulo nella scheda “strategie”. Abbastanza carino vero? Ma c’è di più, i parametri possono essere regolati qui in qualsiasi momento e i risultati presenti nel riepilogo delle prestazioni si aggiornano automaticamente quando si apportano talile modifiche.

Inoltre durante l’inizializzazione della strategia, ho aggiunto alcuni parametri opzionali:

strategy("Simple RSI", overlay=true, initial_capital=10000, currency='USD')
Questi parametri (initial_capital and currency) impostano i valori predefiniti che si vedono nel pannello del tester della strategia, quando si preme il pulsante di configurazione:
Un’altra modifica che ho apportato è stata quella di creare alcune variabili che vengono utilizzate per valutare se l’anno è superiore o inferiore a un determinato numero. L’ho fatto in quanto preferisco concentrarmi su particolari periodi di tempo durante il backtesting, in modo che un lungo periodo non mascherasse brevi periodi di prestazioni scadenti. È una scelta personale.
fromYear = year > 2014
toYear = year < 2016

Cosa succede qui?

Ogni volta che viene prodotta una nuova candela, viene eseguito un controllo per vedere se l’anno è maggiore del 2014 o inferiore al 2016. In caso affermativo, il valore booleano “true” viene salvato nelle variabili fromYear e toYear. Questo può quindi essere usato nell’istruzione IF per verificare se possiamo aprire un nuovo trade:

longCondition = rsi(close, 21) < 30
if (longCondition and fromYear and toYear) 
      strategy.entry("Long 1", strategy.long) 
Stiamo verificando se l’RSI è inferiore a 30 e la data sia successiva al 2014 e precedente al 2016. La chiusura della strategia è più semplice. Chiude la posizione quando l’RSI supera il valore 70.

Utilizzare questo codice su Tradingview

Copia il codice e fai clic qui per aprire una finestra del grafico su Tradingview. Incolla il codice nell’editor di Pine Script, ora puoi fare clic sul pulsante “Aggiungi al grafico” per avviare il test e vedere visivamente dove la strategia ha acquistato e venduto.

Non dimenticare di fare clic su Salva, in modo da poter tornare alla strategia in un secondo momento! Puoi applicare questa strategia a qualsiasi strumento. Tutte le strategie caricate vengono visualizzate nella scheda “Strategie” nel riquadro inferiore dell’area grafica. Per caricare le strategie, è possibile selezionare “Apri” dalla scheda del pine editor.

I risultati

Tempo di i grandi risultati … Un utile netto di $10,56! Non così impressionante, ma non è questo il punto. In questo momento stiamo solo configurando il backtesting su Tradingview!

Prova a giocare con questo codice, cambia gli indicatori, cambia i parametri della strategia e abituati alla piattaforma.

Spero che questo post ti aiuti a iniziare!