Indikator RSI Strategi berganda

Penulis:ChaoZhang, Tarikh: 2023-09-19 19:43:19
Tag:

Ringkasan

Strategi ini menggunakan penunjuk Indeks Kekuatan Relatif (RSI) untuk menentukan tahap overbought dan oversold untuk pendek dan panjang. Ini adalah strategi perdagangan pembalikan RSI biasa. Strategi ini juga menggabungkan pengoptimuman parameter, hentian kerugian dll untuk menyesuaikan diri dengan keadaan pasaran yang berbeza.

Logika Strategi

Logik teras termasuk:

  1. Pengiraan nilai RSI
  2. Menetapkan had atas dan bawah RSI
  3. Membawa kepada jangka pendek apabila RSI melintasi batas atas
  4. Pergi panjang apabila RSI melintasi di bawah had bawah
  5. Menetapkan tahap mengambil keuntungan dan menghentikan kerugian
  6. Posisi keluar apabila RSI berbalik atau mengambil keuntungan/berhenti kerugian

Indikator RSI menunjukkan overbought di atas 70 dan oversold di bawah 30 keadaan pasaran. Strategi ini menggunakan logik klasik ini untuk menentukan entri panjang / pendek berdasarkan nilai RSI terhadap had yang telah ditetapkan. Parameter yang boleh disesuaikan juga membolehkan mengoptimumkan had, stop loss dan lain-lain untuk penyesuaian pasaran.

Kelebihan

  • RSI secara berkesan mengenal pasti keadaan pasaran yang terlalu banyak dibeli / terlalu banyak dijual
  • RSI mempunyai asas teori yang kukuh
  • Parameter yang boleh disesuaikan disesuaikan dengan instrumen dan keadaan
  • Riska mengambil keuntungan/menghentikan kerugian

Risiko dan Pengurangan

  • Potensi isyarat RSI palsu yang membawa kepada kerugian
  • Memerlukan pengoptimuman berterusan tahap RSI
  • Hentian boleh dipukul dengan kerap semasa tindakan harga yang bergolak

Pengurangan:

  1. Faktor tambahan untuk mengesahkan isyarat dan mengelakkan isyarat palsu
  2. Mengoptimumkan tahap RSI berdasarkan ciri instrumen
  3. Sesuaikan penempatan stop loss untuk mengurangkan risiko whipsaw

Peluang Peningkatan

Strategi ini boleh dipertingkatkan melalui:

  1. Pembelajaran mesin untuk pengoptimuman tahap RSI automatik

  2. Pengesahan jumlah untuk mengelakkan pecah palsu

  3. Faktor tambahan seperti purata bergerak untuk pengesahan pelbagai faktor

  4. Penangguhan penyesuaian berdasarkan turun naik pasaran

  5. Analisis jumlah untuk mengukur aliran masuk/aliran keluar dana

  6. Menggabungkan dengan strategi yang tidak berkaitan untuk mengurangkan penggunaan portfolio

Kesimpulan

Ini adalah strategi pembalikan purata yang mudah dan praktikal menggunakan RSI untuk pengesanan overbought / oversold. Parameter yang boleh disesuaikan membolehkan penyesuaian dengan pasaran yang berubah. Peningkatan seperti hentian adaptif, pengesahan pelbagai faktor, dan pengoptimuman parameter dapat menjadikan strategi lebih mantap.


/*backtest
start: 2023-08-19 00:00:00
end: 2023-09-18 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy("4All V3", shorttitle="Strategy", overlay=true)

/////////////// Component Code Start ///////////////
testStartYear = input(2011, "Backtest Start Year") 
testStartMonth = input(8, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)

testStopYear = input(2018, "Backtest Stop Year")
testStopMonth = input(9, "Backtest Stop Month")
testStopDay = input(29, "Backtest Stop Day")
// testStopDay = testStartDay + 1
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)

// A switch to control background coloring of the test period
testPeriodBackground = input(title="Color Background?", type=bool, defval=true)
testPeriodBackgroundColor = testPeriodBackground and (time >= testPeriodStart) and (time <= testPeriodStop) ? #00FF00 : na
bgcolor(testPeriodBackgroundColor, transp=97)

testPeriod() => true
/////////////// Component Code Stop ///////////////

src = close
len = input(4, minval=1, title="Length")

up = rma(max(change(src), 0), len)
down = rma(-min(change(src), 0), len)
rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down))

rsin = input(5)
sn = 100 - rsin
ln = 0 + rsin

/////////////// STRATEGY ///////////////
ts = input(99999, "Trailing Stop") / 10000
tp = input(15, "Take Profit") / 10000
sl = input(23, "Stop Loss") / 10000

pyr = input(1, "Pyramiding")

short = crossover(rsi, sn)
long = crossunder(rsi, ln)

totalLongs = 0
totalLongs := nz(totalLongs[1])
totalShorts = 0
totalShorts := nz(totalShorts[1])

totalLongsPrice = 0
totalLongsPrice := nz(totalLongsPrice[1])
totalShortsPrice = 0
totalShortsPrice := nz(totalShortsPrice[1])

sectionLongs = 0
sectionLongs := nz(sectionLongs[1])
sectionShorts = 0
sectionShorts := nz(sectionShorts[1])

if long
    sectionLongs := sectionLongs + 1
    sectionShorts := 0

if short
    sectionLongs := 0
    sectionShorts := sectionShorts + 1

longCondition = long and sectionLongs >= pyr
shortCondition = short and sectionShorts >= pyr

last_long = na
last_short = na
last_long := longCondition ? time : nz(last_long[1])
last_short := shortCondition ? time : nz(last_short[1])

long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)

last_open_long_signal = na
last_open_short_signal = na
last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1])

last_long_signal = na
last_short_signal = na
last_long_signal := long_signal ? time : nz(last_long_signal[1])
last_short_signal := short_signal ? time : nz(last_short_signal[1])

in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal

last_high = na
last_low = na
last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])

long_ts = not na(last_high) and high <= (last_high - ts) //and high >= last_open_long_signal
short_ts = not na(last_low) and low >= (last_low + ts) //and low <= last_open_short_signal

long_tp = high >= (last_open_long_signal + tp)
short_tp = low <= (last_open_short_signal - tp)

long_sl = low <= (last_open_long_signal - sl)
short_sl = high >= (last_open_short_signal + sl)

leverage = input(1, "Leverage")
long_call = last_open_long_signal - (0.8 + 0.2 * (1/leverage)) / leverage * last_open_long_signal
short_call = last_open_short_signal + (0.78 + 0.2 * (1/leverage)) / leverage * last_open_short_signal
long_call_signal = low <= long_call
short_call_signal = high >= short_call

if testPeriod()
    strategy.entry("Long", strategy.long, when=longCondition)
    strategy.entry("Short", strategy.short, when=shortCondition)
    
    strategy.close("Long", when=long_call_signal)
    strategy.close("Short", when=short_call_signal)
    strategy.close("Long", when=long_tp)
    strategy.close("Short", when=short_tp)
    strategy.close("Long", when=long_sl)
    strategy.close("Short", when=short_sl)
    strategy.close("Long", when=long_ts)
    strategy.close("Short", when=short_ts)

Lebih lanjut