Sumber daya yang dimuat... Pemuatan...

Momentum ADX dengan RSI Trailing Stop Strategy

Penulis:ChaoZhang, Tanggal: 2023-10-09 15:36:07
Tag:

Gambaran umum

Strategi ini menggabungkan indikator momentum dengan Relative Strength Index (RSI) bersama dengan mekanisme trailing stop dinamis untuk menangkap arah tren sambil mengendalikan risiko.

Cara Kerjanya

Masuk dengan Momentum ADX dan RSI

  • Gunakan indikator ADX untuk menentukan arah tren harga

    • ADX di atas 20 menunjukkan tren hadir

    • +DI penyeberangan di atas -DI adalah sinyal panjang

    • - DI menyeberang di bawah + DI adalah sinyal pendek

  • RSI untuk mengidentifikasi overbought/oversold

    • RSI di atas 70 menunjukkan overbought, sinyal short

    • RSI di bawah 30 menunjukkan oversold, sinyal panjang

Ambil posisi panjang/pendek ketika ADX menunjukkan sinyal konfirmasi tren + RSI.

Penghentian Belakang yang Bisa Disesuaikan

Strategi ini menggunakan mekanisme stop trailing dinamis dengan dua parameter:

  • Tingkat aktivasi: Aktifkan trailing stop ketika harga mencapai persentase yang ditetapkan setelah masuk

  • Persentase trailing: Stop level trails set persentase dari keuntungan tertinggi

Setelah diaktifkan, trailing stop akan mengikuti tingkat keuntungan tertinggi. Saat harga mundur, level stop bergerak lebih rendah. Jika retracement melebihi persentase jejak, stop dipicu menutup semua posisi.

Keuntungan

  • Momentum ADX menentukan arah tren, menghindari pecah palsu

  • Konfirmasi RSI memastikan peluang pembalikan tidak dilewatkan

  • Stop trailing yang dapat disesuaikan mengunci keuntungan dan meminimalkan kerugian

  • Logika strategi yang sederhana dan jelas, mudah dipahami

  • Berlaku pada berbagai pasar dan jangka waktu

Risiko dan Pengurangan

  • ADX mungkin memberi sinyal palsu.

    • Tune parameter ADX untuk mendeteksi pergerakan tren yang sebenarnya
  • RSI dapat memberikan beberapa sinyal palsu

    • Sesuaikan tingkat overbought/oversold untuk mengurangi whipsaws
  • Parameter trailing stop yang buruk

    • Mengoptimalkan parameter untuk menemukan tingkat berhenti terbaik
  • Celah dapat menyebabkan berhenti yang terlewatkan

    • Pertimbangkan untuk menggunakan perintah stop-limit

Peluang Optimalisasi

  • Uji kombinasi ADX/RSI untuk mengoptimalkan entri

  • Backtest berbagai tingkat aktivasi dan persentase jejak

  • Tambahkan filter tambahan untuk meningkatkan kualitas sinyal

  • Uji pada pasar yang berbeda untuk menemukan parameter yang kuat

Kesimpulan

Strategi ini mengintegrasikan analisis momentum, RSI dan trailing stops untuk secara efektif menentukan arah tren, pembalikan spot, dan mengendalikan risiko. Logika yang mudah membuatnya sederhana untuk diterapkan di pasar saham, forex, crypto, dan pasar tren lainnya. Perbaikan lebih lanjut dapat datang melalui optimasi parameter dan menambahkan filter. Secara keseluruhan, ini memberikan pedagang kerangka kerja perdagangan kuantitatif yang kuat.


/*backtest
start: 2023-10-01 00:00:00
end: 2023-10-03 00:00:00
period: 30m
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Trailing Stop with RSI", overlay=true)

length = input.int(12, "Momentum Length")
price = close
momentum(seria, length) =>
    mom = seria - seria[length]
    mom
mom0 = momentum(price, length)
mom1 = momentum(mom0, 1)

rsiLength = input.int(14, "RSI Length")
rsiOverbought = input(70, "RSI Overbought Level")
rsiOversold = input(30, "RSI Oversold Level")

rsiValue = ta.rsi(close, rsiLength)

tsact = input.float(0.0, "Trailing Stop Activation (%)", group="strategy", tooltip="Activates the Trailing Stop once this PnL is reached.") / 100
tsact := tsact ? tsact : na
ts = input.float(0.0, "Position Trailing Stop (%)", group="strategy", tooltip="Trails your position with a stop loss at this distance from the highest PnL") / 100
ts := ts ? ts : na

in_long = strategy.position_size > 0
in_short = strategy.position_size < 0

var ts_ = array.new_float()
ts_size = array.size(ts_)
ts_get = ts_size > 0 ? array.get(ts_, ts_size - 1) : 0

if in_long
    if tsact and high > strategy.position_avg_price + strategy.position_avg_price * tsact
        if ts_size > 0 and ts_get < high
            array.push(ts_, high)
        if ts_size < 1
            array.push(ts_, high)
    if not tsact
        if ts_size > 0 and ts_get < high
            array.push(ts_, high)
        if ts_size < 1
            array.push(ts_, high)
if in_short
    if tsact and low < strategy.position_avg_price - strategy.position_avg_price * tsact
        if ts_size > 0 and ts_get > low
            array.push(ts_, low)
        if ts_size < 1
            array.push(ts_, low)
    if not tsact
        if ts_size > 0 and ts_get > low
            array.push(ts_, low)
        if ts_size < 1
            array.push(ts_, low)

trail = in_long and ts_size > 0 ? low < ts_get - ts_get * ts : in_short and ts_size > 0 ? high > ts_get + ts_get * ts : na

if (mom0 > 0 and mom1 > 0)
    strategy.entry("MomLE", strategy.long, stop=high+syminfo.mintick, comment="MomLE")
else
    strategy.cancel("MomLE")
if (mom0 < 0 and mom1 < 0)
    strategy.entry("MomSE", strategy.short, stop=low-syminfo.mintick, comment="MomSE")
else
    strategy.cancel("MomSE")

tsClose = in_long ? ts_get - ts_get * ts : in_short ? ts_get + ts_get * ts : na
if trail
    strategy.close_all()
if not strategy.opentrades
    array.clear(ts_)

rsiOverboughtCondition = rsiValue >= rsiOverbought
rsiOversoldCondition = rsiValue <= rsiOversold

if rsiOverboughtCondition
    strategy.close("SHORT", "SX")
    strategy.entry("LONG", strategy.long)

if rsiOversoldCondition
    strategy.close("LONG", "LX")
    strategy.entry("SHORT", strategy.short)

plotchar(ts_get, "GET", "")
plot(strategy.position_avg_price > 0 ? strategy.position_avg_price : na, "Average", color.rgb(251, 139, 64), 2, plot.style_cross)
plot(tsClose > 0 ? tsClose : na, "Trailing", color.rgb(251, 64, 64), 2, plot.style_cross)
plot(strategy.position_avg_price - strategy.position_avg_price * tsact > 0 ? strategy.position_avg_price - strategy.position_avg_price * tsact : na, "TS Activation", color.fuchsia, 2, plot.style_cross)


Lebih banyak