In questo articolo descriviamo come usare le funzioni highestbars() e lowestbars() per individuare massimi e minimi con Tradingview ed applicarli alle strategie di trading algoritmico. Approfondiamo quindi la logica di queste funzioni, il loro output e come possono essere usate.
La logica delle funzioni
Le funzioni highestbars() e lowestbars() restituiscono il numero di barre dall’ultima barra fino al highest high
o lowest low
dentro un determinato intervallo di tempo. Le funzioni restituiscono un numero negativo che si riferisce all’offset della posizione della barra rispetto all’ultima.
Ecco un estratto dalla documentazione ufficiale per highestbars()
:
highestbars
Highest value offset for a given number of bars back.
highestbars(source, length) → series[integer]
highestbars(length) → series[integer]
RETURNS
Offset to the highest bars
Poiché gli offset sono usate solamente per i grafici, lo scopo originale di queste funzioni era probabilmente per l’uso all’interno di una delle tante funzioni plot()
. Inoltre, possiamo escludere l’indicizzazione come caso d’uso principale perché se proviamo a eseguire l’indicizzazione con un numero negativo, riceviamo un errore. Come con qualsiasi strumento, possiamo essere creativi e utilizzarlo per scopi dove non era originariamente previsto. Ad esempio, vedremo come usarlo per l’indicizzazione in uno dei codice descritti seguito tramite una semplice trasformazione dell’output in un numero positivo.
Nota: In tutti i seguenti esempi usiamo solamente la funzione highestbars()
. La funzione lowestbars()
lavora esattamente allo stesso modo con la sola differenza che conteggia dal lowest low
.
Individuare massimi e minimi con Tradingview
Vediamo come visualizzare il grafico dell’output di un indicatore per avere un’idea dei valori che produce la funzione.
//@version=3
study("RSI Highestbars")
rsi = rsi(close, 14)
hb = highestbars(rsi, 20)
plot(hb, color=purple)
Nel codice precedente calcoliamo l’offset della barra con il valore RSI
più alto per le ultime 20 barre. Abbiamo molte aree dove possiamo prevedere dei miglioramenti dato che non è necessario usarlo semplicemente con i dati dei prezzi dal grafico a candele. Proviamo ad inserire diversi dati series
come sorgente.
Quando eseguiamo il codice, notiamo alcune cose:
Esempio uno: grafico
Vediamo come funziona l’output di base, possiamo passare all’esplorazione di diversi casi d’uso e non c’è caso migliore per iniziare che quello per cui la funzione era destinata! In questo esempio usiamo offset
insieme a show_last
per evidenziare il massimo più recente sul grafico. Tramite il parametro show_last
evidenziamo il massimo più recente.
//@version=3
study("Highestbars - Use Case 1")
rsi = rsi(close, 7)
hb = highestbars(rsi, 20)
plot(rsi)
// Show most recent high
bgcolor(red, offset=hb, show_last=1, title='Most Recent High')
Nel seguente grafico vediamo come il massimo più recente dell’RSI è evidenziato con uno sfondo rosso:
Esempio due: looping
Il secondo esempio è leggermente diverso. Usiamo l’output per scorrere e analizzare tutte le barre dal momento in cui abbiamo l’highest high
per prendere una decisione di trading. Durante il ciclo, effettuiamo il conteggio di tutte le barre rialziste e ribassiste sul grafico.
//@version=3
study("Highest Bars - Use Case Two")
rsi = rsi(close, 7)
hb = highestbars(rsi, 20)
plot(rsi)
redbars = 0
greenbars = 0
// bisogna usare il meno '-' per convertire in un numero positivo
for i = 0 to -hb
greenbars:= close[i] > open[i] ? greenbars + 1 : greenbars
redbars:= close[i] < open[i] ? redbars + 1 : redbars
plot(redbars, style=columns, color=red, transp=70)
plot(greenbars, style=columns, color=green, transp=70)
Questo esempio è un po’ più complesso. Prevediamo di cambiare il valore restituito da highestbars()
in un valore assoluto, cioè passare da negativo a positivo. Solo con un valore positivo possiamo usare correttamente l’indicizzazione. A tale scopo possiamo usare la funzione abs()
o, come nell’esempio, mettere un -
segno davanti alla variabile. Quindi scorriamo l’intervallo contando se la barra si è chiusa al rialzo o al ribasso.
Posizionando questo script sui grafici otteniamo quanto segue:
Esempio tre: ritracciamenti
Nell’esempio finale, usiamo la funzione highestbars()
per calcolare quanto il prezzo ha ritracciato dal massimo più recente. Questo potrebbe essere utile per attivare entrate proprio su alcuni livelli di Fibonacci.
L’esempio può essere replicato completamente usando anche la funzione highest()
. È solo uno dei tanti casi dove non esiste una sola risposta corretta. La cosa importante è usare gli strumenti con cui ci sentiamo a nostro agio e ci consentono di raggiungere l’obiettivo.
//@version=3
study("Highest Bars - Use Case Three")
rsi = rsi(close, 7)
hb = highestbars(rsi, 20)
plot(rsi)
// Mostra la percentuale di ritracciamento dal massimo
// E' sempre 0 o negativo per misura la distanza dal punto di massimo
diff = ((rsi - rsi[-hb]) / rsi[-hb]) * 100
plot(diff, color=black, title='RSI Retracment')
// Possiamo usare anche higest()
diff_alt = ((rsi - highest(rsi, 20)) / highest(rsi, 20) ) * 100
plot(diff_alt, color=black, title='RSI Retracment - Highest()')
Come possiamo vedere nel codice, abbiamo implementato lo stesso esempio sia con la funzione highestbars()
che con highest()
. Notiamo che nel grafico le due linee producono esattamente lo stesso valore.
Nota: Nell’immagine la linea di ritracciamento è sempre zero o inferiore perché non possiamo mai essere al di sopra del massimo!
Codice completo
In questo articolo abbiamo descritto come individuare massimi e minimi 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