Donchian Channel trend following strategy adalah strategi trend following yang didasarkan pada indikator Donchian Channel.
Ide utama dari strategi ini adalah menggunakan saluran Donchian jangka panjang untuk menentukan arah tren utama dan saluran Donchian jangka pendek sebagai sinyal untuk masuk dan stop loss.
Menghitung harga penutupan tertinggi dan harga penutupan terendah dalam jangka waktu yang lama (misalnya 50 hari) untuk membangun Saluran Donchian. Penembusan di atas band atas menunjukkan tren naik sementara penembusan di bawah band bawah menunjukkan tren turun. Ini menentukan arah tren utama.
Gunakan harga penutupan tertinggi dan harga penutupan terendah dalam jangka waktu singkat (misalnya 20 hari) sebagai kriteria untuk masuk dan stop loss.
Ketika memegang posisi panjang, jika harga turun di bawah band bawah jangka pendek, berhenti dengan kerugian.
Stop loss ditetapkan pada N kali ATR. Ini secara otomatis menyesuaikan berdasarkan volatilitas pasar, sehingga lebih kecil kemungkinan stop loss akan dipukul.
Ada opsi untuk menutup posisi sebelum sesi perdagangan berakhir atau menahan posisi sampai hit stop loss.
Strategi ini mempertimbangkan identifikasi tren dan profit stop loss. Ini dapat menangkap tren harga sambil mengendalikan risiko. Ini cocok untuk perdagangan jangka menengah hingga panjang.
Mengidentifikasi tren jangka menengah hingga panjang secara efektif tanpa gangguan oleh kebisingan pasar jangka pendek.
Mekanisme stop loss otomatis membatasi kerugian per perdagangan.
Stop loss berbasis ATR menyesuaikan jarak stop berdasarkan volatilitas pasar, mengurangi kemungkinan stop loss dipukul.
Otomatis menutup posisi ketika perdagangan tidak mungkin untuk mengelola risiko.
Logika strategi yang sederhana dan jelas yang mudah dipahami.
Di pasar non-trending, strategi dapat menghasilkan lebih banyak perdagangan, meningkatkan biaya perdagangan dan kemungkinan kerugian.
Meskipun memiliki mekanisme stop loss, kesenjangan harga dalam kondisi volatile dapat menembus titik stop loss secara langsung menyebabkan kerugian besar.
Perhitungan ATR hanya didasarkan pada data historis dan tidak dapat memprediksi dengan tepat pergerakan harga dan volatilitas di masa depan.
Perintah stop loss mungkin tidak selalu dipenuhi dalam perdagangan langsung.
Sesuaikan parameter saluran Donchian untuk mengoptimalkan kinerja identifikasi tren.
Menggabungkan indikator lain seperti MACD, KDJ untuk mengkonfirmasi sinyal perdagangan dan meningkatkan stabilitas strategi.
Tambahkan stop loss untuk memindahkan titik stop loss bersama dengan harga, lebih membatasi kerugian.
Uji dampak dari periode penahan yang berbeda untuk menemukan hasil keseluruhan yang optimal.
Pertimbangkan untuk menyesuaikan ukuran posisi secara dinamis, memperbesar posisi dalam kondisi tren.
Donchian Channel trend following strategy mengintegrasikan identifikasi tren dan pengendalian risiko. Strategi ini bertujuan untuk menghasilkan laba yang berlebihan dengan mengidentifikasi tren sambil mengendalikan risiko ekor dengan mekanisme stop loss. Strategi ini cocok untuk mengidentifikasi dan menangkap tren harga jangka menengah hingga panjang. Dengan optimasi parameter dan peningkatan mekanisme, dapat mencapai hasil positif yang stabil.
/*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 // =============================================================================