In questo articolo descriviamo come visualizzare lo stop loss e il take profit nel grafico di Tradingview. Questa tecnica è già stata trattata in un paio di articoli su Tradingview ma non ho mai scritto un articolo dedicato sull’argomento.
Visualizzare lo Stop Loss e il Take Profit
In Pine Script dobbiamo usare i parametri stop
e limit
delle funzioni strategy.exit()
e strategy.order()
per inviare ordini stop loss e take profit. Anche la funzione strategy.entry()
supporta l’invio degli ordini stop
e limit
ma in questo caso gli ordini sono considerati un’entrata invece che uno stop loss o un take profit e quindi fuori dallo scopo di questo articolo.
Le tecniche descritte in questo articolo possono essere usate per le entrate e praticamente per qualsiasi linea che desideriamo tracciare/visualizzare.
Invio degli ordini
Visualizzare lo stop loss e il take profit può essere complicato per due motivo:
- Stiamo usando i parametri
profit
eloss
invece distop
elimit
- Calcoliamo il livello dello stop loss e/o del take profit una volta sola al momento dell’entrata.
I profit
e loss
sono misurati in ticks
, quindi i numeri usati per alimentare questi parametri non forniscono un naturale livello di prezzo che possiamo tracciare. Quindi dobbiamo implementare una funzione per visualizzare correttamente il livello. Nota: le varie opzioni di stop loss sono descritte in questo articolo.
Il secondo motivo si verifica quando desideriamo usare calcoli complessi per lo stop loss che possono cambiare da una barra all’altra. Ad esempio, se prevediamo di impostare il valore stop
di una entrata long come low
–ATR
(Average True Range ) e non inseriamo la funzione strategy.exit()
all’interno di un istruzione if
, otteniamo che la linea di stop si modifica ad ogni barra quando il valore ATR
è aggiornato.
Esempio
Prima di descrivere una soluzione, descriviamo un semplice esempio su come inserire strategy.exit()
all’interno di un’istruzione if
nel caso abbiamo problemi a visualizzarla. L’esempio seguente calcola il livello di stop
e invia l’ordine solo una volta quando è soddisfatta la longCondition
o shortCondition
.
//@version=3
strategy("My Strategy", overlay=true)
ATR = atr(7)
longCondition = crossover(sma(close, 100), sma(close, 200))
if (longCondition)
stop_level = low - ATR
profit_level = close + ATR
strategy.entry("My Long Entry Id", strategy.long)
strategy.exit("TP/SL", "My Long Entry Id", stop=stop_level, limit=profit_level)
shortCondition = crossunder(sma(close, 100), sma(close, 200))
if (shortCondition)
stop_level = high + ATR
profit_level = close - ATR
strategy.entry("My Short Entry Id", strategy.short)
strategy.exit("TP/SL", "My Short Entry Id", stop=stop_level, limit=profit_level)
che si traduce in un grafico simile a questo:
Soluzione per la visualizzazione
La chiave per visualizzare lo stop loss e il take profit in un grafico è creare una series
(nuova linea/variabile) che è aggiornata solo quando lo stop loss è aggiornato. Ad esempio, se inviamo un ordine di stop loss solo una volta quando si verifica la longCondition
, nello momento aggiorniamo anche la nuova variabile series
. Altrimenti manteniamo lo stesso valore della barra precedente. Possiamo farlo usando tramite un operatore condizionale ternario, come descritto in un precedente articolo più dettagliato. L’esempio seguente espande il primo esempio in modo da visualizzare le linee e fissare i livelli.
//@version=3
strategy("My Strategy", overlay=true)
ATR = atr(7)
longCondition = crossover(sma(close, 100), sma(close, 200))
if (longCondition)
strategy.entry("My Long Entry Id", strategy.long)
shortCondition = crossunder(sma(close, 100), sma(close, 200))
if (shortCondition)
strategy.entry("My Short Entry Id", strategy.short)
long_stop_level = na
long_profit_level = na
long_stop_level := longCondition ? low - ATR : long_stop_level[1]
long_profit_level := longCondition ? close + ATR : long_profit_level[1]
short_stop_level = na
short_profit_level = na
short_stop_level := shortCondition ? high + ATR : short_stop_level[1]
short_profit_level := shortCondition ? close - ATR : short_profit_level[1]
strategy.exit("TP/SL", "My Long Entry Id", stop=long_stop_level, limit=long_profit_level)
strategy.exit("TP/SL", "My Short Entry Id", stop=short_stop_level, limit=short_profit_level)
plot(strategy.position_size <= 0 ? na : long_stop_level, color=red, style=linebr, linewidth=2)
plot(strategy.position_size <= 0 ? na : long_profit_level, color=green, style=linebr, linewidth=2)
plot(strategy.position_size >= 0 ? na : short_stop_level, color=red, style=linebr, linewidth=2)
plot(strategy.position_size >= 0 ? na : short_profit_level, color=green, style=linebr, linewidth=2)
Commento
Prima di iniziare, sottolineiamo che l’esempio precedente può essere implementato usando il metodo valuewhen()
, come descritto nell’articolo relativo alla gestione delle variabili con Tradingview. Tuttavia, è una buona idea acquisire familiarità con gli operatori condizionali ternari perchè ci permettono di creare alcuni trailing stop loss complessi e unici. Sebbene il codice sembra più lungo, in realtà ci sono solo poche modifiche tra il primo esempio e quest’ultimo. La prima differenza è che il metodo strategy.exit()
non è inserito all’interno di una dichiarazione if
, quindi l’ordine è aggiornato ad ogni nuova barra. In questo caso non abbiamo impatti perchè il valore non cambia. Successivamente, calcoliamo i livelli tramite la dichiarazione di ciascuno series
con long_stop_level = na
. Dato che il codice è scritto nella versione 3 di pinescript e vogliamo fare riferimento a un valore precedente della stessa series
(es long_stop_level[1]
), riceviamo un errore se non lo dichiariamo prima. Gli operatori condizionali ternari possono inizialmente sembrare complicati, ma essenzialmente significano (nel caso long):
- Se la
longCondition
è soddisfatta, impostiamo la linealow
–ATR
. - In caso contrario, manteniamo il valore precedente.
Infine, facciamo solo un piccolo grafico creativo per assicurarci di non tracciare le linee quando non vogliamo visualizzarle. Questo aiuta solamente ad avere un grafico semplice e ordinato. Anche in questo caso usiamo un operatore condizionale ternario a tale scopo.
I grafici
Dopo aver eseguito il codice otteniamo un grafico simile al seguente:
Percentuale fissa di stop/profitti
Se vogliamo semplicemente impostare uno stop loss o take profit ad una x% di distanza dal livello di ingresso e NON stiamo piramidando (entrando nella stessa direzione più volte), possiamo semplicemente usare la variabile strategy.position_avg_price
per calcolare i valori. (Questo esempio è descritto nell’articolo relativo allo stop loss per Tradingview )
//@version=3
strategy("Stop Loss Example: Simple Stoploss", overlay=true)
sma_per = input(200, title='SMA Lookback Period', minval=1)
sl_inp = input(2.0, title='Stop Loss %', type=float)/100
tp_inp = input(4.0, title='Take Profit %', type=float)/100
sma = sma(close, sma_per)
stop_level = strategy.position_avg_price * (1 - sl_inp)
take_level = strategy.position_avg_price * (1 + tp_inp)
strategy.entry("Simple SMA Entry", strategy.long, when=crossover(close, sma))
strategy.exit("Stop Loss/TP","Simple SMA Entry", stop=stop_level, limit=take_level)
plot(sma, color=orange, linewidth=2)
plot(stop_level, color=red, style=linebr, linewidth=2)
plot(take_level, color=green, style=linebr, linewidth=2)
Commento
Quando non abbiamo una posizione a mercato il valore strategy.position_avg_price
è pari a na
. Questo è utile nel grafico perché possiamo visualizzare la linea di stop loss solo quando siamo in una posizione. Il valore na
non è mai tracciato e quindi non è necessario aggiungere un operatore condizionale ternario come nell’esempio precedente. Nota: per garantire che le linee siano visualizzate in modo ordinato, dobbiamo usare lo stile linebr
. In questo modo non abbiamo lunghe linee che uniscono i gap quando il valore è na
. Vediamo la differenza se usiamo uno stile di linea normale.
Codice completo
In questo articolo abbiamo descritto come visualizzare lo stop loss e il take profit nel grafico di Tradingview. Per il codice completo riportato in questo articolo, si può consultare il seguente repository di github:
https://github.com/datatrading-info/TradingView