In questo articolo descriviamo come implementare una strategia trend following HLHB sul Forex con Tradingview per il trading algoritmico. Questa strategia è stata pubblicata su BabyPips.com, uno dei pochi siti in cui gli autori si mettono in gioco e pubblicano gratuitamente sistemi di trading completi. Quindi, indipendentemente dai risultati, dobbiamo apprezzare le persone disposte a fornire queste risorse da cui tutti possiamo imparare.
Strategia Trend Following HLHB sul Forex
La strategia è stata pubblicata nel 2015 ed oggi è ancora in fase di aggiornamento. Si basa su un semplice sistema progettato per catturare i trend a breve termine nel forex. Il sistema è composto da una semplice strategia di crossover EMA con un paio di altri indicatori usati come conferma dei setup.
Vediamo il set di regole.
Indicatori
- EMA (5)
- EMA (10)
- RSI (10)
- ADX (14)
Criteri di entrata
- Long
- l’EMA 5 incrocia al rialzo l’EMA 10 e,
- l’RSI incrocia al rialzo il livello 50 e,
- l’ADX è maggiore di 25
- Short
- EMA 5 incrocia al ribasso l’EMA 10 e,
- l’RSI incrocia al ribasso il livello 50 e,
- l’ADX è maggiore di 25
Criteri di uscita
- Take Profit a 400 pips
- Trailing Stop Loss a 150 pips
- Se abbiamo un segnale di ingresso opposto (invertiamo la posizione)
- Chiudiamo tutte le posizioni alla fine della settimana.
Ulteriori letture
Per tutti i dettagli del sistema, si può leggere i seguenti articoli:
- Strategia principale: https://www.babypips.com/trading/forex-hlhb-system-explained
- Aggiornamento 1 – Modifica ai target SL/TP: https://www.babypips.com/trading/forex-hlhb-20170129
- Aggiornamento 2 – Aggiunta ADX: https://www.babypips.com/trading/forex-hlhb-system-20190311
La strategia è stata aggiornata alcune volte. In questo articolo implementa il set di regole più recente. Tuttavia, ci sono diversi aggiornamenti ed esperimenti che sono stati eseguiti nel corso degli anni, quindi è possibile che manchi qualcosa.
Il codice
//@version=3
strategy("HLHB Trend-Following System", shorttitle="HLHB TFS", overlay=true,
default_qty_type=strategy.percent_of_equity, default_qty_value=100)
// -----------------------------------------------------------------------------
// STRATEGY REQUIREMENTS
// -----------------------------------------------------------------------------
//
// Setup
// -----
// - EUR/USD 1-hour chart
// - GBP/USD 1-hour chart
// - 5 EMA: blue line
// - 10 EMA: red line
// - RSI (10) applied to the median price (HL/2)
// - ADX (14)
//
// Entry
// -----
// - BUY when the 5 EMA crosses above the 10 EMA from underneath and the RSI
// crosses above the 50.0 mark from the bottom.
// - SELL when the 5 EMA crosses below the 10 EMA from the top and the RSI
// crosses below the 50.0 mark from the top.
// - Make sure that the RSI did cross 50.0 from the top or bottom and not just
// ranging tightly around the level.
// - ADX > 25 for Buy and Sells
//
// Exit
// ----
// - Use a 50-pip trailing stop and a 200-pip profit target. This increases the
// chances of the system riding longer trends.
// - Close the trade when a new signal materializes.
// - Close all trades by the end of the week.
//
// -----------------------------------------------------------------------------
// Variabili della strategia
// -------------------
ema_fast_len = input(5, title='Fast EMA Length')
ema_slow_len = input(10 , title='Slow EMA Length')
rsi_len = input(10, title='Slow EMA Length')
session_end_hour = input(16, minval=0, maxval=23, title='Weekly Session End (Hour)')
session_end_minute = input(0, minval=0, maxval=59, title='Weekly Session End (Minute)')
profit_target = input(400, title='Profit Target (Pips/Points)')
trailing_stop_dist = input(150, title='Trailing Stop Distance (Pips/Points)')
adx_filt = input(true, title='User ADX Filter')
adx_min = input(25, minval=0, title='Minimum ADX Level')
adx_len = input(14, title="ADX Smoothing")
di_len = input(14, title="DI Length")
// Indicatori
ema_fast = ema(close, ema_fast_len)
ema_slow = ema(close, ema_slow_len)
rsi_ind = rsi(close, rsi_len)
// ADX
adx_dirmov(len) =>
up = change(high)
down = -change(low)
plusDM = na(up) ? na : (up > down and up > 0 ? up : 0)
minusDM = na(down) ? na : (down > up and down > 0 ? down : 0)
truerange = rma(tr, len)
plus = fixnan(100 * rma(plusDM, len) / truerange)
minus = fixnan(100 * rma(minusDM, len) / truerange)
[plus, minus]
adx_adx(dilen, adxlen) =>
[plus, minus] = adx_dirmov(dilen)
sum = plus + minus
adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen)
[adx, plus, minus]
[adx_sig, adx_plus, adx_minus] = adx_adx(di_len, adx_len)
// Logica della strategia
ema_long_cross = crossover(ema_fast, ema_slow)
ema_short_cross = crossunder(ema_fast, ema_slow)
rsi_long_cross = crossover(rsi_ind, 50)
rsi_short_cross = crossunder(rsi_ind, 50)
adx_check = adx_filt ? adx_sig >= adx_min : true
longCondition = ema_long_cross and rsi_long_cross and adx_check
if (longCondition)
strategy.entry("Long", strategy.long)
shortCondition = ema_short_cross and rsi_short_cross and adx_check
if (shortCondition)
strategy.entry("Short", strategy.short)
strategy.exit("SL/TP", "Long", profit=profit_target, loss=trailing_stop_dist, trail_points=trailing_stop_dist)
strategy.exit("SL/TP", "Short", profit=profit_target, loss=trailing_stop_dist, trail_points=trailing_stop_dist)
// Friday = 6
// se manchiamo l'orario di chiusura per qualsiasi motivo, allora chiudiamo immediatamente
// altrimenti se siamo nell'orario di chiusura allora verifichiamo se siamo nel minuto di chiusura
close_time = dayofweek == 6 ?
hour[0] > session_end_hour ? true :
hour[0] == session_end_hour ?
minute[0] >= session_end_minute :
false : false
strategy.close_all(when=close_time)
// Grafico
plot(ema_fast, color=blue, title="Fast EMA")
plot(ema_slow, color=red, title="Slow EMA")
plotshape(rsi_long_cross, style=shape.triangleup, size=size.tiny, location=location.belowbar, color=green, title='RSI Long Cross Marker')
plotshape(rsi_short_cross, style=shape.triangledown, size=size.tiny, location=location.abovebar, color=red, title='RSI Short Cross Marker')
// Sfondo Filtro ADX
bgcolor(adx_filt and adx_check ? orange : na, transp=90)
Implementazione della Strategia
Dato che questo articolo non è un tutorial di coding, non ci concentriamo sulla sintassi e sui meccanismi di pine script. Vogliamo invece approfondire e spiegare il funzionamento e le caratteristiche della strategia trend following HLHB sul mecato Forex.
Come accennato in precedenza, il codice implementa il più fedelmente possibile la strategia HLHB Trend Following, quindi abbiamo implementato la logica predefinita in base al set di regole degli autori. Per dotare il codice di maggiore flessibilità abbiamo implementato gli input per quante più variabili possibili, così da poter modificare la strategia in base alle proprie esigenze.
Filtro ADX
Il filtro ADX è stato aggiunto al sistema come aggiornamento/modifica della strategia, quindi lo script ha un parametro per rendere questo filtro facoltativo. In questo modo possiamo facilmente vedere la differenza dei risultati quando applichiamo o non applichiamo il filtro. Quando il filtro è attivato e l’ADX è al di sopra del livello minimo (25 di default), il colore dello sfondo cambia in arancione. Questo indica che il filtro permette di attivare nuovi trade.
Chiusura della sessione settimanale
Uno dei criteri di uscita della strategia prevede la chiusura delle posizioni alla fine della settimana. La strategia descritta su babypips.com prevede le 16:00 di venerdì come fine della settimana.
Abbiamo implementato questa logica ma il metodo usato può creare confusione. In sintesi, ogni volta che riceviamo una nuova barra di dati facciamo un semplice controllo per vedere se l’orario corrente della candela è pari o successiva all’orario close
. Quando si verifica questa condizione, inviamo un ordine a mercato per chiudere la posizione. In altre parole se prevediamo le 16:00 come orario di chiusura della posizione, rileviamo l’orario solo quando riceviamo una barra il cui orario è le 16:00 o successivo. Quindi se inviamo un ordine a mercato alle 16:00, l’esecuzione dell’ordine è effettuato l’open
della barra successiva.
Da sottolineare che Tradingview riporta l’ora della barra come ora di apertura. Possiamo vederlo se passiamo alla modalità di dati in tempo reale. Nel seguente esempio l’orario reale è 48 minuti dopo l’ora, ma l’orario della barra è riportato come 30 minuti dopo l’ora (che è l’open
). Per i dati storici, questo è l’orario che lo script vede fino alla ricezione della barra successiva.
Quindi, dobbiamo modificarlo per trovare un orario di chiusura adatto al timeframe che vogliamo usare! Se vogliamo chiudere il più vicino possibile alle 16:00, possiamo impostare Weekly Session End (Hour)
a 15 e Weekly Session End (Minute)
a 45 quando siamo su un timeframe a 15 minuti. In questo modo inviamo un ordine di chiusura alle 15:45 che è eseguito all’apertura della barra delle 16:00.
Panoramica sul grafico
Il seguente grafico offre una piccola panoramica di alcuni degli elementi grafici previsti nel codice.
Risultati
Nel complesso i risultati sono positivi, tuttavia notiamo che la strategia spesso entra e esce sulla stessa barra quando usiamo i parametri predefiniti per lo stop loss e il take profit. Questo può essere problematico nei backtest, soprattutto con i trailing stop su Tradingview. Dobbiamo prestare attenzione quando effettuiamo backtest con i dati storici, non possiamo mai veramente se è stato raggiunto prima il massimo o il minimo. Il motore di backtesting esegue delle ipotesi che possono causare risultati non realistici.
Pertanto, se sei interessato a provare questa strategia e desideri mantenere le impostazioni predefinite, dovresti anche testarla con dati in tempo reale. Questo assicurerà che i trade sono aperti e chiusi correttamente su ciascuna barra dato che con i dati in tempo reale disponiamo delle informazioni su ciò che sta accadendo tra i prezzi open
e close
del la barra. Per ulteriori informazioni si può leggere l’articolo relativo al repainting degli indicatori.
GBPUSD
EURCHF
EURJPY
Codice completo
In questo articolo abbiamo descritto come implementare una strategia trend following HLHB sul Forex 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