Tren Saluran Donchian Mengikuti Strategi

Penulis:ChaoZhang, Tarikh: 2024-01-22 12:30:05
Tag:

img

Ringkasan

Strategi trend berikut Saluran Donchian adalah strategi trend berikut berdasarkan penunjuk Saluran Donchian. Ia menggunakan Saluran Donchian dengan panjang yang berbeza untuk mengenal pasti trend harga dan menjana isyarat perdagangan apabila harga keluar dari saluran.

Idea utama strategi ini adalah menggunakan Saluran Donchian jangka panjang untuk menentukan arah trend utama dan Saluran Donchian jangka pendek sebagai isyarat untuk masuk dan menghentikan kerugian.

Logika Strategi

  1. Mengira harga penutupan tertinggi dan harga penutupan terendah dalam tempoh yang lama (contohnya 50 hari) untuk membina Saluran Donchian. Penembusan di atas jalur atas menunjukkan trend menaik sementara penembusan di bawah jalur bawah menunjukkan trend menurun. Ini menentukan arah trend utama.

  2. Menggunakan harga penutupan tertinggi dan harga penutupan terendah dalam tempoh pendek (contohnya 20 hari) sebagai kriteria untuk masuk dan menghentikan kerugian. Apabila harga keluar dari saluran jangka panjang, jika harga penutupan juga memecahkan saluran jangka pendek, ambil kedudukan panjang / pendek dengan sewajarnya.

  3. Apabila memegang kedudukan panjang, jika harga jatuh di bawah rentang bawah jangka pendek, berhenti dengan kerugian. Apabila memegang kedudukan pendek, jika harga pecah di atas rentang atas jangka pendek, berhenti dengan kerugian.

  4. Stop loss ditetapkan pada N kali ATR. Ini menyesuaikan secara automatik berdasarkan turun naik pasaran, menjadikannya kurang mungkin untuk stop loss dipukul.

  5. Terdapat pilihan untuk menutup kedudukan sebelum sesi dagangan berakhir atau memegang kedudukan sehingga hit stop loss.

Strategi ini mempertimbangkan kedua-dua pengenalan trend dan profit stop loss. Ia boleh menangkap trend harga sambil mengawal risiko. Ia sesuai untuk perdagangan jangka sederhana hingga panjang.

Analisis Kelebihan

  1. Mengenali dengan berkesan trend jangka sederhana hingga panjang tanpa diganggu oleh bunyi pasaran jangka pendek.

  2. Pelancongan yang tidak terkawal

  3. Stop loss berasaskan ATR menyesuaikan jarak berhenti berdasarkan turun naik pasaran, mengurangkan kemungkinan stop loss dipukul.

  4. Tutup kedudukan secara automatik apabila perdagangan tidak mungkin untuk menguruskan risiko.

  5. Logik strategi yang mudah dan mudah difahami.

Analisis Risiko

  1. Di pasaran bukan trend, strategi boleh menjana lebih banyak perdagangan, meningkatkan kos perdagangan dan kemungkinan kerugian.

  2. Walaupun mempunyai mekanisme stop loss, jurang harga dalam keadaan tidak menentu boleh menembusi titik stop loss secara langsung menyebabkan kerugian besar.

  3. Pengiraan ATR hanya berdasarkan data sejarah dan tidak dapat meramalkan dengan tepat pergerakan harga masa depan dan turun naik. Jarak berhenti sebenar mungkin terlalu luas atau terlalu sempit.

  4. Perintah stop loss mungkin tidak selalu dipenuhi dalam perdagangan langsung.

Arahan pengoptimuman

  1. Sesuaikan parameter Saluran Donchian untuk mengoptimumkan prestasi pengenalan trend.

  2. Menggabungkan penunjuk lain seperti MACD, KDJ untuk mengesahkan isyarat perdagangan dan meningkatkan kestabilan strategi.

  3. Tambahkan stop loss untuk memindahkan titik stop loss bersama dengan harga, lagi mengehadkan kerugian.

  4. Uji kesan tempoh penahan yang berbeza untuk mencari hasil keseluruhan yang optimum.

  5. Pertimbangkan penyesuaian saiz kedudukan secara dinamik, memperbesar kedudukan dalam keadaan trend.

Ringkasan

Strategi trend berikut saluran Donchian mengintegrasikan pengenalan trend dan kawalan risiko. Ia bertujuan untuk menjana pulangan berlebihan dengan mengenal pasti trend sambil mengawal risiko ekor dengan mekanisme hentian kerugian. Strategi ini sesuai untuk mengenal pasti dan menangkap trend harga jangka menengah hingga panjang. Dengan pengoptimuman parameter dan peningkatan mekanisme, ia dapat mencapai hasil positif yang mantap.


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

//@version=5
strategy(title="Donchian", overlay=true, calc_on_every_tick=true)

// =============================================================================
// VARIABLES
// =============================================================================

donch_string = input.string(title="Lenght", options = ['20/10','50/20', '50/50', '20/20', '100/100'], defval='20/10')
permit_long  = input.bool(title = 'Permit long', defval = true)
permit_short  = input.bool(title = 'Permit short', defval = true)
risk_percent = input.float(title="Position Risk %", defval=0.5, step=0.25)
stopOffset = input.float(title="ATR mult", defval=2.0, step=0.5)
atrLen = input.int(title="ATR Length", defval=20)
close_in_end  = input.bool(title = 'Close in end', defval = true)
permit_stop  = input.bool(title = 'Permit stop', defval = true)


// =============================================================================
// CALCULATIONS
// =============================================================================

donch_len_big = 
 donch_string == '50/20' ? 50 : 
 donch_string == '50/50' ? 50 : 
 donch_string == '20/20' ? 20 : 
 donch_string == '20/10' ? 20 : 
 donch_string == '100/100' ? 100 : 
 na
donch_len_small = 
 donch_string == '50/20' ? 20 : 
 donch_string == '50/50' ? 50 : 
 donch_string == '20/20' ? 20 : 
 donch_string == '20/10' ? 10 : 
 donch_string == '100/100' ? 100 : 
 na

big_maxclose = ta.highest(close, donch_len_big)
big_minclose = ta.lowest(close, donch_len_big)

small_maxclose = ta.highest(close, donch_len_small)
small_minclose = ta.lowest(close, donch_len_small)

atrValue = ta.atr(atrLen)[1]

tradeWindow  = true

// =============================================================================
// NOTOPEN QTY
// =============================================================================

risk_usd     = (risk_percent / 100) * strategy.equity
atr_currency = (atrValue * syminfo.pointvalue)
notopen_qty  = risk_usd / (stopOffset * atr_currency)

// =============================================================================
// LONG STOP
// =============================================================================

long_stop_price = 0.0
long_stop_price := 
 strategy.position_size > 0 and na(long_stop_price[1]) ? strategy.position_avg_price - stopOffset * atrValue : 
 strategy.position_size > 0 and strategy.openprofit > risk_usd ? strategy.position_avg_price:
 strategy.position_size > 0 ? long_stop_price[1] : 
 na

// =============================================================================
// SHORT STOP
// =============================================================================

short_stop_price = 0.0
short_stop_price := 
 strategy.position_size < 0 and na(short_stop_price[1]) ? strategy.position_avg_price + stopOffset * atrValue : 
 strategy.position_size < 0 and strategy.openprofit > risk_usd ? strategy.position_avg_price :
 strategy.position_size < 0 ? short_stop_price[1] : 
 na

// =============================================================================
// PLOT BG VERTICAL COLOR
// =============================================================================

cross_up = strategy.position_size <= 0 and close == big_maxclose and close >= syminfo.mintick and tradeWindow and permit_long
cross_dn =  strategy.position_size >= 0 and close == big_minclose and close >= syminfo.mintick and tradeWindow and permit_short
bg_color = cross_up ? color.green : cross_dn ? color.red : na
bg_color := color.new(bg_color, 70)
bgcolor(bg_color)

// =============================================================================
// PLOT HORIZONTAL LINES
// =============================================================================

s1 = cross_up ? na : cross_dn ? na : strategy.position_size != 0 ? strategy.position_avg_price : na
s2 = cross_up ? na : cross_dn ? na : strategy.position_size > 0 ? small_minclose : strategy.position_size < 0 ? small_maxclose : na
s3 = cross_up ? na : cross_dn ? na : not permit_stop ? na : 
 strategy.position_size > 0 ? long_stop_price : strategy.position_size < 0 ? short_stop_price : na

plot(series=big_maxclose, style=plot.style_linebr, color=color.black, linewidth=1, title="Donch Big Maxclose Black")
plot(series=big_minclose, style=plot.style_linebr, color=color.black, linewidth=1, title="Donch Big Minclose Black")

plot(series=s1, style=plot.style_linebr, color=color.yellow, linewidth=2, title="Entry Yellow")
plot(series=s2, style=plot.style_linebr, color=color.red, linewidth=1, title="Donch Small Red")
plot(series=s3, style=plot.style_linebr, color=color.fuchsia, linewidth=2, title="Stop Fuchsia")

// =============================================================================
// ENTRY ORDERS
// =============================================================================

if strategy.position_size <= 0 and close == big_maxclose and close >= syminfo.mintick and tradeWindow and permit_long
    strategy.entry("Long", strategy.long, qty=notopen_qty)

if (strategy.position_size >= 0) and close == big_minclose and close >= syminfo.mintick and tradeWindow and permit_short
    strategy.entry("Short", strategy.short, qty=notopen_qty)

// =============================================================================
// EXIT ORDERS
// =============================================================================

if strategy.position_size > 0 and permit_stop
    strategy.exit(id="Stop", from_entry="Long", stop=long_stop_price)

if strategy.position_size < 0 and permit_stop
    strategy.exit(id="Stop", from_entry="Short", stop=short_stop_price)

// ==========

if strategy.position_size > 0 and close == small_minclose and not barstate.islast
    strategy.close(id="Long", comment='Donch')

if strategy.position_size < 0 and close == small_maxclose and not barstate.islast
    strategy.close(id="Short", comment='Donch')

// ==========

if close_in_end
    if not tradeWindow
        strategy.close_all(comment='In end')

// =============================================================================
// END
// =============================================================================

Lebih lanjut