Strategi Mengikuti Tren Saluran Donchian


Tanggal Pembuatan: 2024-01-22 12:30:05 Akhirnya memodifikasi: 2024-01-22 12:30:05
menyalin: 0 Jumlah klik: 645
1
fokus pada
1617
Pengikut

Strategi Mengikuti Tren Saluran Donchian

Ringkasan

Strategi pelacakan tren saluran Donchian adalah strategi pelacakan tren yang didasarkan pada indikator saluran Donchian. Ini menggunakan saluran Donchian dengan panjang yang berbeda untuk mengidentifikasi tren harga dan menghasilkan sinyal perdagangan ketika harga menembus saluran.

Gagasan utama dari strategi ini adalah menggunakan saluran Donchian dengan siklus panjang untuk menentukan arah tren besar, menggunakan saluran Donchian dengan siklus pendek sebagai sinyal masuk dan berhenti. Ini bertujuan untuk menangkap tren harga garis tengah dan panjang dan menghindari tertipu oleh fluktuasi jangka pendek di pasar.

Prinsip Strategi

  1. Perhitungan periode panjang (misalnya 50 hari) harga penutupan tertinggi dan harga penutupan terendah membangun saluran Donchian. Ketika harga menembus saluran naik, lebih tinggi, dan ketika harga menembus saluran turun, lebih rendah. Ini adalah dasar untuk menilai tren besar.

  2. Hitung harga penutupan tertinggi dan penutupan terendah dalam periode pendek (misalnya 20 hari) sebagai standar untuk masuk dan berhenti. Ketika harga menembus saluran panjang, masuklah lebih / kosong jika harga penutupan juga menembus saluran pendek.

  3. Ketika memegang posisi multihead, jika harga jatuh di bawah garis pendek, maka akan berhenti. Ketika memegang posisi kosong, jika harga menembus garis pendek, maka akan berhenti.

  4. Stop loss set to N-fold ATR. Hal ini dapat disesuaikan secara otomatis sesuai dengan volatilitas pasar, yang membantu mengurangi kemungkinan stop loss akan diaktifkan.

  5. Anda dapat memilih untuk melonggarkan posisi sebelum akhir perdagangan, atau terus memegang posisi sampai stop loss. Hal ini dapat dikontrol dengan parameter input.

Strategi ini memperhitungkan penilaian tren dan stop loss profit, baik untuk menangkap tren harga dan mengendalikan risiko, cocok untuk operasi garis panjang dan menengah.

Analisis Keunggulan

  1. Mengidentifikasi tren jangka panjang secara efektif dan menghindari gangguan dari kebisingan pasar jangka pendek.

  2. Sistem penghentian kerugian otomatis dapat membatasi kerugian individu.

  3. ATR stop loss dapat menyesuaikan jarak stop loss sesuai dengan volatilitas pasar, mengurangi kemungkinan stop loss terkena dampak.

  4. Anda dapat memilih untuk menutup posisi secara otomatis jika tidak dapat melakukan perdagangan, dan mengelola risiko perdagangan.

  5. Strategi logisnya sederhana, jelas dan mudah dipahami.

Analisis risiko

  1. Dalam pasar tanpa tren yang jelas, strategi menghasilkan lebih banyak transaksi, yang meningkatkan biaya transaksi dan kemungkinan kerugian.

  2. Meskipun ada mekanisme stop loss, dalam situasi yang tidak biasa, harga gap dapat langsung jatuh di bawah titik stop loss dan menyebabkan kerugian besar.

  3. Perhitungan ATR hanya didasarkan pada data historis dan tidak dapat secara akurat memprediksi tren dan volatilitas di masa depan. Jarak stop loss yang sebenarnya mungkin terlalu besar atau terlalu kecil.

  4. Dalam dunia nyata, perintah stop loss tidak dapat dijamin 100%. Dalam situasi yang ekstrim, perintah stop loss dapat dilewatkan dan menyebabkan kerugian.

Arah optimasi

  1. Mengatur parameter saluran Donchian untuk mengoptimalkan efek identifikasi tren.

  2. Dalam kombinasi dengan indikator lain yang mengkonfirmasi sinyal perdagangan, seperti MACD, KDJ, dll, meningkatkan stabilitas strategi.

  3. Meningkatkan stop loss bergerak, sehingga titik stop loss bergerak seiring dengan harga, untuk membatasi kerugian lebih lanjut.

  4. Uji efek dari waktu yang berbeda untuk memegang posisi dan menentukan periode yang optimal.

  5. Pertimbangkan untuk menyesuaikan skala posisi secara dinamis dan meningkatkan posisi dalam situasi tren.

Meringkaskan

Strategi pelacakan tren saluran Donchian mengintegrasikan penilaian tren dengan pengendalian risiko, memperoleh excess return melalui pengenalan tren, sementara mekanisme stop loss mengontrol risiko ekor. Strategi ini cocok untuk mengidentifikasi dan menangkap tren harga garis tengah dan panjang, yang dapat menghasilkan keuntungan positif yang stabil setelah pengoptimalan parameter dan pengisian mekanisme.

Kode Sumber Strategi
/*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
// =============================================================================