Tren Saluran Donchian Mengikuti Strategi

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

img

Gambaran umum

Donchian Channel trend following strategy adalah strategi trend following yang didasarkan pada indikator Donchian Channel.

Ide utama dari strategi ini adalah menggunakan saluran Donchian jangka panjang untuk menentukan arah tren utama dan saluran Donchian jangka pendek sebagai sinyal untuk masuk dan stop loss.

Logika Strategi

  1. Menghitung harga penutupan tertinggi dan harga penutupan terendah dalam jangka waktu yang lama (misalnya 50 hari) untuk membangun Saluran Donchian. Penembusan di atas band atas menunjukkan tren naik sementara penembusan di bawah band bawah menunjukkan tren turun. Ini menentukan arah tren utama.

  2. Gunakan harga penutupan tertinggi dan harga penutupan terendah dalam jangka waktu singkat (misalnya 20 hari) sebagai kriteria untuk masuk dan stop loss.

  3. Ketika memegang posisi panjang, jika harga turun di bawah band bawah jangka pendek, berhenti dengan kerugian.

  4. Stop loss ditetapkan pada N kali ATR. Ini secara otomatis menyesuaikan berdasarkan volatilitas pasar, sehingga lebih kecil kemungkinan stop loss akan dipukul.

  5. Ada opsi untuk menutup posisi sebelum sesi perdagangan berakhir atau menahan posisi sampai hit stop loss.

Strategi ini mempertimbangkan identifikasi tren dan profit stop loss. Ini dapat menangkap tren harga sambil mengendalikan risiko. Ini cocok untuk perdagangan jangka menengah hingga panjang.

Analisis Keuntungan

  1. Mengidentifikasi tren jangka menengah hingga panjang secara efektif tanpa gangguan oleh kebisingan pasar jangka pendek.

  2. Mekanisme stop loss otomatis membatasi kerugian per perdagangan.

  3. Stop loss berbasis ATR menyesuaikan jarak stop berdasarkan volatilitas pasar, mengurangi kemungkinan stop loss dipukul.

  4. Otomatis menutup posisi ketika perdagangan tidak mungkin untuk mengelola risiko.

  5. Logika strategi yang sederhana dan jelas yang mudah dipahami.

Analisis Risiko

  1. Di pasar non-trending, strategi dapat menghasilkan lebih banyak perdagangan, meningkatkan biaya perdagangan dan kemungkinan kerugian.

  2. Meskipun memiliki mekanisme stop loss, kesenjangan harga dalam kondisi volatile dapat menembus titik stop loss secara langsung menyebabkan kerugian besar.

  3. Perhitungan ATR hanya didasarkan pada data historis dan tidak dapat memprediksi dengan tepat pergerakan harga dan volatilitas di masa depan.

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

Arahan Optimasi

  1. Sesuaikan parameter saluran Donchian untuk mengoptimalkan kinerja identifikasi tren.

  2. Menggabungkan indikator lain seperti MACD, KDJ untuk mengkonfirmasi sinyal perdagangan dan meningkatkan stabilitas strategi.

  3. Tambahkan stop loss untuk memindahkan titik stop loss bersama dengan harga, lebih membatasi kerugian.

  4. Uji dampak dari periode penahan yang berbeda untuk menemukan hasil keseluruhan yang optimal.

  5. Pertimbangkan untuk menyesuaikan ukuran posisi secara dinamis, memperbesar posisi dalam kondisi tren.

Ringkasan

Donchian Channel trend following strategy mengintegrasikan identifikasi tren dan pengendalian risiko. Strategi ini bertujuan untuk menghasilkan laba yang berlebihan dengan mengidentifikasi tren sambil mengendalikan risiko ekor dengan mekanisme stop loss. Strategi ini cocok untuk mengidentifikasi dan menangkap tren harga jangka menengah hingga panjang. Dengan optimasi parameter dan peningkatan mekanisme, dapat mencapai hasil positif yang stabil.


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