Trend Donchian Mengikuti Strategi

Penulis:ChaoZhang, Tarikh: 2024-01-31 16:53:31
Tag:

img

Ringkasan

Strategi Donchian Trend Following dibangunkan berdasarkan prinsip Saluran Donchian yang diterangkan dalam artikel Black Box Trend Following Lifting the Veil. Strategi ini menggunakan Saluran Donchian untuk menentukan arah trend dan menubuhkan kedudukan panjang atau pendek apabila harga mencapai paras tertinggi atau terendah baru.

Logika Strategi

Strategi ini berdasarkan kepada penunjuk Saluran Donchian untuk menilai arah trend. Saluran Donchian terdiri daripada saluran tempoh yang lebih lama dan saluran tempoh yang lebih pendek. Apabila harga memecahkan saluran tempoh yang lebih lama, ia menandakan permulaan trend. Apabila harga memecahkan saluran tempoh yang lebih pendek, ia menandakan akhir trend.

Secara khusus, panjang saluran jangka panjang adalah 50 hari atau 20 hari, dan panjang saluran jangka pendek adalah 50 hari, 20 hari atau 10 hari. Jika harga sama dengan harga tertinggi dalam 50 hari, kedudukan panjang dibuka. Jika harga sama dengan harga terendah dalam 50 hari, kedudukan pendek dibuka. Jika harga sama dengan harga terendah dalam 20 atau 10 hari, kedudukan panjang ditutup. Jika harga sama dengan harga tertinggi dalam 20 atau 10 hari, kedudukan pendek ditutup.

Dengan menggabungkan dua Saluran Donchian dari tempoh yang berbeza, ia boleh menentukan arah untuk menubuhkan kedudukan apabila trend bermula, dan merealisasikan stop loss tepat pada masanya apabila trend berakhir.

Analisis Kelebihan

Kelebihan utama strategi ini ialah:

  1. Kemampuan kuat untuk menangkap trend. Ia boleh mengesan trend dengan berkesan dengan mengenal pasti permulaan dan akhir trend menggunakan penembusan Saluran Donchian.

  2. Ia menggunakan stop loss bergerak untuk mengawal kerugian perdagangan tunggal.

  3. Penyesuaian parameter yang fleksibel. Gabungan tempoh saluran boleh dipilih secara bebas untuk menyesuaikan diri dengan produk dan persekitaran pasaran yang berbeza.

  4. Logik perdagangan yang mudah dan jelas.

Analisis Risiko

Risiko strategi ini termasuk:

  1. Ketidakupayaan untuk menyesuaikan diri dengan pasaran yang terikat julat.

  2. Risiko kegagalan penembusan. Harga mungkin menarik balik selepas menembusi saluran, menyebabkan stop loss.

  3. Risiko pemilihan tempoh: tetapan tempoh saluran yang tidak sesuai boleh menyebabkan perdagangan dalam bunyi bising.

  4. Risiko penurunan nisbah Sharpe. Peningkatan saiz kedudukan tanpa menyesuaikan stop loss boleh menyebabkan penurunan nisbah Sharpe.

Penyelesaian adalah:

  1. Mengoptimumkan parameter untuk memilih kombinasi tempoh saluran yang sesuai.
  2. Sesuaikan saiz kedudukan dan stop loss dengan betul untuk mengawal risiko.
  3. Gunakan strategi ini untuk produk dan pasaran dengan trend yang jelas.

Arahan pengoptimuman

Arah pengoptimuman untuk strategi ini:

  1. Menambah keadaan penapis untuk mengelakkan whipsaws, contohnya menggabungkan jumlah untuk menilai breakout sebenar.

  2. Mengoptimumkan kombinasi tempoh saluran dan saiz kedudukan untuk meningkatkan nisbah keuntungan.

  3. Mencuba pengoptimuman titik henti untuk mencari set parameter yang optimum.

  4. Meningkatkan algoritma pembelajaran mesin untuk pengoptimuman dinamik dan pelarasan parameter.

Kesimpulan

Strategi Mengikuti Trend Donchian mengenal pasti permulaan dan akhir trend harga menggunakan saluran berganda, dan mengamalkan gaya perdagangan trend dengan kawalan kerugian perdagangan tunggal yang berkesan. Strategi ini mempunyai penyesuaian parameter yang fleksibel dan pelaksanaan yang mudah, menjadikan dirinya strategi trend yang sangat praktikal. Tetapi keuntungan yang tidak mencukupi di pasaran terhad dan risiko daripada pemilihan parameter harus diperhatikan. Pengoptimuman lanjut boleh membawa kepada prestasi strategi yang lebih baik.


/*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,
     pyramiding=0, initial_capital=1000,
     commission_type=strategy.commission.cash_per_order,
     commission_value=2, slippage=2)

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

donch_string = input.string(title="Length", options = ['20/10','50/20', '50/50', '20/20', '100/100'], defval='50/50')
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 = false)

// =============================================================================
// 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 VERTICAL COLOR BAR
// =============================================================================

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 DONCHIAN 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='Close in end')

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

Lebih lanjut