Triple Supertrend dengan Strategi EMA dan ADX

Penulis:ChaoZhang, Tarikh: 2023-09-18 14:02:12
Tag:

Ringkasan

Ini adalah strategi perdagangan kuantitatif yang menggabungkan penunjuk supertrend tiga, EMA dan ADX. Ia menjana isyarat perdagangan menggunakan sistem supertrend tiga dan menggunakan EMA dan ADX sebagai penapis untuk mengawal kekerapan perdagangan dan meningkatkan kualiti isyarat.

Logika Strategi

  • Gunakan tiga sistem supertrend dengan parameter yang berbeza dan menjana isyarat perdagangan apabila ketiga-tiga supertrend bersetuju mengenai arah.

  • Gunakan EMA sebagai penapis trend, hanya pergi lama apabila dekat di atas EMA dan pergi pendek apabila dekat di bawah EMA.

  • Menggunakan ADX sebagai penapis kekuatan trend, hanya berdagang apabila ADX melebihi ambang.

  • Membolehkan pilihan kemasukan semula untuk menyesuaikan keuntungan dan kawalan risiko.

Secara khusus, syarat kemasukan panjang adalah apabila ketiga-tiga supertrend berubah menjadi bullish, menutup di atas EMA dan ADX lebih tinggi daripada ambang. Syarat kemasukan pendek adalah apabila ketiga-tiga supertrend berubah menjadi bearish, menutup di bawah EMA dan ADX lebih tinggi daripada ambang. Keluar apabila mana-mana supertrend membalik arah.

Strategi ini juga merangka garis sokongan dan rintangan supertrend untuk membantu penentuan trend visual.

Analisis Kelebihan

  • Sistem supertrend triple menapis pecah palsu dan meningkatkan ketepatan kemasukan.

  • EMA dan ADX penapis berganda mengurangkan kerugian whipsaw dan meningkatkan pengurusan risiko.

  • Pilihan kemasukan semula membolehkan penyesuaian keuntungan berdasarkan keutamaan risiko.

  • Garis supertrend visual membantu menentukan arah trend.

Analisis Risiko

  • Supertrend dan penunjuk lain mempunyai lag dan boleh menyebabkan masuk lewat atau keluar awal.

  • Penapis yang terlalu ketat boleh kehilangan peluang.

  • Whipsaws boleh menyebabkan kerugian di pasaran yang terhad.

  • Membolehkan kemasukan semula meningkatkan kekerapan perdagangan dan kos slippage.

Risiko ini boleh dikurangkan dengan mengoptimumkan parameter, penapis dan menggunakan berhenti dinamik.

Arahan pengoptimuman

Strategi ini boleh dioptimumkan dalam beberapa aspek:

  • Uji kombinasi parameter yang berbeza untuk mencari tetapan supertrend dan EMA yang optimum.

  • Mengoptimumkan ambang ADX untuk mengurangkan isyarat palsu.

  • Tambah penapis lain seperti turun naik, jumlah dan lain-lain

  • Mengoptimumkan parameter secara berasingan untuk produk yang berbeza.

  • Membina mekanisme berhenti rugi dinamik untuk kawalan risiko yang lebih baik.

  • Jelajahi pembelajaran mesin untuk mencari peraturan kemasukan dan keluar yang lebih baik.

Ringkasan

Strategi ini menggunakan kekuatan sistem supertrend tiga kali dan meningkatkannya dengan penapis ganda EMA dan ADX untuk meningkatkan kualiti isyarat dan mengawal risiko dengan berkesan. Penambahbaikan lanjut dalam parameter, penapis, berhenti dinamik dapat meningkatkan ketahanan dan daya adaptasi.


/*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) 


Lebih lanjut