Strategi ADX + RSI

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

Gambaran umum

Ini adalah strategi mengikuti tren yang menggabungkan indikator ADX dan RSI. Ini menggunakan RSI untuk mengidentifikasi tingkat overbought dan oversold untuk menghasilkan sinyal perdagangan, dan ADX untuk menentukan tren untuk menyaring perdagangan ketika tren tidak jelas, sehingga menghindari whipsaws di pasar yang terikat kisaran.

Logika Strategi

  1. Menggunakan RSI 7-periode untuk mengidentifikasi tingkat overbought dan oversold
  • RSI di bawah 30 dianggap oversold
  • RSI di atas 70 dianggap overbought
  1. Gunakan ADX untuk menentukan tren
  • ADX di atas 30 menunjukkan tren yang kuat
  • ADX di bawah 30 menunjukkan tidak ada tren
  1. Aturan masuk
  • Long ketika RSI < 30 dan ADX > 30
  • Short ketika RSI > 70 dan ADX > 30
  1. Ambil keuntungan dan stop loss
  • Metode mengambil keuntungan dan stop loss opsional - berdasarkan close atau swing
  • Harga penutupan untuk penggunaan dekat
  • Penggunaan berdasarkan swing terbaru swing high/low

Analisis Keuntungan

  1. RSI secara efektif mengidentifikasi tingkat overbought dan oversold untuk menghindari perangkap pembelian/penjualan

  2. ADX menyaring pasar yang terikat jangkauan untuk menghindari whipsaws

  3. Metode mengambil keuntungan/stop loss opsional membantu mengendalikan risiko dengan lebih baik

  4. Sederhana dan mudah dimengerti, baik untuk pemula untuk belajar perdagangan algoritma

  5. Banyak ruang untuk optimasi parameter dan penyempurnaan

Analisis Risiko

  1. RSI overbought/oversold mungkin memiliki pullbacks dan reversals

  2. Penentuan tren ADX memiliki keterlambatan, mungkin melewatkan titik balik tren

  3. Penempatan stop loss yang tidak tepat dapat menyebabkan kerugian

  4. Risiko optimasi yang berlebihan karena kesederhanaan

  5. Optimasi parameter diperlukan untuk kinerja yang lebih baik

Arahan Optimasi

  1. Mengoptimalkan parameter RSI dan tingkat overbought/oversold

  2. Uji periode ADX yang berbeda untuk menemukan pengaturan optimal

  3. Uji metode profit/stop loss yang berbeda

  4. Tambahkan filter tren untuk menghindari perdagangan kontra-tren

  5. Gabungkan dengan indikator lain untuk peningkatan kinerja

Ringkasan

Strategi ini menggabungkan kekuatan dari indikator RSI dan ADX klasik untuk mengidentifikasi tren dan menghindari whipsaws. Ini memiliki banyak ruang untuk optimasi untuk mencapai kinerja yang lebih baik. Secara keseluruhan, ini berfungsi dengan baik sebagai strategi perdagangan algoritma pengantar pemula, dan juga dapat 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 banyak