Strategi Mengikuti Aliran Saluran Donchian


Tarikh penciptaan: 2024-01-22 12:30:05 Akhirnya diubah suai: 2024-01-22 12:30:05
Salin: 0 Bilangan klik: 645
1
fokus pada
1617
Pengikut

Strategi Mengikuti Aliran Saluran Donchian

Gambaran keseluruhan

Strategi pengesanan trend saluran Donchian adalah strategi pengesanan trend berdasarkan petunjuk saluran Donchian. Ia menggunakan saluran Donchian dengan panjang yang berbeza untuk mengenal pasti trend harga dan menghasilkan isyarat perdagangan apabila harga menembusi saluran.

Gagasan utama strategi ini adalah menggunakan saluran Donchian jangka panjang untuk menentukan arah trend besar, menggunakan saluran Donchian jangka pendek sebagai isyarat masuk dan berhenti. Ia bertujuan untuk menangkap trend harga garis tengah dan panjang dan mengelakkan tertipu oleh turun naik jangka pendek di pasaran.

Prinsip Strategi

  1. Mengira harga penutupan tertinggi dan harga penutupan terendah dalam tempoh yang panjang (seperti 50 hari) membina saluran Donchian. Ia lebih tinggi apabila harga menembusi saluran ke atas dan lebih rendah apabila ia menembusi saluran ke bawah. Ini adalah asas untuk menilai trend besar.

  2. Hitung harga penutupan tertinggi dan penutupan terendah untuk tempoh pendek (seperti 20 hari) sebagai kriteria untuk masuk dan berhenti. Apabila harga menembusi saluran panjang, masuklah lebih / kosong jika harga penutupan juga menembusi saluran pendek.

  3. Apabila memegang kedudukan berlainan, ia akan berhenti jika harga jatuh ke bawah garis pendek. Apabila memegang kedudukan kosong, ia akan berhenti jika harga menembusi garis pendek.

  4. Titik hentian ditetapkan sebagai N kali ATR. Ini boleh disesuaikan secara automatik mengikut turun naik pasaran, yang membantu mengurangkan kemungkinan hentian akan diaktifkan.

  5. Anda boleh memilih untuk melonggarkan kedudukan sebelum perdagangan berakhir, atau terus memegang kedudukan sehingga berhenti. Ini boleh dikawal dengan parameter input.

Strategi ini mengambil kira kesesuaian trend dan kerugian keuntungan, untuk menangkap trend harga dan mengawal risiko, sesuai untuk operasi garis panjang dan sederhana.

Analisis kelebihan

  1. Mengenali trend jangka panjang dengan berkesan dan mengelakkan gangguan bunyi pasaran jangka pendek.

  2. Sistem penangguhan kerugian automatik boleh mengehadkan kerugian individu.

  3. Hentian ATR boleh menyesuaikan jarak hentian mengikut turun naik pasaran, mengurangkan kemungkinan hentian terhempas.

  4. Anda boleh memilih untuk menebus risiko perdagangan anda secara automatik apabila anda tidak dapat berdagang.

  5. Logik strategi mudah, jelas dan mudah difahami.

Analisis risiko

  1. Dalam pasaran yang tidak mempunyai trend yang jelas, strategi menghasilkan lebih banyak transaksi, yang meningkatkan kos transaksi dan kemungkinan kerugian.

  2. Walaupun terdapat mekanisme hentian kerugian, dalam keadaan yang tidak biasa, jurang harga boleh menyebabkan kerugian besar dengan terus menembusi titik hentian kerugian.

  3. ATR dikira hanya berdasarkan data sejarah, tidak dapat meramalkan pergerakan dan turun naik masa depan dengan tepat, jarak berhenti sebenar mungkin terlalu besar atau terlalu kecil.

  4. Di dalam dunia maya, perintah berhenti rugi tidak boleh dijamin 100%. Dalam keadaan yang melampau, ia boleh dilangkau dan menyebabkan kerugian.

Arah pengoptimuman

  1. Menyesuaikan parameter saluran Donchian untuk mengoptimumkan kesan pengenalan trend.

  2. Digabungkan dengan petunjuk lain yang mengesahkan isyarat perdagangan, seperti MACD, KDJ dan lain-lain, meningkatkan kestabilan strategi.

  3. Meningkatkan stop loss bergerak, supaya titik stop loss bergerak bersama harga, untuk mengehadkan kerugian lebih jauh.

  4. Uji kesan tempoh pegangan yang berbeza terhadap kesan keseluruhan dan tentukan tempoh pegangan yang optimum.

  5. Pertimbangkan untuk menyesuaikan saiz kedudukan secara dinamik dan menambah kedudukan dalam keadaan trend.

ringkaskan

Strategi penjejakan trend saluran Donchian mengintegrasikan penghakiman trend dengan kawalan risiko, memperoleh pulangan berlebihan melalui pengenalan trend, sementara mekanisme hentian mengawal risiko ekor. Strategi ini sesuai untuk mengenal pasti dan menangkap trend harga garis tengah dan panjang, yang dapat memperoleh keuntungan positif yang stabil setelah pengoptimuman parameter dan pengisian mekanisme.

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