Strategi Mengikuti Trend Donichan


Tarikh penciptaan: 2024-01-31 16:53:31 Akhirnya diubah suai: 2024-01-31 16:53:31
Salin: 0 Bilangan klik: 338
1
fokus pada
1166
Pengikut

Strategi Mengikuti Trend Donichan

Gambaran keseluruhan

Strategi pengesanan trend donut adalah strategi pengesanan trend yang dibangunkan berdasarkan prinsip saluran donut yang diterangkan dalam artikel Black Box Trend Following dan Lifting the Veil. Strategi ini menggunakan saluran donut untuk menentukan trend harga, dan membuat kedudukan tinggi atau rendah berdasarkan harga.

Prinsip Strategi

Strategi ini berdasarkan pada indikator saluran Donnie untuk menentukan arah trend. Saluran Donnie terdiri daripada saluran dengan kitaran yang lebih panjang dan saluran dengan kitaran yang lebih pendek. Apabila harga menembusi saluran dengan kitaran yang lebih panjang, penilaian bermula sebagai trend; Apabila harga menembusi saluran dengan kitaran yang lebih pendek, penilaian berakhir sebagai trend.

Khususnya, panjang laluan kitaran yang lebih panjang adalah 50 hari atau 20 hari, dan panjang laluan kitaran yang lebih pendek adalah 50 hari, 20 hari atau 10 hari. Jika harga sama dengan harga tertinggi dalam 50 hari, maka anda akan membuat pesanan; jika harga sama dengan harga terendah dalam 50 hari, maka anda akan membuat pesanan kosong. Jika harga sama dengan harga terendah dalam 20 hari atau 10 hari, maka anda akan membatalkan pesanan; jika harga sama dengan harga tertinggi dalam 20 hari atau 10 hari, maka anda akan membatalkan pesanan kosong.

Dengan cara ini, melalui gabungan dua saluran Donia yang berbeza, anda boleh menentukan arah untuk meletakkan kedudukan pada permulaan trend dan menghentikan kerugian pada akhir trend.

Analisis kelebihan

Strategi ini mempunyai kelebihan utama:

  1. Keupayaan untuk menangkap trend yang kuat. Dengan menerobos saluran Donia untuk menentukan permulaan dan akhir trend, trend boleh dijejaki dengan berkesan.

  2. Pengendalian risiko sedia ada. Pengendalian kerugian bergerak digunakan untuk mengawal kerugian tunggal.

  3. Parameter yang boleh disesuaikan secara fleksibel. Anda boleh bebas memilih kombinasi kitaran saluran untuk menyesuaikan diri dengan pelbagai jenis dan keadaan pasaran.

  4. Logik urus niaga yang ringkas dan jelas. Mudah difahami dan dilaksanakan.

Analisis risiko

Strategi ini juga mempunyai risiko:

  1. Tidak dapat menyesuaikan diri dengan pasaran yang bergolak. Apabila trend tidak jelas, akan ada beberapa kali penyesuaian kecil yang membawa kepada kerugian berhenti.

  2. Risiko kegagalan penembusan. Harga mungkin akan kembali semula selepas penembusan saluran, menyebabkan kerugian berhenti.

  3. Risiko pilihan kitaran. Jika kitaran laluan ditetapkan dengan tidak betul, ia akan menyebabkan perdagangan dalam kebisingan.

  4. Risiko penurunan rasio Sharp. Jika anda menambah kedudukan tanpa menyesuaikan stop loss, anda akan menghadapi risiko penurunan rasio Sharp.

Penyelesaian:

  1. Optimumkan parameter, pilih kombinasi kitaran laluan yang sesuai.
  2. Menyesuaikan kedudukan dan stop loss, mengawal risiko.
  3. Menggunakan strategi ini di dalam varieti dan pasaran yang jelas trend.

Arah pengoptimuman

Strategi ini boleh dioptimumkan dalam beberapa arah:

  1. Menambah syarat penapisan untuk mengelakkan whipsaws.

  2. Mengoptimumkan gabungan dan kawalan kedudukan dalam kitaran saluran, meningkatkan kadar kerugian. Anda boleh memperkenalkan mekanisme penangguhan kerugian yang sesuai.

  3. Cuba untuk mengoptimumkan titik putus untuk mencari kombinasi parameter yang terbaik.

  4. Menambah algoritma pembelajaran mesin untuk mengoptimumkan dan menyesuaikan parameter secara dinamik.

ringkaskan

Strategi mengikuti trend Donetsk adalah strategi mengikuti trend yang sangat praktikal. Strategi ini menyesuaikan parameternya secara fleksibel dan mudah dilaksanakan. Tetapi juga perlu memperhatikan kekurangan keuntungan dalam keadaan goncangan dan risiko yang dibawa oleh pilihan parameter. Dengan pengoptimuman lebih lanjut, anda boleh mendapatkan kesan strategi yang lebih baik.

Kod 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,
     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
// =============================================================================