Trend Mengikut Strategi Penembusan Saluran dengan Purata Bergerak dan Hentian Terakhir

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

img

Ringkasan

Ini adalah strategi pecah berdasarkan Saluran Harga, digabungkan dengan penunjuk purata bergerak dan berhenti / mengambil keuntungan untuk masuk dan keluar. Ia menggunakan purata bergerak harga tinggi / rendah untuk membina Saluran Harga, dan masuk panjang / pendek apabila harga keluar dari Saluran, dengan stop loss tetap atau berhenti trailing untuk mengawal risiko.

Logika Strategi

Strategi ini mengira purata bergerak harga tinggi/rendah untuk membentuk Saluran harga. Khususnya, ia mengira panjang 10 SMA harga tinggi/rendah untuk merangka jalur atas dan bawah Saluran. Apabila harga pecah di atas jalur bawah ke dalam jalur atas, ia memasuki panjang. Apabila harga pecah dari jalur atas ke dalam jalur bawah, ia memasuki pendek.

Selepas masuk, strategi ini menggunakan stop loss tetap atau trailing stop untuk keluar. Trailing stop terdiri daripada dua parameter: tahap keuntungan yang tetap, dan offset pengaktifan. Apabila harga mencapai offset pengaktifan, tahap keuntungan mengambil mula mengikuti harga. Ini membolehkan mengunci keuntungan sambil mengekalkan beberapa ruang terbuka.

Strategi ini juga menggabungkan penapis julat masa, hanya menjalankan backtest dalam jangka masa sejarah yang ditentukan, untuk menguji prestasi di peringkat pasaran yang berbeza.

Analisis Kelebihan

Strategi ini memanfaatkan Saluran Harga dan trend berikut dengan trailing stop, yang membolehkannya menangkap arah trend jangka menengah hingga panjang. Berbanding dengan strategi purata bergerak yang mudah, ia mengelakkan perdagangan yang tidak berkesan kerana turun naik harga. Dengan trailing stop, ia dapat mengikuti harga secara dinamik untuk mengunci keuntungan.

Secara keseluruhan, strategi ini mempunyai logik yang jelas, penunjuk dan parameter minimum, mudah untuk backtest, sesuai untuk perdagangan trend jangka menengah hingga panjang, dan boleh mendapat keuntungan daripada trend yang kuat.

Analisis Risiko

Strategi ini cenderung untuk berhenti dengan mudah semasa pasaran yang berkisar, bergolak, tidak dapat mengekalkan keuntungan.

Penyesuaian parameter agak subjektif, yang memerlukan penyesuaian di peringkat pasaran yang berbeza.

Peluang Peningkatan

Indikator lain seperti jumlah, Bollinger Bands boleh dimasukkan untuk menapis isyarat kemasukan, mengelakkan perangkap.

Peraturan keluar boleh dinaik taraf kepada penangguhan penangguhan atau Penangguhan Chandelier. Sasaran keuntungan separa boleh dipertimbangkan apabila harga kembali memasuki Saluran. Mengoptimumkan penapis masuk dan peraturan keluar dapat meningkatkan kestabilan strategi.

Kesimpulan

Ringkasnya, ini adalah strategi kuantitatif berdasarkan Saluran Harga, trend berikut, pengurusan stop loss / mengambil keuntungan. Ia mempunyai aliran logik yang jelas, struktur parameter yang mudah, mudah difahami dan backtest. Ia sesuai untuk mempelajari konsep perdagangan algoritma. Strategi ini boleh ditingkatkan dalam pelbagai aspek untuk meningkatkan kestabilan dan keuntungan. Idea terasnya adalah untuk menangkap arah trend, dan menguruskan risiko melalui stop loss dan mengambil keuntungan. Ia boleh digunakan untuk pelbagai produk dalam jangka masa yang berbeza.


/*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 lanjut