In questo articolo descriviamo come monitorare e recuperare i dati con Tradingview per il trading algoritmico. Come abbiamo descritto nell’articolo sull’indicizzazione dei dati e variabili con tradingview, ogni variabile è in realtà una lunga lista di valori. Da un lato questo è un vantaggio perché possiamo facilmente controllare il valore storico della variabile in qualsiasi momento nel passato. D’altra parte, poiché la lista si aggiorna ad ogni nuova barra, non è semplice monitorare e recuperare i dati in Tradingview e accedere ai corrette valori storici. Dato che la lista è in continua evoluzione, non possiamo usare solamente l’indicizzazione.
Il problema
Spesso vogliamo eseguire qualche tipo di controllo nel codice e se il controllo è positivo (true), assegnare un valore ad una variabile. Quindi, potrebbe sembrare naturale controllare l’ultimo valore scrivendo myvar[1]
(dove myvar è il nome della variabile che abbiamo creato). Tuttavia, a meno che non abbiamo assegnato il valore solo una barra fa, è improbabile riuscire ad ottenere il valore che stiamo cercando. Questo perché “qualcosa” è sempre memorizzato nella variabile ad ogni nuova barra. In altre parole, ad ogni barra si aggiunge un valore alla lista myvar
, potrebbe essere na
o qualche altro valore predefinito che abbiamo previsto nel codice.
Ad ogni nuova barra, il valore che desideriamo recuperare si sposta sempre più lontano all’interno della lista. Per facilitare la comprensione, immaginiamo che la seguente lista rappresenti myvar
:
[na, na, na , 1.3045, na, na, na, na, na, 1.3067, na, na, na]
Come possiamo vedere, l’ultima volta che la condizione ha restituito true
è stata 4 barre fa. Quando arriva una nuova barra, diventano 5 barre fa. Poiché non sappiamo quando la nostra condizione sarà di nuovo vera, dobbiamo trovare un modo per monitorare e recuperare i nostri dati.
Casi d’uso
Prima di descrivere le soluzioni, vediamo un paio di casi dove è utile monitorare e recuperare i dati in Tradingview e accedere ai corrette valori storici, quando è successo qualcosa. In realtà, ci sono molti casi ma in questo articolo ci concentriamo sui due principali:
- aver bisogno di recuperare il valore della variabile nel momento in cui è successo qualcosa per successivi analisi e confronti.
- voler sapere quanto tempo è passato da quando una certa condizione è stata soddisfatta. Sia per l’indicizzazione o per eseguire altre azioni all’interno di una finestra temporale.
Un’ulteriore caso è quando vogliamo confrontare il prezzo di chiusura della prima barra della sessione con il prezzo di chiusura della prima barra della sessione di ieri. Oppure vogliamo andare long solo dopo che un RSI scende sotto 30 e supera di nuovo 30 entro 5 barre.
Questi confronti possono essere più difficili da realizzare se desideriamo che il nostro script funzioni su più timeframe. Ad esempio, nel primo caso non possiamo semplicemente contare il numero di barre nella sessione e usarlo come valore per l’indice perchè lo script funzionerà solo nel timeframe in cui è stato scritto.
Ad esempio, se lavoriamo su timeframe orario e ci sono 8 ore nella sessione, non possiamo semplicemente far riferimento a close[-8]
perché se ci spostiamo su un grafico a 15 minuti, 8 barre indietro non sono l’inizio della sessione del giorno precedente.
Monitorare e recuperare i dati con Tradingview
Poiché abbiamo 2 problemi, esamineremo anche due possibili soluzioni. In realtà, pine-script fornisce funzioni integrate progettate per aiutarci in questi casi.
Value When
La funzione valuewhen()
restituisce il valore quando è stata soddisfatta una determinata condizione. È inoltre possibile impostare un parametro per restituire l’N-esima
occorrenza in modo da poter recuperare il valore corrispondente all’ultima volta che la condizione era vera… e nell’ora precedente…. e così via.
Ecco la definizione di valuewhen() nella documentazione ufficiale di pine-script:
valuewhen
Valore della serie di origine quando la condizione era vera all’ennesima occorrenza più recente.valuewhen(condition, source, occurrence) → series
RESTITUISCEIl valore di origine quando la condizione era vera
Applichiamo questa funzione al primo caso d’uso. Il seguente codice implementa una strategia molto semplice che confronta il prezzo di chiusura della barra di apertura di oggi con il prezzo di chiusura della barra di apertura di ieri.
//@version=3
strategy("Value When Example", overlay=true)
// Tratto da: https://www.tradingview.com/wiki/Sessions_and_Time_Functions
is_newbar(res) =>
t = time(res)
change(t) != 0 ? 1 : 0
// Controllo per un nuovo giorno
new_day = is_newbar("D")
// Ottengo la chiusura della barra di apertura precedente
last_close = valuewhen(new_day, close, 1)
strategy.entry("Long", true, when=new_day and close > last_close)
strategy.entry("Short", false, when=new_day and close < last_close)
plot(last_close, style=circles, color=orange)
Applicando questo script ad un grafico si ottiene qualcosa di simile:
Grazie al modo in cui è stato codificato, questo script confronta la barra di apertura su qualsiasi timeframe. Possiamo provarlo in qualsiasi timeframe intraday. È un semplice esempio ma dovrebbe essere sufficiente per vedere il comportamento della funzione. Possiamo fare altri test con la funzione valuewhen()
, ad esempio sostituendo close
con high
o con il volume
, oppure modificare il numero di giorni indietro o passarlo a una variabile diversa come una media mobile semplice. Dopo aver fatto alcuni test, diventerà facile vedere quanto può essere utile questa funzione.
Bars Since
Il secondo esempio esamina la funzione barssince()
integrata in pine script. Questa funzione restituisce un numero che rappresenta il numero di barre trascorse da quando una condizione era vera. In questo esempio, usiamo la funzione barssince()
per monitorare quante barre sono passate da quando l’RSI ha superato i 30. Se supera i 30 entro 5 barre, andiamo long.
La documentazione ufficiale di pine script definisce barssince() come segue:
barsince
La funzione barssince conta il numero di barre trascorse da quando la condizione era vera.barssince(condition) → series[integer]RESTITUISCEIl numero di barre da quando la condizione era vera.
Poiché barssince()
restituisce un valore diverso per ogni barra, codifichiamo questo esempio in due fasi. La prima fase consente di verificare il valore restituito e di capire il comportamento della funzione. A tale scopo, tracciamo semplicemente il valore restituito da barssince()
per l’output del controllo crossunder()
. Per ora non consideriamo la condizione di ingresso long.
//@version=3
strategy("Barssince Example")
rsi_len = input(14, title="RSI Length")
rsi_src = input(close, title="RSI Source")
rsi = rsi(rsi_src, rsi_len)
rsi_x_under = crossunder(rsi, 30)
since_x_under = barssince(rsi_x_under)
plot(since_x_under)
Nell’immagine precedente, abbiamo tracciato separatamente un indicatore RSI sopra il nostro esempio con barssince()
. In questo modo è più facile vedere come i valori barssince()
si allineano con l’indicatore. Possiamo vedere come i valori restituiti da barssince()
aumentano di 1 ad ogni nuova barra fino a quando l’RSI torna al di sotto del livello 30.
Aggiungere la condizione di entrata
A questo punto passiamo alla seconda fase. Aggiungiamo la condizione di ingresso per andare long se l’RSI incrocia all’indietro entro 5 barre.
//@version=3
strategy("Barssince Example")
rsi_len = input(14, title="RSI Length")
rsi_src = input(close, title="RSI Source")
rsi_ent = input(30, title="RSI Entry Level")
rsi_ext = input(50, title="RSI Exit Level")
rsi_lim = input(5, title="Cross Back Up Bar Limit")
rsi = rsi(rsi_src, rsi_len)
rsi_x_under = crossunder(rsi, rsi_ent)
rsi_x_over = crossover(rsi, rsi_ent)
rsi_exit = crossover(rsi, rsi_ext)
since_x_under = barssince(rsi_x_under)
strategy.entry("Long", true, when=rsi_x_over and since_x_under <= rsi_lim)
strategy.close("Long", when=rsi_exit)
plot(rsi, color=blue, linewidth=3)
hline(rsi_ent, linestyle=dashed, linewidth=2)
hline(rsi_ext, linestyle=dashed, linewidth=2)
Quindi, ora che possiamo contare il numero di barre da quando l’RSI è passato al di sotto di un certo livello, dobbiamo semplicemente controllare ogni barra per vedere se l’RSI torna sopra i 30 E il valore di barssince()
è inferiore al numero desiderato di barre. In caso positivo, entriamo in posizione.
Infine, per rendere questa strategia completa, aggiungiamo una condizione di uscita molto semplice. In questo caso, corrisponde a quando l’RSI che attraversa un secondo livello.
Ora diamo un’occhiata a come appare lo script sul grafico.
Questo grafico è stato appositamente selezionato in quanto mostra 2 cose che ci aiutano a verificare che il codice funzioni come previsto. Innanzitutto, possiamo vedere che l’RSI è sceso sotto i 30 in 3 occasioni. Tuttavia, durante uno di questi cali, ci sono volute 6 barre prima di tornare sopra i 30. Come possiamo vedere sul grafico, la strategia non è entrata in posizione. Inoltre possiamo confermare i casi positivi in cui l’RSI è sceso sotto i 30, per poi risalire sopra entro le successive 5 barre.
Codice completo
In questo articolo abbiamo descritto come monitorare e recuperare i dati con Tradingview per il trading algoritmico. Per il codice completo riportato in questo articolo, si può consultare il seguente repository di github:
https://github.com/datatrading-info/TradingView