In questo articolo descriviamo come usare il Trailing Stop con Tradingview per il trading algoritmico, che è funzionalità integrata. In particolare, approfondiamo le logiche di funzionamento del trailing stop loss e le possibili criticità.
Disclaimer/Nota speciale: il problema discusso in questo articolo era presente al momento della stesura e nella versione 3 di pine-script.
Usare il Trailing Stop con Tradingview
Prima di dare uno sguardo più approfondito alle logiche, prima dobbiamo capire come impostare un trailing stop. La funzionalità di trailing stop di Tradingview può essere trovata all’interno della funzione strategy.exit()
. Questa funzione ha 3 parametri che permettono di definire quando il trailing stop inizia e quando termina.
Di seguito è riportato uno snippet del documentazione ufficiale di Tradingview:
trail_price (float) Un parametro facoltativo. Livello di attivazione del trailing stop (richiede un prezzo specifico). Se è specificato, si inserisce un ordine trailing stop quando si raggiunge il livello di prezzo specificato. L’offset (in tick) per determinare il prezzo iniziale dell’ordine trailing stop è specificato nel parametro ‘trail_offset’: X tick inferiori al livello di attivazione per uscire dalla posizione long; X tick superiori al livello di attivazione per uscire dalla posizione short. Il valore predefinito è ‘NaN’.trail_points (float) Un parametro facoltativo. Livello di attivazione del trailing stop (profitto specificato in tick). Se è specificato, si inserisce un ordine trailing stop quando si raggiunge il livello di prezzo calcolato (importo specificato del profitto). L’offset (in tick) per determinare il prezzo iniziale dell’ordine trailing stop è specificato nel parametro ‘trail_offset’: X tick inferiori al livello di attivazione per uscire dalla posizione long; X tick superiori al livello di attivazione per uscire dalla posizione short. Il valore predefinito è ‘NaN’.trail_offset (float) Un parametro facoltativo. Prezzo del trailing stop (specificato in tick). L’offset in tick per determinare il prezzo iniziale dell’ordine trailing stop: X tick inferiori a ‘trail_price’ o ‘trail_points’ per uscire dalla posizione long; X tick superiori a ‘trail_price’ o ‘trail_points’ per uscire dalla posizione short. Il valore predefinito è ‘NaN’.
Proprio come per gli ordini stop loss e limit, abbiamo due parametri che possiamo usare per impostare il livello dove si attiva il trailing stop loss. Il livello può essere un prezzo effettivo che vogliamo raggiungere o un numero di tick misurati dal livello di entrata.
Quindi cosa intendiamo per livello di attivazione? Bene, a volte non vogliamo che un trailing stop si avvii immediatamente non appena apriamo una posizione. Potremmo voler seguire il trail solo una volta raggiunto uno specifica percentuali o quantità di profitto. Questo è possibile tramite la definizione di un livello di attivazione.
Infine, abbiamo il trailing offset che specifica la distanza dal prezzo che vogliamo seguire. Questo parametro deve essere specificato in tick. Se vuoi approfondire il concetto di tick in tradingview puoi dare un’occhiata all’articolo su come lavorare con i tick con Tradingview.
Codice di esempio
Il seguente codice mostra come come usare il Trailing Stop con Tradingview. In particola il codice permette di impostare un trailing stop e fornisce alcuni semplici input che permettono di modificare i vari parametri e, quindi, verificare come influenzano i risultati.
//@version=3
strategy("Trailing Stop Loss Testing", overlay=true)
testStartYear = input(2019, "Backtest Start Year")
testStartMonth = input(10, "Backtest Start Month")
testStartDay = input(06, "Backtest Start Day")
testType = input('Trail Points', "Test Points or Price", options=['Trail Points', 'Trail Price'])
trailLevel = input(1.34193, "Trail Price", type=float, step=0.0001)
trailPoints = input(150, "Trail Points (in ticks)", type=integer)
trailOffset = input(100, "Trail Offset (in ticks)", type=integer)
testPeriodStart = timestamp(testStartYear, testStartMonth, testStartDay, 0, 0)
longCondition = time >= testPeriodStart
if (longCondition)
strategy.entry("Go Long", strategy.long)
strategy.exit("Trailing Stop", "Go Long", trail_points= trailPoints, trail_offset= trailOffset, when= testType == 'Trail Points')
strategy.exit("Trailing Stop", "Go Long", trail_price= trailLevel, trail_offset= trailOffset, when= testType == 'Trail Price')
Il codice inizia semplicemente ad acquistare non appena viene raggiunta la data del backtest. Dopo essere entrati in posizione, si inserisce un trailing stop loss in base alle opzioni specificate. A seconda di quando applichiamo questo codice e su quale strumento eseguiamo il test, dobbiamo aggiornare la data di inizio e i livelli di prezzo .
Test dei parametri
Prendiamoci del tempo per esaminare ogni singolo parametro e come influisce sui risultati. Proviamo a rendere più semplice possibile gli esempi seguenti, quindi consigliamo di eseguire il codice e gli esempi sui mercati FX. Perché? Come abbiamo descritto nell’articolo su come lavorare con i tick, un tick equivale a una pipette. In questo modo è più facile misurare e verificare i risultati su timeframe inferiori.
Trail Price + Trail Offset
Nel primo esempio, vediamo come usare il parametro trail_price
. Come accennato in precedenza, il prezzo trail determina il livello di prezzo dove si attiva il trailing stop. Il trail_offset
determina quanto lo stop è inferiore al prezzo.
Come possiamo vedere nel grafico, il trailing stop si attiva solamente dopo aver raggiunto il Prezzo Trail. Successivamente, il trailing stop si sposta verso l’alto “seguendo” il prezzo high
di ogni barra fino il prezzo scende fino a raggiungere il Prezzo Trail.
Trail Points + Trail Offset
Il secondo esempio segue esattamente lo stesso scenario ma volta usiamo il parametro trail_points
per impostare il livello di attivazione del profitto.
Come possiamo vedere nel secondo esempio, i trail point sono usati esattamente allo stesso modo. Siamo in grado di fare un confronto con l’esempio precedente misurando il nostro livello di attivazione desiderato e impostando opportunamente il numero di tick.
Quindi, proviamo a regolare l’offset. Notiamo che il livello di uscita si sposta su e giù mentre regoliamo l’offset. Si muove verso l’alto man mano che riduciamo lo stop, mentre si muove verso il basso mentre lo aumentiamo. Alla fine, l’uscita si sposta su altre barre se i parametri di input sono modificati in modo significativo.
Potenziali problemi con il trailing stop
Successivamente, passiamo a dare un’occhiata ad alcuni problemi che possono portare ad aspettative non realistiche. Ad essere onesti, questi non sono problemi di per sé. Sono limitazioni nel lavorare con dati storici e ricevere tutti quei dati contemporaneamente. Tuttavia, come vedremo, è preferibile che Tradingview adotti un approccio alternativo quando è necessario decidere come gestire questa limitazione.
Profitti esagerati
Il problema con la logica del trailing stop con Tradingview è l’ipotesi che il movimento del prezzo all’interno di una barra sia sempre a nostro favore. Se immaginiamo di ricevere i dati open
, high
, low
e close
nello stesso istante, non possiamo sapere se abbiamo toccato prima i massimi o prima i minimi. Inoltre, non possiamo sapere quante volte è rimbalzato tra i due. La seguente immagine aiuta a capire questo scenario.
Tradingview ci restiusice sempre il beneficio del dubbio. Se siamo in una posizione long, Tradingview presuppone che il prezzo raggiunga prima i massimi o poi i minimi. Se siamo in una posizione short, Tradingview presuppone che il prezzo raggiunga prima i minimi e poi i massimi. Possiamo vederlo chiaramente nel seguente esempio:
Peggio ancora, se impostiamo il trail a 0. In questo caso usciamo dalla parte superiore/inferiore di ogni candela, ottenendo il massimo dei profitti! Il seguente esempio mostra al meglio perché questo è un problema.
Personalmente, credo sia preferibile che Tradingview preveda la logica opposta e adottasse un approccio pessimista. Se applichiamo lo scenario peggiore e la strategia è ancora redditizia, possiamo aver trovato qualcosa di interessante. Invece, possiamo essere portati a credere che una strategia sia molto redditizia quando in realtà avremmo pochissime possibilità di replicare quei risultati nel mondo reale.
Ridurre al minimo il Drawdown
Come il motore di backtesting di Tradingview esagera nei profitti, allo stesso modo riduce le perdite e i drawdown. Se non prevediamo mai che il movimento del prezzo sia stato contro di noi prezzo si sia mosso contro di noi prima che a nostro favore, il livello di drawdown del backtest non sarà mai così negativo come sarebbe nella realtà con i dati reali.
Infine notiamo che questi piccoli profitti extra si sommano a formare un enorme rendimento nel corso di oltre 100 operazioni. Per vedere quanto questo può influire sui nostri risultati, possiamo aggiungere una piccola commissione alla strategia e vedere come ciò influisce sulla redditività.
Codice completo
In questo articolo abbiamo descritto come usare il Trailing Stop 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