Trend Mengikuti Strategi Penembusan Saluran dengan Moving Average dan Trailing Stop

Penulis:ChaoZhang, Tanggal: 2024-01-15 12:25:26
Tag:

img

Gambaran umum

Ini adalah strategi breakout yang didasarkan pada Saluran Harga, dikombinasikan dengan indikator rata-rata bergerak dan trailing stop / take profit untuk masuk dan keluar. Ini menggunakan rata-rata bergerak harga tinggi / rendah untuk membangun Saluran Harga, dan masuk panjang / pendek ketika harga keluar dari Saluran, dengan stop loss tetap atau trailing stop untuk mengendalikan risiko.

Logika Strategi

Strategi ini menghitung rata-rata bergerak harga tinggi/rendah untuk membentuk Saluran harga. Secara khusus, menghitung panjang 10 SMA harga tinggi/rendah untuk memetakan pita atas dan bawah Saluran. Ketika harga keluar di atas pita bawah ke pita atas, itu masuk panjang. Ketika harga pecah dari pita atas ke pita bawah, itu masuk pendek.

Setelah masuk, strategi menggunakan stop loss tetap atau trailing stop untuk keluar. Trailing stop terdiri dari dua parameter: level profit take tetap, dan offset aktivasi. Ketika harga mencapai offset aktivasi, level take profit mulai mengikuti harga. Hal ini memungkinkan penguncian keuntungan sambil menjaga beberapa ruang terbuka.

Strategi ini juga menggabungkan filter rentang waktu, hanya menjalankan backtest dalam kerangka waktu historis yang ditentukan, untuk menguji kinerja di berbagai tahap pasar.

Analisis Keuntungan

Strategi ini memanfaatkan saluran harga dan tren yang mengikuti dengan trailing stop, yang memungkinkan untuk menangkap arah tren jangka menengah hingga panjang. Dibandingkan dengan strategi rata-rata bergerak sederhana, strategi ini menghindari perdagangan yang tidak efektif karena fluktuasi harga. Dengan trailing stop, strategi ini dapat secara dinamis mengikuti harga untuk mengunci keuntungan.

Secara keseluruhan, strategi ini memiliki logika yang jelas, indikator dan parameter minimal, mudah untuk backtest, cocok untuk perdagangan tren jangka menengah hingga panjang, dan dapat mendapatkan keuntungan dari tren yang kuat.

Analisis Risiko

Strategi ini cenderung terhenti dengan mudah selama pasar berputar, bergolak, tidak dapat mempertahankan keuntungan.

Pengaturan parameter cukup subjektif, membutuhkan penyesuaian di berbagai tahap pasar.

Peluang Peningkatan

Indikator lain seperti volume, Bollinger Bands dapat dimasukkan untuk menyaring sinyal masuk, menghindari perangkap.

Aturan keluar dapat ditingkatkan menjadi trailing stop atau Chandelier Exit. Target keuntungan parsial dapat dipertimbangkan ketika harga memasuki kembali Saluran. Mengoptimalkan filter masuk dan aturan keluar dapat sangat meningkatkan stabilitas strategi.

Kesimpulan

Secara singkat, ini adalah strategi kuantitatif yang didasarkan pada saluran harga, mengikuti tren, manajemen stop loss / profit taking. Ini memiliki aliran logika yang jelas, struktur parameter yang sederhana, mudah dimengerti dan backtest. Ini cocok untuk mempelajari konsep perdagangan algoritmik. Strategi dapat ditingkatkan dalam berbagai aspek untuk meningkatkan stabilitas dan profitabilitas.


/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-21 23:59:59
period: 3h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy("Generalized SSL Backtest w/ TSSL", shorttitle="GSSL Backtest", overlay=true )
// Generalized SSL:
//  This is the very first time the SSL indicator, whose acronym I ignore, is on Tradingview. 
//  It is based on moving averages of the highs and lows. 
//  Similar channel indicators can be found, whereas 
//  this one implements the persistency inside the channel, which is rather tricky.
//  The green line is the base line which decides entries and exits, possibly with trailing stops.
//  With respect to the original version, here one can play with different moving averages.
//  The default settings are (10,SMA)
//
// Vitelot/Yanez/Vts March 2019

lb = input(10, title="Lb", minval=1)
maType = input( defval="SMA", title="MA Type", options=["SMA","EMA","HMA","McG","WMA","Tenkan"])

fixedSL = input(title="SL Activation", defval=300)
trailSL = input(title="SL Trigger", defval=1)
fixedTP = input(title="TP Activation", defval=150)
trailTP = input(title="TP Trigger", defval=1)

FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2019, title = "From Year", minval = 2017)
ToMonth   = input(defval = 6, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 19, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 2020, title = "To Year", minval = 2017)
start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)        // backtest finish window
startTimeOk()  => true // create function "within window of time" if statement true
// QUANDL:BCHAIN/ETRVU is USD-denominated daily transaction value on BTC blockchain
// QUANDL:BCHAIN/MKTCP is USD-denominated Bitcoin marketcap

hma(sig, n) => // Hull moving average definition
    wma( 2*wma(sig,round(n/2))-wma(sig,n), round(sqrt(n)))

mcg(sig,length) => // Mc Ginley MA definition
    mg = 0.0
    mg := na(mg[1]) ? ema(sig, length) : mg[1] + (sig - mg[1]) / (length * pow(sig/mg[1], 4))

tenkan(sig,len) =>
    0.5*(highest(sig,len)+lowest(sig,len))

ma(t,sig,len) =>
    sss=na
    if t =="SMA"
        sss := sma(sig,len)
    if t == "EMA"
        sss := ema(sig,len)
    if t == "HMA"
        sss := hma(sig,len)
    if t == "McG" // Mc Ginley
        sss := mcg(sig,len)
    if t == "Tenkan"
        sss := tenkan(sig,len)
    if t == "WMA"
        sss := wma(sig,len)
    sss

base(mah, mal) =>
    bbb = na
    inChannel = close<mah and close>mal
    belowChannel = close<mah and close<mal
    bbb := inChannel? bbb[1]: belowChannel? -1: 1
    uuu = bbb==1? mal: mah
    ddd = bbb==1? mah: mal
    [uuu, ddd]

maH = ma(maType, high, lb)
maL = ma(maType, low, lb)

[up, dn] = base(maH,maL)

plot(up, title="High MA", color=lime, linewidth=3)
plot(dn, title="Low MA", color=orange, linewidth=3)

long = crossover(dn,up)
short = crossover(up,dn)

// === STRATEGY - LONG POSITION EXECUTION ===
strategy.entry("Long", strategy.long, when= long and startTimeOk())
strategy.exit("Exit", qty_percent = 100, loss=fixedSL, trail_offset=trailTP, trail_points=fixedTP) 
strategy.exit("Exit", when= short)
// === STRATEGY - SHORT POSITION EXECUTION ===
strategy.entry("Short", strategy.short, when= short and startTimeOk())
strategy.exit("Exit", qty_percent = 100, loss=fixedSL, trail_offset=trailTP, trail_points=fixedTP)
strategy.exit("Exit", when= long)

Lebih banyak