Stop Loss con ATR in Tradingview

Stop Loss con l’ATR in Tradingview

In questo articolo descriviamo come implementare lo Stop Loss con l’ATR in Tradingview per il trading algoritmico. Scegliere una posizione di stop ideale può essere complicato, specialmente quando non possiamo basarci su uno swing o un livello di breakout. Un metodo molto richiesto prevede di usare il livello del Average True Range (ATR) o multiplo di esso per il calcolare il valore dello stop loss.

L’ATR come Stop Loss

Usare l’ATR per definire lo Stop Loss ci permette di impostare lo stop a una  distanza realistica dal prezzo. Inoltre, si calibra  automaticamente in base alla volatilità dato che si aggiorna sempre per ogni nuova candela dei prezzi.

ATR ci fornisce un’indicazione del probabile limite dei movimenti dei prezzi per una data barra. In altre parole prevedere uno stop loss pari a 1 x ATR nel timeframe che stiamo operando significa che prevediamo uno stop pari alla volatilità della barra. Questo obiettivo non è l’ideale perchè si possono verificare molti stop loss dopo solo una barra. Vogliamo che i trade durino più di qualche barra, a meno che non sia parte  di una specifica strategia! Per questo motivo preferiamo usare un multiplo dell’ATR OPPURE usare il valore di un ATR relativamo a un periodo più elevato. Con entrambi questi metodi  ci assicuriamo che i trade  siano meno sensibili al movimento dei prezzi e quindi non si rischia di chiudere in anticipo una posizione redditizia solamente perché lo stop è troppo stretto.

Nel seguente esempio usiamo entrambi i metodi. Impostiamo lo stop loss usando i livelli giornalieri di ATR e prevediamo un input per impostare un multiplo.

Stop Loss con l’ATR in Tradingview

				
					//@version=3
strategy("Daily ATR Stop", overlay=true, precision=5)

smaFastLkb = input(14, minval=1, title='Fast SMA Period')
smaSlowLkb = input(28, minval=1, title='Slow SMA Period')
atrLkb = input(7, minval=1, title='ATR Stop Period')
atrRes = input("D", type=resolution, title='ATR Resolution')
atrMult = input(1, step=0.25, title='ATR Stop Multiplier') 

// Calcolo Indicatori
// -------------------
atr = security(tickerid, atrRes, atr(atrLkb))
smaFast = sma(close, smaFastLkb)
smaSlow = sma(close, smaSlowLkb)

longCondition = crossover(smaFast, smaSlow)
if (longCondition)
    strategy.entry("Long", strategy.long)

shortCondition = crossunder(smaFast, smaSlow)
if (shortCondition)
    strategy.entry("Short", strategy.short)

// Calcolo ATR Stop loss
longStop = na
longStop :=  shortCondition ? na : longCondition ? close - (atr * atrMult) : longStop[1]
shortStop = na
shortStop := longCondition ? na : shortCondition ? close + (atr * atrMult) : shortStop[1]
    
// Inviare le uscite
strategy.exit("Long ATR Stop", "Long", stop=longStop)
strategy.exit("Short ATR Stop", "Short", stop=shortStop)
    
// Grafico Stop Loss
plot(smaFast, color=orange, linewidth=2, title='Fast SMA')
plot(smaFast, color=purple, linewidth=2, title='Slow SMA')
plot(longStop, style=linebr, color=red,     title='Long ATR Stop')
plot(shortStop, style=linebr, color=maroon,  title='Short ATR Stop')
				
			

Commento

La logica alla base dello stop loss con l’ATR è racchiusa in 4 righe. Prima di calcolare i livelli di stop ATR, inseriamo solo il valore ATR giornaliero tramite la funzione security() e creiamo una semplice strategia di crossover della media mobile.

Dobbiamo aggiornare le variabili longStopshortStop solamente in due condizioni. Per semplicità, descriviamo solo la logica per longStop, per shortStop si ha la stessa logica al contrario.

Se rileviamo una shortCondition allora impostiamo longStopna. Lo facciamo principalmente per  migliorare la visualizzazione nel grafico. In questo modo non disegniamo un livello di stop long di sotto del prezzo quando siamo in una posizione short. Successivamente, se si verifica una longCondition, impostiamo longStop sul valore corrente dell’atr moltiplicato per il valore di atrMult. Questo diventa il livello di stop iniziale. Successivamente, continuiamo ad aggiornare il livello di stop con il valore precedente utilizzando longStop[1]. In questo modo mentre siamo in una posizione short, la linea continuerà a essere na. Al contrario, mentre siamo in una posizione long, la linea continua ad avere lo stesso valore di quando abbiamo inviato il nostro ordine di entrata.

Per ulteriori esempi di questa tecnica, si può leggere l’articolo Tradingview: Gestire le Variabili.

Infine, per effettuare il foward test di questo codice, dobbiamo effettuare il repainting nel timeframe superiore per correggere il livello ATR giornaliero mentre la barra giornaliera è ancora in fase di formazione.

Un metodo alternativo

Poiché gli stop loss rimangono sul mercato fino a quando non sono attivati, un altro metodo per soddisfare questo requisito sarebbe l’invio di un singolo ordine di stop loss al momento dell’entrata. A tale scopo possiamo usare la funzione strategy.exit() con strategy.entry() all’interno dell’istruzione if. L’ordine di stop loss è inviato una sola volta al momento della longCondition e non  si aggiorna successivamente. In dettaglio, non possiamo inviare un aggiornamento all’ordine “Long ATR Stop” a meno che  longCondition non sia nuovamente soddisfatto. Dato che abbiamo una strategia di crossover, il crossover non può verificarsi nuovamente fino a quando non abbiamo  chiuso la posizione precedente e aperto una posizione short!

Lo svantaggio di questo metodo è che non abbiamo una bella linea retta se desideriamo tracciare la linea dello stop loss, a meno che non ricreiamo il longStop del codice  precedenete.

Non aggiornare il valore dello stop loss

Se abbiamo un valore longCondition che è soddisfatto mentre siamo  ancora in una posizione long, il valore ATR può essere aggiornato accidentalmente. Questo influenza entrambi i metodi descritti. In questi casi il livello di stop loss è impostato con l’ultimo valore dell’ATR quando longCondition è verificata per la seconda volta.

Se vogliamo continuare ad usare il valore iniziale, dobbiamo aggiungere un’ulteriore condizione per verificare che non abbiamo una posizione parte, come nel seguente esempio:

				
					
// Calcolo ATR Stop
longStop = na
longStop :=  shortCondition ? na : longCondition and strategy.position_size <=0 ? close - (atr * atrMult) : longStop[1]
shortStop = na
shortStop := longCondition ? na : shortCondition and strategy.position_size >=0 ? close + (atr * atrMult) : shortStop[1]
				
			

In questo modo aggiorniamo lo stop loss solo quando proveniente da una posizione flat o short (nel caso di posizioni  long).

Grafico e verifica

Posizionando la strategia sui grafici, otteniamo qualcosa che assomiglia a questo:

Stop Loss con ATR in Tradingview

Da notare che più basso è il timeframe usato più lontano appare lo stop ATR giornaliero sul grafico. Quindi, non lo vediamo dobbiamo regolare la scala del grafico. Uno stop loss con ATR giornaliero può essere abbastanza lontano in un timeframe a 1 minuto.

Passiamo ora a verificare se usiamo i corretti livelli di ATR. A tale scopo dobbiamo  ricavare il valore dell’ATR giornaliero e verificare se tale valore è applicato allo stop loss.

Dobbiamo assicurarci di:

  • Verificare che il periodo di ricerca  dell’ATR usato nella strategia sia lo stesso dell’indicatore presente nel grafico. In questo caso, entrambi sono impostati su 14, quindi non ci sono problemi.
  • Verificare che la risoluzione dell’indicatore e della strategia sia la stessa. Altrimenti, Tradingview arrotonderà il valore dell’indicatore e potrebbe sembrare che il valore sia sbagliato.
Tradingview-Daily-ATR-Calculation
Tradingview-Daily-ATR-Same-Value

Perché i valori sono in ritardo

Da notare che le date nell’ultimo screenshot sono disallineate. Il valore ATR usato sembra essere del giorno precedente. Nello specifico, l’11 marzo usiamo il valore ATR dell’8 marzo (essendoci il fine settimana, l’8 marzo era la barra precedente).

Questo accade perché stiamo usando la  funzione security() con la versione 3 di pine script. In questa versione si tenta di evitare il “Lookahead Bias” assicurando che il valore ATR finale del giorno corrente non sia disponibile fino alla chiusura della barra del giorno corrente. Ulteriori informazioni in merito sono descritte nell’articolo sul repainting degli indicatori .

Codice completo

In questo articolo abbiamo descritto come implementare lo Stop Loss con l’ATR in 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

Gli altri articoli di questa serie

Benvenuto su DataTrading!

Sono Gianluca, ingegnere software e data scientist. Sono appassionato di coding, finanza e trading. Leggi la mia storia.

Ho creato DataTrading per aiutare le altre persone ad utilizzare nuovi approcci e nuovi strumenti, ed applicarli correttamente al mondo del trading.

DataTrading vuole essere un punto di ritrovo per scambiare esperienze, opinioni ed idee.

SCRIVIMI SU TELEGRAM

Per informazioni, suggerimenti, collaborazioni...

Torna in alto
Scroll to Top