Strategi ADX + RSI

Penulis:ChaoZhang, Tarikh: 2023-09-27 16:27:39
Tag:

Ringkasan

Ini adalah strategi trend-mengikuti yang menggabungkan penunjuk ADX dan RSI. Ia menggunakan RSI untuk mengenal pasti tahap overbought dan oversold untuk menjana isyarat perdagangan, dan ADX untuk menentukan trend untuk menapis perdagangan apabila trend tidak jelas, dengan itu mengelakkan whipsaws di pasaran yang terikat julat.

Logika Strategi

  1. Menggunakan RSI 7 tempoh untuk mengenal pasti tahap overbought dan oversold
  • RSI di bawah 30 dianggap oversold
  • RSI di atas 70 dianggap terlalu banyak dibeli
  1. Gunakan ADX untuk menentukan trend
  • ADX di atas 30 menunjukkan trend yang kuat
  • ADX di bawah 30 menunjukkan tiada trend
  1. Peraturan kemasukan
  • Long apabila RSI < 30 dan ADX > 30
  • Pendek apabila RSI > 70 dan ADX > 30
  1. Ambil keuntungan dan hentikan kerugian
  • Cara mengambil keuntungan dan menghentikan kerugian pilihan - berasaskan penutupan atau berasaskan pergantian
  • Harga penutupan penggunaan berhampiran
  • Penggunaan berasaskan ayunan tertinggi/rendah ayunan terkini

Analisis Kelebihan

  1. RSI secara berkesan mengenal pasti tahap overbought dan oversold untuk mengelakkan perangkap membeli / menjual

  2. ADX menapis pasaran terhad julat untuk mengelakkan whipsaws

  3. Kaedah mengambil keuntungan / menghentikan kerugian pilihan membantu mengawal risiko dengan lebih baik

  4. Mudah dan mudah difahami, baik untuk pemula untuk belajar perdagangan algoritma

  5. Banyak ruang untuk pengoptimuman parameter dan penyempurnaan

Analisis Risiko

  1. RSI overbought/oversold mungkin mempunyai pullbacks dan pembalikan

  2. Penentuan trend ADX mempunyai kelewatan, mungkin terlepas titik perubahan trend

  3. Penempatan stop loss yang tidak betul boleh menyebabkan kerugian

  4. Risiko pengoptimuman berlebihan kerana kesederhanaan

  5. Pengoptimuman parameter diperlukan untuk prestasi yang lebih baik

Arahan pengoptimuman

  1. Mengoptimumkan parameter RSI dan tahap overbought / oversold

  2. Uji tempoh ADX yang berbeza untuk mencari tetapan optimum

  3. Uji kaedah mengambil keuntungan/berhenti kehilangan yang berbeza

  4. Tambah penapis trend untuk mengelakkan perdagangan kontra-trend

  5. Gabungkan dengan penunjuk lain untuk peningkatan prestasi

Ringkasan

Strategi ini menggabungkan kekuatan penunjuk RSI dan ADX klasik untuk mengenal pasti trend dan mengelakkan whipsaws. Ia mempunyai banyak ruang untuk pengoptimuman untuk mencapai prestasi yang lebih baik. Secara keseluruhan, ia berfungsi dengan baik sebagai strategi perdagangan algoritma pengenalan pemula, dan juga boleh dimasukkan ke dalam sistem perdagangan yang lebih kompleks.


/*backtest
start: 2023-09-19 00:00:00
end: 2023-09-26 00:00:00
period: 15m
basePeriod: 5m
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/
// © tweakerID

// This is a strategy that uses the 7 Period RSI to buy when the indicator is shown as oversold (OS) and sells when 
// the index marks overbought (OB). It also uses the ADX to determine whether the trend is ranging or trending
// and filters out the trending trades. Seems to work better for automated trading when the logic is inversed (buying OB 
// and selling the OS) wihout stop loss.

//@version=4
strategy("ADX + RSI Strat", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital=100, commission_value=0.04, calc_on_every_tick=false)

direction = input(0, title = "Strategy Direction", type=input.integer, minval=-1, maxval=1)
strategy.risk.allow_entry_in(direction == 0 ? strategy.direction.all : (direction < 0 ? strategy.direction.short : strategy.direction.long))


//SL & TP Inputs
i_SL=input(false, title="Use Swing Lo/Hi Stop Loss & Take Profit")
i_SwingLookback=input(20, title="Swing Lo/Hi Lookback")
i_SLExpander=input(defval=0, step=.2, title="SL Expander")
i_TPExpander=input(defval=0, step=.2, title="TP Expander")
i_reverse=input(true, title="Reverse Trades")

//SL & TP Calculations
SwingLow=lowest(i_SwingLookback)
SwingHigh=highest(i_SwingLookback)
bought=strategy.position_size != strategy.position_size[1]
LSL=valuewhen(bought, SwingLow, 0)-((valuewhen(bought, atr(14), 0))*i_SLExpander)
SSL=valuewhen(bought, SwingHigh, 0)+((valuewhen(bought, atr(14), 0))*i_SLExpander)
lTP=strategy.position_avg_price + (strategy.position_avg_price-(valuewhen(bought, SwingLow, 0))+((valuewhen(bought, atr(14), 0))*i_TPExpander))
sTP=strategy.position_avg_price - (valuewhen(bought, SwingHigh, 0)-strategy.position_avg_price)-((valuewhen(bought, atr(14), 0))*i_TPExpander)
islong=strategy.position_size > 0
isshort=strategy.position_size < 0
SL= islong ? LSL : isshort ? SSL : na
TP= islong ? lTP : isshort ? sTP : na

//RSI Calculations
RSI=rsi(close, 7)
OS=input(30, step=5)
OB=input(80, step=5)

//ADX Calculations
adxlen = input(14, title="ADX Smoothing")
dilen = input(14, title="DI Length")
dirmov(len) =>
	up = change(high)
	down = -change(low)
	plusDM = na(up) ? na : (up > down and up > 0 ? up : 0)
	minusDM = na(down) ? na : (down > up and down > 0 ? down : 0)
	truerange = rma(tr, len)
	plus = fixnan(100 * rma(plusDM, len) / truerange)
	minus = fixnan(100 * rma(minusDM, len) / truerange)
	[plus, minus]
adx(dilen, adxlen) =>
	[plus, minus] = dirmov(dilen)
	sum = plus + minus
	adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen)
sig = adx(dilen, adxlen)
adxlevel=input(30, step=5)


//Entry Logic
BUY = sig < adxlevel and (RSI < OS) 
SELL = sig < adxlevel and (RSI > OB) 

//Entries
strategy.entry("long", strategy.long, when=i_reverse?SELL:BUY)
strategy.entry("short", strategy.short, when=not i_reverse?SELL:BUY)
//Exits
if i_SL
    strategy.exit("longexit", "long", stop=SL, limit=TP)
    strategy.exit("shortexit", "short", stop=SL, limit=TP)

//Plots
plot(i_SL ? SL : na, color=color.red, style=plot.style_cross, title="SL")
plot(i_SL ? TP : na, color=color.green, style=plot.style_cross, title="TP")
plotshape(BUY ? 1 : na, style=shape.triangleup, location=location.belowbar, color=color.green, title="Bullish Setup")
plotshape(SELL ? 1 : na, style=shape.triangledown, location=location.abovebar, color=color.red, title="Bearish Setup")

Lebih lanjut