Strategi perdagangan pembalikan pelacakan sinyal RSI

Penulis:ChaoZhang, Tanggal: 2023-09-28 10:54:24
Tag:

Gambaran umum

Strategi ini mengimplementasikan perdagangan pembalikan dengan melacak sinyal overbought dan oversold yang terlewatkan dari indikator RSI. Sinyal beli dihasilkan ketika RSI turun dari tingkat overbought, dan sinyal jual ketika RSI bangkit dari tingkat oversold, bertujuan untuk menangkap peluang pembalikan.

Logika Strategi

Identifikasi sinyal

Indikator RSI mengidentifikasi tingkat overbought/oversold. Overbought ketika RSI melintasi ambang overbought, oversold ketika melintasi ambang under oversold.

overbought = rsi > uplimit
oversold = rsi < dnlimit

Jika RSI overbought bar terakhir dan keluar overbought bar ini, sinyal beliup1Jika RSI oversold bar terakhir dan keluar oversold bar ini, sinyal jualdn1yang dihasilkan.

up1 = bar == -1 and strategy.position_size == 0 and overbought[1] and overbought == false
dn1 = bar == 1 and strategy.position_size == 0 and oversold[1] and oversold == false

Logika Keluar

Jika arah batang sejajar dengan arah posisi, dan tubuh batang melebihi setengah dari rata-rata 10 periode, sinyal keluar dipicu.

exit = (((strategy.position_size > 0 and bar == 1) or  
         (strategy.position_size < 0 and bar == -1)) and  
        body > abody / 2)

Keuntungan

  1. Melacak sinyal pembalikan RSI yang terlewatkan, menghindari kebutuhan untuk menangkap titik overbought / oversold tepat waktu.

  2. Leverage properti pembalikan RSI untuk menangkap titik balik.

  3. Masukkan arah dan ukuran batang ke dalam logika keluar untuk menghindari pelacakan lebih lanjut setelah mundur.

Risiko dan Solusi

  1. Risiko sinyal palsu dari RSI

    • Solusi: Konfirmasi sinyal dengan indikator lain untuk menghindari sinyal palsu
  2. Harga mungkin sudah menarik kembali secara signifikan ketika sinyal pelacakan, meningkatkan risiko kerugian

    • Solusi: Kurangi ukuran posisi saat masuk, atau optimalkan waktu masuk
  3. Risiko keluar lebih awal sebelum pembalikan penuh yang menguntungkan

    • Solusi: Meningkatkan logika keluar untuk meningkatkan kesempatan untuk menangkap keuntungan

Peluang Peningkatan

  1. Mengoptimalkan parameter seperti tingkat overbought / oversold, periode review dll berdasarkan pasar yang berbeda

  2. Sesuaikan ukuran posisi, seperti menurunkan ukuran saat melacak sinyal

  3. Meningkatkan waktu masuk, menambahkan filter di luar sinyal pelacakan

  4. Meningkatkan keluar untuk meningkatkan profitabilitas, seperti penghentian keuntungan

  5. Optimalkan stop untuk mengurangi kerugian, seperti trailing stop atau cone stop

Ringkasan

Strategi ini menerapkan perdagangan reversal dengan melacak sinyal overbought/oversold RSI. Ini memiliki keuntungan menangkap sinyal reversal tetapi juga memiliki risiko sinyal dan kerugian yang salah. Optimasi lebih lanjut dapat meningkatkan stabilitas dan profitabilitas strategi.


/*backtest
start: 2023-09-20 00:00:00
end: 2023-09-27 00:00:00
period: 15m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro
//2018

//@version=2
strategy(title = "Noro's Anti RSI Strategy v1.0", shorttitle = "Anti RSI str 1.0", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 0)

//Settings
needlong = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
usemar = input(false, defval = false, title = "Use Martingale")
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Capital, %")
rsiperiod1 = input(14, defval = 14, minval = 2, maxval = 50, title = "RSI Period")
rsilimit1 = input(25, defval = 25, minval = 1, maxval = 100, title = "RSI limit")
showarr = input(false, defval = false, title = "Show Arrows")
fromyear = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

//RSI
uprsi1 = rma(max(change(close), 0), rsiperiod1)
dnrsi1 = rma(-min(change(close), 0), rsiperiod1)
rsi = dnrsi1 == 0 ? 100 : uprsi1 == 0 ? 0 : 100 - (100 / (1 + uprsi1 / dnrsi1))
uplimit = 100 - rsilimit1
dnlimit = rsilimit1

//Body
body = abs(close - open)
abody = sma(body, 10)

//Signals
bar = close > open ? 1 : close < open ? -1 : 0
overbought = rsi > uplimit
oversold = rsi < dnlimit

up1 = bar == -1 and strategy.position_size == 0 and overbought[1] and overbought == false
dn1 = bar == 1 and strategy.position_size == 0 and oversold[1] and oversold == false
up2 = bar == -1 and strategy.position_size > 0 and overbought == false
dn2 = bar == 1 and strategy.position_size < 0 and oversold == false

norma = overbought == false and oversold == false
exit = (((strategy.position_size > 0 and bar == 1) or (strategy.position_size < 0 and bar == -1)) and body > abody / 2)

//Arrows
col = exit ? black : up1 or dn1 or up2 or dn2 ? blue : na
needup = up1 or up2
needdn = dn1 or dn2
needexitup = exit and strategy.position_size < 0
needexitdn = exit and strategy.position_size > 0
plotarrow(showarr and needup ? 1 : na, colorup = blue, colordown = blue, transp = 0)
plotarrow(showarr and needdn ? -1 : na, colorup = blue, colordown = blue, transp = 0)
plotarrow(showarr and needexitup ? 1 : na, colorup = black, colordown = black, transp = 0)
plotarrow(showarr and needexitdn ? -1 : na, colorup = black, colordown = black, transp = 0)

//Trading
profit = exit ? ((strategy.position_size > 0 and close > strategy.position_avg_price) or (strategy.position_size < 0 and close < strategy.position_avg_price)) ? 1 : -1 : profit[1]
mult = usemar ? exit ? profit == -1 ? mult[1] * 2 : 1 : mult[1] : 1
lot = strategy.position_size == 0 ? strategy.equity / close * capital / 100 * mult : lot[1]

if up1 or up2
    if strategy.position_size < 0
        strategy.close_all()
        
    strategy.entry("Long", strategy.long, needlong == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))

if dn1 or dn2
    if strategy.position_size > 0
        strategy.close_all()
        
    strategy.entry("Short", strategy.short, needshort == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
    
if time > timestamp(toyear, tomonth, today, 23, 59) or exit
    strategy.close_all()

Lebih banyak