In questo articolo descriviamo e testiamo una strategia di breakout delle bande della media mobile con Tradingview per il trading algoritmico. In particolare vogliamo sviluppare una semplice, e probabilmente non profittevole, strategia per applicare alcune funzioni di tradingview descritte negli articoli precedenti. Ad esempio sviluppiamo una strategia del tipo “se il prezzo supera al rialzo un livello posto al 10% da una media mobile, andiamo long o short e chiudiamo la posizione quando il prezzo raggiunge di nuovo la media mobile o con un 10 % di stop loss.
Obiettivo
Scomponendo la strategia, possiamo evidenziare i seguenti requisiti:
- Criteri long:
- il valore
Close
deve essere > di un livello superiore del x% dalla media mobile - il valore
Close
deve essere stato sopra il livello del x% dalla media mobile per n barre (rimane al 10% della distanza dalla SMA)
- il valore
- Criteri short:
- Come i criteri long ma considerando
Close
< di un livello inferiore del x% dalla media mobile
- Come i criteri long ma considerando
- Criteri di uscita
- Prima Exit: quando il prezzo tocca la media mobile
- Seconda Exit: fisso lo stop loss a x% dall’entrata
I requisiti di questa strategia prevedono di usare lo stop loss per uscire da una posizione il più vicino possibile alla SMA. Da notare che la seconda uscita potrebbe ridondante per le medie mobili veloci o strumenti volatili perché in questi casi la SMA è spesso più vicino al prezzo del 10% e quindi si attiva la prima uscita. Infine vediamo alcuni input in modo da poter raggiungere il 10% in poco tempo.
Breakout delle bande della media mobile
//@version=3
strategy("Breakout x% MA Strat", overlay=true)
lkb = input(200, minval=2, title='SMA Lookback Period')
delta = input(10, step=0.25, title='Entry Delta from MA')/100
bars = input(4, minval=0, title='Min Bars Above/Below Delta')
sl = input(10, step=0.25, title='Stop-Loss Percent')/100
// Creare Medie mobili
ma = sma(close, lkb)
ma_upper = ma * (1 + delta)
ma_lower = ma * (1 - delta)
// ------------------
// CONDIZIONI ENTRATA
// ------------------
// Breakout
long_break = crossover(close, ma)
since_long_break = barssince(long_break)
short_break = crossunder(close, ma)
since_short_break = barssince(short_break)
long_entry = close >= ma_upper and since_long_break >= bars
short_entry = close <= ma_lower and since_long_break >= bars
strategy.entry("Long", strategy.long, when=long_entry)
strategy.entry("Short", strategy.short, when=short_entry)
// -----------------
// CONDIZIONI USCITA
// -----------------
// stop loss
long_stop = strategy.position_avg_price * (1 - sl)
short_stop = strategy.position_avg_price * (1 + sl)
// Individua se il prezzo raggiunge lo stop loss o la MA
long_exit = long_stop > ma ? long_stop : ma
short_exit = short_stop < ma ? short_stop : ma
strategy.exit("Long SL", "Long", stop=long_exit)
strategy.exit("Short SL", "Short", stop=short_exit)
ma_plot = plot(ma, color=maroon, linewidth=2, title='Moving Average')
ma_upper_plot = plot(ma_upper, color=red, linewidth=1, title='MA Upper Boundary')
ma_lower_plot = plot(ma_lower, color=red, linewidth=1, title='MA Lower Boundary')
fill(ma_lower_plot, ma_upper_plot, color=silver, transp=70)
Commento al codice
La prima parte del codice verifica se siamo oltre il 10% al di sopra o al di sotto del prezzo. Possiamo farlo facilmente calcolando la SMA con i prezzi close
e definire le bande superiori e inferiori al 10% della SMA. Queste bande non sono solo utili per tracciare, ma permettono facilmente di verificare se siamo al di sopra della soglia in un dato momento. Il secondo requisito è assicurarci di rimanere al di sopra della banda. A tale scopo usiamo barssince()
e un semplice crossover()
. Una volta incrociata la banda superiore (per i long) o la banda inferiore (per gli short), iniziamo a contare le barre che rimangono al di sopra (o al di sotto) di essa. Se ripartiamo nella direzione opposta, non è necessario resettare since_long_break
e since_short_break
perché quando accade, non saremo più sopra/sotto del 10% e non potremo più entrare in una posizione quindi non influenza i risultati.
Relativamente alle uscite, abbiamo due possibili scenari ed entrambi utilizzano lo stesso stop loss. Ricapitolando, la prima strategia prevede di uscire quando il prezzo raggiunge la media mobile. La seconda prevede di uscire con uno stop loss fisso. Idealmente, non vogliamo avere due ordini di stop loss separati sul mercato perché se abbiamo un movimento volatile, entrambi potrebbero essere colpiti sulla stessa barra e mandarci in una posizione indesiderata nella direzione opposta. Pertanto, nell’esempio di codice precedente, usiamo un operatore condizionale ternario per capire quale stop è più vicino al prezzo e quindi inviamo un singolo ordine di uscita al livello più vicino. In altre parole se lo stop loss fisso (10%) è più vicino, usiamo il livello di stop loss fisso. Al contrario, se la media mobile è più vicina, impostiamo uno stop al livello corrente della media mobile.
Grafico
L’esecuzione della strategia si traduce in un grafico simile a questo:
Ignorando la performance, è utile concentrarsi su come queste tecniche possono essere adattate e usate nelle proprie strategie. Sicuramente questa strategia è una parte di una logica più complessa su cui possiamo lavorare.
Codice completo
In questo articolo abbiamo descritto come implementare una strategia di breakout delle bande della media mobile 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