EMA dan Stochastic RSI berdasarkan Trend Multi-Timeframe Mengikut Strategi Dagangan

Penulis:ChaoZhang, Tarikh: 2024-03-08 17:32:38
Tag:

img

Ringkasan Strategi

Strategi ini, yang dinamakan EMA dan RSI Stochastic berdasarkan Multi-timeframe Trend Following Trading Strategy, menggunakan dua purata bergerak eksponensial (EMA) dengan tempoh yang berbeza dan penunjuk RSI Stochastic untuk menangkap trend pasaran jangka menengah hingga panjang.

Prinsip Strategi

  1. Mengira EMA pantas dan EMA perlahan. Parameter lalai untuk EMA pantas adalah 12, dan 25 untuk EMA perlahan. Ini boleh diselaraskan berdasarkan ciri pasaran dan kekerapan dagangan.

  2. Tentukan trend menaik/berangin:

  • Apabila EMA cepat melintasi di atas EMA perlahan, ia menghasilkan isyarat menaik
  • Apabila EMA cepat melintasi di bawah EMA perlahan, ia menghasilkan isyarat penurunan
  1. Pengesahan trend: Selepas isyarat bullish / bearish muncul, ia memerlukan 2 lilin bullish / bearish berturut-turut untuk mengesahkan trend. Ini membantu menapis isyarat palsu.

  2. Gunakan RSI Stochastic sebagai penilaian tambahan:

  • Apabila garis Stochastic RSI %K melintasi di atas garis %D, dan %K di bawah 20, ia menghasilkan isyarat oversold, yang menunjukkan potensi pembalikan menaik
  • Apabila garis Stochastic RSI %K melintasi di bawah garis %D, dan %K di atas 80, ia menghasilkan isyarat overbought, yang menunjukkan kemungkinan pembalikan penurunan.
  1. Peraturan perdagangan:
  • Buka kedudukan panjang apabila EMA menghasilkan isyarat menaik, dan Stochastic RSI tidak berada di wilayah yang terlalu banyak dibeli
  • Buka kedudukan pendek apabila EMA menghasilkan isyarat penurunan dan Stochastic RSI tidak berada di wilayah oversold

Kelebihan Strategi

  1. Dengan menggunakan dua EMA dengan tempoh yang berbeza, strategi ini dapat menyeimbangkan lebih baik kepekaan dan kebolehpercayaan menangkap trend.

  2. Mekanisme pengesahan trend dapat menapis kebanyakan isyarat palsu dengan berkesan dan meningkatkan kadar kemenangan.

  3. Stochastic RSI berfungsi sebagai pertimbangan tambahan, membantu menilai kekuatan trend pada peringkat awal dan memberi amaran awal terhadap kemungkinan pembalikan pada peringkat akhir.

  4. Logik strategi adalah mudah dengan beberapa parameter, menjadikannya mudah difahami dan dilaksanakan.Ia juga boleh digunakan untuk pelbagai pasaran dan instrumen.

Analisis Risiko

  1. EMA adalah penunjuk yang ketinggalan dan boleh mengakibatkan pergeseran yang ketara pada permulaan pembalikan trend.

  2. Strategi yang mengikuti trend biasanya kurang berprestasi di pasaran yang bergolak. Strategi ini tidak mempunyai penilaian khusus untuk keadaan terikat julat.

  3. RSI stokastik boleh menghasilkan isyarat yang mengelirukan semasa turun naik pasaran yang melampau, mempengaruhi kualiti penilaian.

  4. Parameter tetap mungkin tidak disesuaikan dengan semua keadaan pasaran, yang memerlukan penyesuaian dinamik berdasarkan ciri pasaran.

Arahan pengoptimuman

  1. Memperkenalkan penunjuk turun naik seperti ATR untuk menyesuaikan parameter EMA secara dinamik dan menyesuaikan diri dengan irama pasaran yang berbeza.

  2. Tambah pertimbangan untuk pasaran yang terikat julat, seperti menggabungkan lebar Bollinger Bands, untuk mengelakkan perdagangan yang kerap dalam keadaan yang bergelombang.

  3. Menggabungkan lebih banyak kriteria tambahan di atas RSI Stochastic, seperti perubahan dalam jumlah, untuk meningkatkan kebolehpercayaan isyarat.

  4. Mempertimbangkan korelasi pasaran dan memperkenalkan isyarat antara pasaran pelbagai aset untuk meningkatkan ketahanan risiko sistem.

Ringkasan

Strategi ini berkesan memanfaatkan kekuatan EMA dan RSI Stochastic untuk membentuk pendekatan perdagangan jangka menengah hingga panjang berdasarkan trend berikut dan pembalikan momentum. Ia menangkap trend melalui persilangan EMA, mengesahkan kekuatan trend dan memberi amaran pembalikan dengan RSI Stochastic, dan meningkatkan kualiti isyarat dengan mekanisme pengesahan trend. Ketiga komponen secara organik menggabungkan untuk mewujudkan kerangka strategi perdagangan kuantitatif yang mudah dan berkesan. Kelebihannya utama terletak pada logik yang ringkas, beberapa parameter, kesukaran pelaksanaan yang rendah, dan penerapan yang luas. Walau bagaimanapun, strategi ini juga mempunyai batasan yang melekat seperti slippage besar dan ketidakupayaan untuk menyesuaikan diri dengan pasaran yang berbelit-belit. Penambahbaikan masa depan boleh memberi tumpuan kepada pengoptimuman parameter dinamik, memperkenalkan kriteria tambahan, dan membina mekanisme pautan antara pasaran. Secara keseluruhan, ini adalah strategi perdagangan kuantitatif dengan ruang optimasi yang luas dan prospek aplikasi yang menjanjikan.


/*backtest
start: 2023-03-02 00:00:00
end: 2024-03-07 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy('[Jacky] Trader XO Macro Trend Scanner', overlay=true)

// Variables
var ok = 0
var countBuy = 0
var countSell = 0
src = input(close, title='OHLC Type')
i_fastEMA = input(12, title='Fast EMA')
i_slowEMA = input(25, title='Slow EMA')
i_defEMA = input(25, title='Consolidated EMA')

// Allow the option to show single or double EMA
i_bothEMAs = input(title='Show Both EMAs', defval=true)

// Define EMAs
v_fastEMA = ta.ema(src, i_fastEMA)
v_slowEMA = ta.ema(src, i_slowEMA)
v_biasEMA = ta.ema(src, i_defEMA)

// Color the EMAs
emaColor = v_fastEMA > v_slowEMA ? color.green : v_fastEMA < v_slowEMA ? color.red : #FF530D

// Plot EMAs
plot(i_bothEMAs ? na : v_biasEMA, color=emaColor, linewidth=3, title='Consolidated EMA')
plot(i_bothEMAs ? v_fastEMA : na, title='Fast EMA', color=emaColor)
plot(i_bothEMAs ? v_slowEMA : na, title='Slow EMA', color=emaColor)

// Colour the bars
buy = v_fastEMA > v_slowEMA
sell = v_fastEMA < v_slowEMA

if buy
    countBuy += 1
    countBuy

if buy
    countSell := 0
    countSell

if sell
    countSell += 1
    countSell

if sell
    countBuy := 0
    countBuy

buysignal = countBuy < 2 and countBuy > 0 and countSell < 1 and buy and not buy[1]
sellsignal = countSell > 0 and countSell < 2 and countBuy < 1 and sell and not sell[1]

barcolor(buysignal ? color.green : na)
barcolor(sellsignal ? color.red : na)

// Strategy backtest
if (buysignal)
    strategy.entry("Buy", strategy.long)

if (sellsignal)
    strategy.entry("Sell", strategy.short)

// Plot Bull/Bear

plotshape(buysignal, title='Bull', text='Bull', style=shape.triangleup, location=location.belowbar, color=color.new(color.green, 0), textcolor=color.new(color.black, 0), size=size.tiny)
plotshape(sellsignal, title='Bear', text='Bear', style=shape.triangledown, location=location.abovebar, color=color.new(color.red, 0), textcolor=color.new(color.black, 0), size=size.tiny)

bull = countBuy > 1
bear = countSell > 1

barcolor(bull ? color.green : na)
barcolor(bear ? color.red : na)

// Set Alerts

alertcondition(ta.crossover(v_fastEMA, v_slowEMA), title='Bullish EMA Cross', message='Bullish EMA crossover')
alertcondition(ta.crossunder(v_fastEMA, v_slowEMA), title='Bearish EMA Cross', message='Bearish EMA Crossover')

// Stoch RSI code

smoothK = input.int(3, 'K', minval=1)
smoothD = input.int(3, 'D', minval=1)
lengthRSI = input.int(14, 'RSI Length', minval=1)
lengthStoch = input.int(14, 'Stochastic Length', minval=1)

rsi1 = ta.rsi(src, lengthRSI)
k = ta.sma(ta.stoch(rsi1, rsi1, rsi1, lengthStoch), smoothK)
d = ta.sma(k, smoothD)

bandno0 = input.int(80, minval=1, title='Upper Band', group='Bands (change this instead of length in Style for Stoch RSI colour to work properly)')
bandno2 = input.int(50, minval=1, title='Middle Band', group='Bands (change this instead of length in Style for Stoch RSI colour to work properly)')
bandno1 = input.int(20, minval=1, title='Lower Band', group='Bands (change this instead of length in Style for Stoch RSI colour to work properly)')

// Alerts

crossoverAlertBgColourMidOnOff = input.bool(title='Crossover Alert Background Colour (Middle Level) [ON/OFF]', group='Crossover Alerts', defval=false)
crossoverAlertBgColourOBOSOnOff = input.bool(title='Crossover Alert Background Colour (OB/OS Level) [ON/OFF]', group='Crossover Alerts', defval=false)

crossoverAlertBgColourGreaterThanOnOff = input.bool(title='Crossover Alert >input [ON/OFF]', group='Crossover Alerts', defval=false)
crossoverAlertBgColourLessThanOnOff = input.bool(title='Crossover Alert <input [ON/OFF]', group='Crossover Alerts', defval=false)

maTypeChoice = input.string('EMA', title='MA Type', group='Moving Average', options=['EMA', 'WMA', 'SMA', 'None'])
maSrc = input.source(close, title='MA Source', group='Moving Average')
maLen = input.int(200, minval=1, title='MA Length', group='Moving Average')

maValue = if maTypeChoice == 'EMA'
    ta.ema(maSrc, maLen)
else if maTypeChoice == 'WMA'
    ta.wma(maSrc, maLen)
else if maTypeChoice == 'SMA'
    ta.sma(maSrc, maLen)
else
    0

crossupCHECK = maTypeChoice == 'None' or open > maValue and maTypeChoice != 'None'
crossdownCHECK = maTypeChoice == 'None' or open < maValue and maTypeChoice != 'None'

crossupalert = crossupCHECK and ta.crossover(k, d) and (k < bandno2 or d < bandno2)
crossdownalert = crossdownCHECK and ta.crossunder(k, d) and (k > bandno2 or d > bandno2)
crossupOSalert = crossupCHECK and ta.crossover(k, d) and (k < bandno1 or d < bandno1)
crossdownOBalert = crossdownCHECK and ta.crossunder(k, d) and (k > bandno0 or d > bandno0)

aboveBandalert = ta.crossunder(k, bandno0)
belowBandalert = ta.crossover(k, bandno1)

bgcolor(color=crossupalert and crossoverAlertBgColourMidOnOff ? #4CAF50 : crossdownalert and crossoverAlertBgColourMidOnOff ? #FF0000 : na, title='Crossover Alert Background Colour (Middle Level)', transp=70)
bgcolor(color=crossupOSalert and crossoverAlertBgColourOBOSOnOff ? #fbc02d : crossdownOBalert and crossoverAlertBgColourOBOSOnOff ? #000000 : na, title='Crossover Alert Background Colour (OB/OS Level)', transp=70)

bgcolor(color=aboveBandalert and crossoverAlertBgColourGreaterThanOnOff ? #ff0014 : crossdownalert and crossoverAlertBgColourMidOnOff ? #FF0000 : na, title='Crossover Alert - K > Upper level', transp=70)
bgcolor(color=belowBandalert and crossoverAlertBgColourLessThanOnOff ? #4CAF50 : crossdownalert and crossoverAlertBgColourMidOnOff ? #FF0000 : na, title='Crossover Alert - K < Lower level', transp=70)

alertcondition(crossupalert or crossdownalert, title='Stoch RSI Crossover', message='STOCH RSI CROSSOVER')





Lebih lanjut