Ini adalah strategi perdagangan kuantitatif yang menggabungkan indikator triple supertrend, EMA dan ADX. Ini menghasilkan sinyal perdagangan menggunakan sistem triple supertrend dan menerapkan EMA dan ADX sebagai filter untuk mengontrol frekuensi perdagangan dan meningkatkan kualitas sinyal.
Menggunakan tiga sistem supertrend dengan parameter yang berbeda dan menghasilkan sinyal perdagangan ketika ketiga supertrend setuju pada arah.
Menggunakan EMA sebagai filter tren, hanya pergi panjang ketika dekat di atas EMA dan pergi pendek ketika dekat di bawah EMA.
Menggunakan ADX sebagai filter kekuatan tren, hanya berdagang ketika ADX berada di atas ambang batas.
Mengizinkan opsi re-entry untuk menyesuaikan profitabilitas dan pengendalian risiko.
Secara khusus, kondisi entri panjang adalah ketika ketiga supertrend berubah menjadi bullish, close berada di atas EMA dan ADX berada di atas ambang batas. Kondisi entri pendek adalah ketika ketiga supertrend berubah menjadi bearish, close berada di bawah EMA dan ADX berada di atas ambang batas. Exit ketika salah satu supertrend berbalik arah.
Strategi ini juga memetakan garis dukungan dan resistensi supertrend untuk membantu penentuan tren visual.
Triple supertrend system menyaring false breakout dan meningkatkan akurasi entri.
Filter ganda EMA dan ADX mengurangi kerugian whipsaw dan meningkatkan manajemen risiko.
Opsi re-entry memungkinkan penyesuaian profitabilitas berdasarkan preferensi risiko.
Garis supertrend visual membantu menentukan arah tren.
Supertrend dan indikator lainnya memiliki lag dan dapat menyebabkan masuk terlambat atau keluar lebih awal.
Filter yang terlalu ketat dapat melewatkan kesempatan.
Whipsaws dapat menyebabkan kerugian di pasar yang terikat jangkauan.
Memungkinkan masuk kembali meningkatkan frekuensi perdagangan dan biaya slippage.
Risiko-risiko ini dapat dikurangi dengan mengoptimalkan parameter, filter, dan menggunakan dynamic stops.
Strategi ini dapat dioptimalkan dalam beberapa aspek:
Uji kombinasi parameter yang berbeda untuk menemukan pengaturan supertrend dan EMA yang optimal.
Optimalkan ambang ADX untuk mengurangi sinyal palsu.
Tambahkan filter lain seperti volatilitas, volume dll.
Optimalkan parameter secara terpisah untuk produk yang berbeda.
Membangun mekanisme stop loss yang dinamis untuk kontrol risiko yang lebih baik.
Jelajahi pembelajaran mesin untuk menemukan aturan masuk dan keluar yang lebih baik.
Strategi ini memanfaatkan kekuatan sistem triple supertrend dan memperbesarnya dengan filter ganda EMA dan ADX untuk secara efektif meningkatkan kualitas sinyal dan mengendalikan risiko. peningkatan lebih lanjut dalam parameter, filter, stop dinamis dapat meningkatkan ketahanan dan daya adaptasi. Dikombinasikan dengan analisis tren, ini memberikan sinyal masuk dan keluar yang efektif untuk perdagangan kuantitatif.
/*backtest start: 2023-08-18 00:00:00 end: 2023-09-17 00:00:00 period: 2h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // ©kunjandetroja //@version=5 strategy('Triple Supertrend with EMA and ADX', overlay=true) m1 = input.float(1,"ATR Multi",minval = 1,maxval= 6,step=0.5,group='ST 1') m2 = input.float(2,"ATR Multi",minval = 1,maxval= 6,step=0.5,group='ST 2') m3 = input.float(3,"ATR Multi",minval = 1,maxval= 6,step=0.5,group='ST 3') p1 = input.int(10,"ATR Multi",minval = 5,maxval= 25,step=1,group='ST 1') p2 = input.int(15,"ATR Multi",minval = 5,maxval= 25,step=1,group='ST 2') p3 = input.int(20,"ATR Multi",minval = 5,maxval= 25,step=1,group='ST 3') len_EMA = input.int(200,"EMA Len",minval = 5,maxval= 250,step=1) len_ADX = input.int(14,"ADX Len",minval = 1,maxval= 25,step=1) len_Di = input.int(14,"Di Len",minval = 1,maxval= 25,step=1) adx_above = input.float(25,"adx filter",minval = 1,maxval= 50,step=0.5) var bool long_position = false adx_filter = input.bool(false, "Add Adx & EMA filter") renetry = input.bool(true, "Allow Reentry") f_getColor_Resistance(_dir, _color) => _dir == 1 and _dir == _dir[1] ? _color : na f_getColor_Support(_dir, _color) => _dir == -1 and _dir == _dir[1] ? _color : na [superTrend1, dir1] = ta.supertrend(m1, p1) [superTrend2, dir2] = ta.supertrend(m2, p2) [superTrend3, dir3] = ta.supertrend(m3, p3) EMA = ta.ema(close, len_EMA) [diplus,diminus,adx] = ta.dmi(len_Di,len_ADX) // ADX Filter adxup = adx > adx_above and close > EMA adxdown = adx > adx_above and close < EMA sum_dir = dir1 + dir2 + dir3 dir_long = if(adx_filter == false) sum_dir == -3 else sum_dir == -3 and adxup dir_short = if(adx_filter == false) sum_dir == 3 else sum_dir == 3 and adxdown Exit_long = dir1 == 1 and dir1 != dir1[1] Exit_short = dir1 == -1 and dir1 != dir1[1] // BuySignal = dir_long and dir_long != dir_long[1] // SellSignal = dir_short and dir_short != dir_short[1] // if BuySignal // label.new(bar_index, low, 'Long', style=label.style_label_up) // if SellSignal // label.new(bar_index, high, 'Short', style=label.style_label_down) longenter = if(renetry == false) dir_long and long_position == false else dir_long shortenter = if(renetry == false) dir_short and long_position == true else dir_short if longenter long_position := true if shortenter long_position := false strategy.entry('BUY', strategy.long, when=longenter) strategy.entry('SELL', strategy.short, when=shortenter) strategy.close('BUY', Exit_long) strategy.close('SELL', Exit_short) buy1 = ta.barssince(dir_long) sell1 = ta.barssince(dir_short) colR1 = f_getColor_Resistance(dir1, color.red) colS1 = f_getColor_Support(dir1, color.green) colR2 = f_getColor_Resistance(dir2, color.orange) colS2 = f_getColor_Support(dir2, color.yellow) colR3 = f_getColor_Resistance(dir3, color.blue) colS3 = f_getColor_Support(dir3, color.maroon) plot(superTrend1, 'R1', colR1, linewidth=2) plot(superTrend1, 'S1', colS1, linewidth=2) plot(superTrend2, 'R1', colR2, linewidth=2) plot(superTrend2, 'S1', colS2, linewidth=2) plot(superTrend3, 'R1', colR3, linewidth=2) plot(superTrend3, 'S1', colS3, linewidth=2) // // Intraday only // var int new_day = na // var int new_month = na // var int new_year = na // var int close_trades_after_time_of_day = na // if dayofmonth != dayofmonth[1] // new_day := dayofmonth // if month != month[1] // new_month := month // if year != year[1] // new_year := year // close_trades_after_time_of_day := timestamp(new_year,new_month,new_day,15,15) // strategy.close_all(time > close_trades_after_time_of_day)