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 longStop
e shortStop
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 longStop
a na
. 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:
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.
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