Strategi Mengikuti Tren Donichan


Tanggal Pembuatan: 2024-01-31 16:53:31 Akhirnya memodifikasi: 2024-01-31 16:53:31
menyalin: 0 Jumlah klik: 647
1
fokus pada
1617
Pengikut

Strategi Mengikuti Tren Donichan

Ringkasan

Strategi pelacakan tren donut adalah strategi pelacakan tren yang dikembangkan berdasarkan prinsip saluran donut yang dijelaskan dalam artikel Black Box Trend Following dan Lifting the Veil. Strategi ini menggunakan saluran donut untuk menilai tren harga, untuk melakukan over atau under based pada inovasi harga tinggi atau rendah.

Prinsip Strategi

Strategi ini didasarkan pada indikator saluran Dony untuk menentukan arah tren. Saluran Dony terdiri dari saluran dengan siklus yang lebih panjang dan saluran dengan siklus yang lebih pendek.

Secara khusus, panjang jalur siklus yang lebih panjang adalah 50 hari atau 20 hari, dan panjang jalur siklus yang lebih pendek adalah 50 hari, 20 hari atau 10 hari. Jika harga sama dengan harga tertinggi dalam 50 hari, maka bukalah lebih banyak; Jika harga sama dengan harga terendah dalam 50 hari, maka bukalah lebih banyak. Jika harga sama dengan harga terendah dalam 20 hari atau 10 hari, maka tutuplah lebih banyak; Jika harga sama dengan harga tertinggi dalam 20 hari atau 10 hari, maka tutuplah.

Dengan demikian, melalui kombinasi dua saluran Donia dengan periode yang berbeda, posisi dapat ditentukan pada awal tren dan dihentikan pada akhir tren.

Analisis Keunggulan

Strategi ini memiliki beberapa keuntungan utama:

  1. Keahlian menangkap tren yang kuat. Dengan menerobos saluran Donia untuk menentukan awal dan akhir tren, Anda dapat secara efektif melacak tren.

  2. Pengendalian risiko di tempat. Menggunakan stop loss bergerak untuk mengendalikan kerugian tunggal.

  3. Parameter disesuaikan secara fleksibel. Anda dapat memilih kombinasi siklus saluran secara bebas, sesuai dengan varietas dan lingkungan pasar yang berbeda.

  4. Logika transaksi yang sederhana dan jelas. Mudah dipahami dan diterapkan.

Analisis risiko

Strategi ini juga memiliki risiko sebagai berikut:

  1. Tidak dapat beradaptasi dengan pasar yang bergoyang. Ada beberapa penyesuaian kecil yang akan terjadi ketika tren tidak jelas, yang menyebabkan stop loss.

  2. Risiko kegagalan penembusan. Setelah harga menembus saluran, mungkin akan terjadi penarikan kembali, yang menyebabkan stop loss.

  3. Siklus memilih risiko. Jika siklus saluran diatur dengan tidak benar, akan menyebabkan trading in noise.

  4. Risiko penurunan rasio Sharp. Jika Anda meningkatkan posisi tanpa menyesuaikan stop loss, Anda akan menghadapi risiko penurunan rasio Sharp.

Solusi yang sesuai:

  1. Optimalkan parameter, pilih kombinasi siklus saluran yang sesuai.
  2. Mengatur posisi dan stop loss dengan tepat, mengendalikan risiko.
  3. Strategi ini digunakan pada varietas dan pasar yang jelas tren.

Arah optimasi

Strategi ini dapat dioptimalkan dari beberapa arah:

  1. Tambahkan kondisi penyaringan untuk menghindari whipsaws.

  2. Mengoptimalkan kombinasi dan kontrol posisi pada siklus channel, meningkatkan rasio untung rugi.

  3. Mencoba optimasi breakpoint untuk menemukan kombinasi parameter yang optimal.

  4. Menambahkan algoritma pembelajaran mesin untuk mengoptimalkan dan menyesuaikan parameter secara dinamis.

Meringkaskan

Strategi pelacakan tren Donetsk adalah strategi pelacakan tren yang sangat praktis. Strategi ini sangat fleksibel dalam penyesuaian parameter dan mudah diterapkan. Tetapi juga perlu diperhatikan kekurangan profitabilitas dalam situasi yang bergolak dan risiko yang ditimbulkan oleh pilihan parameter. Dengan pengoptimalan lebih lanjut, efek strategi yang lebih baik dapat diperoleh.

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