
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.
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.
Strategi ini memiliki beberapa keuntungan utama:
Keahlian menangkap tren yang kuat. Dengan menerobos saluran Donia untuk menentukan awal dan akhir tren, Anda dapat secara efektif melacak tren.
Pengendalian risiko di tempat. Menggunakan stop loss bergerak untuk mengendalikan kerugian tunggal.
Parameter disesuaikan secara fleksibel. Anda dapat memilih kombinasi siklus saluran secara bebas, sesuai dengan varietas dan lingkungan pasar yang berbeda.
Logika transaksi yang sederhana dan jelas. Mudah dipahami dan diterapkan.
Strategi ini juga memiliki risiko sebagai berikut:
Tidak dapat beradaptasi dengan pasar yang bergoyang. Ada beberapa penyesuaian kecil yang akan terjadi ketika tren tidak jelas, yang menyebabkan stop loss.
Risiko kegagalan penembusan. Setelah harga menembus saluran, mungkin akan terjadi penarikan kembali, yang menyebabkan stop loss.
Siklus memilih risiko. Jika siklus saluran diatur dengan tidak benar, akan menyebabkan trading in noise.
Risiko penurunan rasio Sharp. Jika Anda meningkatkan posisi tanpa menyesuaikan stop loss, Anda akan menghadapi risiko penurunan rasio Sharp.
Solusi yang sesuai:
Strategi ini dapat dioptimalkan dari beberapa arah:
Tambahkan kondisi penyaringan untuk menghindari whipsaws.
Mengoptimalkan kombinasi dan kontrol posisi pada siklus channel, meningkatkan rasio untung rugi.
Mencoba optimasi breakpoint untuk menemukan kombinasi parameter yang optimal.
Menambahkan algoritma pembelajaran mesin untuk mengoptimalkan dan menyesuaikan parameter secara dinamis.
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.
/*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
// =============================================================================