Momentum ADX dengan RSI Trailing Stop Strategy

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

Ringkasan

Strategi ini menggabungkan penunjuk momentum dengan Indeks Kekuatan Relatif (RSI) bersama-sama dengan mekanisme hentian yang dinamik untuk menangkap arah trend sambil mengawal risiko. Ia panjang apabila terdapat momentum menaik yang kuat dan pendek apabila terdapat momentum menurun yang kuat. Strategi ini juga menetapkan keadaan mengambil keuntungan dan menghentikan kerugian menggunakan hentian hentian untuk mengunci keuntungan dan mengurangkan kerugian.

Cara Ia Bekerja

Masuk dengan Momentum ADX dan RSI

  • Gunakan penunjuk ADX untuk menentukan arah trend harga

    • ADX di atas 20 menunjukkan trend hadir

    • +DI melintasi di atas -DI adalah isyarat panjang

    • - DI melintasi di bawah + DI adalah isyarat pendek

  • RSI untuk mengenal pasti overbought/oversold

    • RSI di atas 70 menunjukkan overbought, isyarat pendek

    • RSI di bawah 30 menunjukkan oversold, isyarat panjang

Mengambil kedudukan panjang/pendek apabila ADX menunjukkan trend + isyarat pengesahan RSI.

Penghentian Penghantar yang Boleh Diatur

Strategi ini menggunakan mekanisme hentian yang dinamik dengan dua parameter:

  • Tahap pengaktifan: Mengaktifkan penangguhan trailing apabila harga mencapai peratusan yang ditetapkan selepas masuk

  • Peratusan pengangkutan: Peratusan set paras berhenti dari keuntungan tertinggi

Apabila diaktifkan, hentian penghantaran akan mengikuti tahap keuntungan tertinggi. Apabila harga kembali, tahap hentian bergerak lebih rendah. Jika retracement melebihi peratusan jejak, hentian dicetuskan menutup semua kedudukan.

Kelebihan

  • Momentum ADX menentukan arah trend, mengelakkan pecah palsu

  • Pengesahan RSI memastikan peluang pembalikan tidak terlepas

  • Penghentian yang boleh diselaraskan mengunci keuntungan dan meminimumkan kerugian

  • Logik strategi yang mudah dan jelas, mudah difahami

  • Berlaku untuk pelbagai pasaran dan jangka masa

Risiko dan Pengurangan

  • ADX mungkin memberi isyarat pecah palsu

    • Tune parameter ADX untuk mengesan pergerakan trend sebenar
  • RSI boleh memberikan beberapa isyarat palsu

    • Sesuaikan tahap overbought/oversold untuk mengurangkan whipsaws
  • Parameter hentian belakang yang buruk

    • Mengoptimumkan parameter untuk mencari paras berhenti terbaik
  • Celah boleh menyebabkan berhenti terlewat

    • Pertimbangkan untuk menggunakan perintah stop-limit

Peluang Pengoptimuman

  • Uji gabungan ADX/RSI untuk mengoptimumkan entri

  • Backtest pelbagai tahap pengaktifan dan peratusan jejak

  • Tambah penapis tambahan untuk meningkatkan kualiti isyarat

  • Ujian di pasaran yang berbeza untuk mencari parameter yang kukuh

Kesimpulan

Strategi ini mengintegrasikan analisis momentum, RSI dan trailing stops untuk menentukan arah trend, pembalikan spot, dan kawalan risiko dengan berkesan. Logik yang mudah membuatnya mudah dilaksanakan di seluruh pasaran saham, forex, crypto, dan pasaran trend lain. Penambahbaikan lanjut boleh datang melalui pengoptimuman parameter dan penambahan penapis. Secara keseluruhan ia menyediakan peniaga dengan kerangka perdagangan kuantitatif yang kukuh.


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