RSI Reversal Breakout Strategi

Penulis:ChaoZhang, Tarikh: 2023-11-08 12:11:03
Tag:

img

Ringkasan

Strategi ini adalah berdasarkan kepada penunjuk Indeks Kekuatan Relatif (RSI) dan menggunakan prinsip overbought / oversold RSI untuk membuat perdagangan pecah. Ia pergi lama apabila RSI memecahkan di atas ambang overbought dan pergi pendek apabila RSI memecahkan di bawah ambang oversold.

Logika Strategi

  1. Tetapkan parameter penunjuk RSI berdasarkan input pengguna, termasuk tempoh RSI, ambang overbought dan ambang oversold.

  2. Tentukan sama ada RSI berada di zon overbought atau oversold berdasarkan kedudukannya berbanding ambang.

  3. Apabila RSI keluar dari zon overbought / oversold dan melintasi garis ambang yang sesuai, buat perdagangan ke arah yang bertentangan. Sebagai contoh, apabila RSI pecah di atas garis overbought dari zon overbought, pasaran dianggap terbalik, pergi panjang pada titik ini. Apabila RSI pecah di bawah garis oversold dari zon oversold, pasaran dianggap terbalik, pergi pendek di sini.

  4. Selepas masuk, tetapkan stop loss dan ambil garis keuntungan.

  5. Strategi ini juga menyediakan pilihan untuk menggunakan EMA sebagai penapis. Hanya mengambil isyarat perdagangan apabila kedua-dua isyarat RSI dan harga pecah terhadap arah EMA dipenuhi.

  6. Ia juga membenarkan perdagangan hanya dalam jangka masa tertentu. Posisi akan ditutup pada akhir jangka masa.

Analisis Kelebihan

  • Menggunakan prinsip RSI klasik dengan hasil backtest yang baik.

  • Tetapan ambang overbought/oversold yang fleksibel sesuai untuk produk yang berbeza.

  • Penapis EMA pilihan mengelakkan perdagangan whipsaw yang berlebihan.

  • Menyokong SL / TP untuk meningkatkan kestabilan.

  • Menyokong penapis bingkai masa untuk mengelakkan tempoh yang tidak sesuai.

  • Menyokong kedua-dua panjang dan pendek untuk memanfaatkan sepenuhnya perubahan harga dua hala.

Analisis Risiko

  • Perbezaan RSI sering berlaku, hanya bergantung pada RSI boleh menghasilkan isyarat yang tidak tepat.

  • Tetapan ambang yang tidak betul membawa kepada perdagangan yang terlalu kerap atau hilang.

  • Tetapan SL / TP yang buruk menyebabkan terlalu agresif atau terlalu konservatif.

  • Tetapan penapis EMA yang tidak betul mungkin terlepas perdagangan yang sah atau menapis isyarat yang baik.

Penyelesaian Risiko:

  • Mengoptimumkan parameter RSI untuk produk yang berbeza.

  • Gabungkan dengan penunjuk trend untuk mengenal pasti perbezaan.

  • Uji dan optimumkan parameter SL/TP.

  • Uji dan optimumkan parameter EMA.

Arahan pengoptimuman

Strategi ini boleh ditingkatkan dalam aspek berikut:

  1. Mengoptimumkan parameter RSI untuk mencari tetapan terbaik untuk produk yang berbeza melalui backtest yang lengkap.

  2. Cuba penunjuk yang berbeza digabungkan dengan atau menggantikan RSI untuk menjana isyarat yang lebih kukuh, contohnya MACD, KD, Bollinger Bands dll.

  3. Mengoptimumkan stop loss dan mengambil strategi keuntungan untuk meningkatkan kestabilan.

  4. Mengoptimumkan parameter penapis EMA atau bereksperimen dengan penapis lain untuk lebih mengelakkan whipsaws.

  5. Tambah modul penapis trend untuk mengelakkan perdagangan terhadap trend utama.

  6. Uji jangka masa yang berbeza untuk mencari sesi perdagangan terbaik untuk strategi ini.

Ringkasan

RSI reversal breakout strategi mempunyai logik yang jelas berdasarkan prinsip overbought / oversold klasik. Ia bertujuan untuk menangkap pembalikan purata pada ekstrem dengan penapis kawalan risiko yang betul. Terdapat potensi yang baik untuk mengubahnya menjadi strategi yang stabil melalui penyesuaian parameter dan peningkatan modular.


/*backtest
start: 2023-10-08 00:00:00
end: 2023-11-07 00:00:00
period: 1h
basePeriod: 15m
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/
// © REV0LUTI0N

//@version=4

strategy("RSI Strategy", overlay=true, initial_capital = 10000, default_qty_value = 10000, default_qty_type = strategy.cash)

// Strategy Backtesting
startDate  = input(timestamp("2021-10-01T00:00:00"), type = input.time, title='Backtesting Start Date')
finishDate = input(timestamp("9999-12-31T00:00:00"), type = input.time, title='Backtesting End Date')

time_cond  = true
// Strategy

Length = input(12, minval=1)
src = input(close, title="Source")
overbought = input(70, minval=1)
oversold = input(30, minval=1)
xRSI = rsi(src, Length)
    
rsinormal = input(true, title="Overbought Go Long & Oversold Go Short")
rsiflipped = input(false, title="Overbought Go Short & Oversold Go Long")

// EMA Filter
noemafilter = input(true, title="No EMA Filter")
useemafilter = input(false, title="Use EMA Filter")
ema_length = input(defval=15, minval=1, title="EMA Length")
emasrc = input(close, title="Source")
ema = ema(emasrc, ema_length)
plot(ema, "EMA", style=plot.style_linebr, color=#cad850, linewidth=2)

//Time Restriction Settings
startendtime = input("", title='Time Frame To Enter Trades')
enableclose = input(false, title='Enable Close Trade At End Of Time Frame')
timetobuy = (time(timeframe.period, startendtime))
timetoclose = na(time(timeframe.period, startendtime))

// Stop Loss & Take Profit % Based
enablesl = input(false, title='Enable Stop Loss')
enabletp = input(false, title='Enable Take Profit')
stopTick = input(5.0, title='Stop Loss %', type=input.float, step=0.1) / 100
takeTick = input(10.0, title='Take Profit %', type=input.float, step=0.1) / 100

longStop = strategy.position_avg_price * (1 - stopTick)
shortStop = strategy.position_avg_price * (1 + stopTick)
shortTake = strategy.position_avg_price * (1 - takeTick)
longTake = strategy.position_avg_price * (1 + takeTick)

plot(strategy.position_size > 0 and enablesl ? longStop : na, style=plot.style_linebr, color=color.red, linewidth=1, title="Long Fixed SL")
plot(strategy.position_size < 0 and enablesl ? shortStop : na, style=plot.style_linebr, color=color.red, linewidth=1, title="Short Fixed SL")
plot(strategy.position_size > 0 and enabletp ? longTake : na, style=plot.style_linebr, color=color.green, linewidth=1, title="Long Take Profit")
plot(strategy.position_size < 0 and enabletp ? shortTake : na, style=plot.style_linebr, color=color.green, linewidth=1, title="Short Take Profit")

// Alert messages
message_enterlong  = input("", title="Long Entry message")
message_entershort = input("", title="Short Entry message")
message_closelong = input("", title="Close Long message")
message_closeshort = input("", title="Close Short message")

// Strategy Execution
if (xRSI > overbought and close > ema and time_cond and timetobuy and rsinormal and useemafilter)
    strategy.entry("Long", strategy.long, alert_message = message_enterlong)
    
if (xRSI < oversold and close < ema and time_cond and timetobuy and rsinormal and useemafilter)
    strategy.entry("Short", strategy.short, alert_message = message_entershort)
    
if (xRSI < oversold and close > ema and time_cond and timetobuy and rsiflipped and useemafilter)
    strategy.entry("Long", strategy.long, alert_message = message_enterlong)
    
if (xRSI > overbought and close < ema and time_cond and timetobuy and rsiflipped and useemafilter)
    strategy.entry("Short", strategy.short, alert_message = message_entershort)
    
if (xRSI > overbought and time_cond and timetobuy and rsinormal and noemafilter)
    strategy.entry("Long", strategy.long, alert_message = message_enterlong)
    
if (xRSI < oversold and time_cond and timetobuy and rsinormal and noemafilter)
    strategy.entry("Short", strategy.short, alert_message = message_entershort)
    
if (xRSI < oversold and time_cond and timetobuy and rsiflipped and noemafilter)
    strategy.entry("Long", strategy.long, alert_message = message_enterlong)
    
if (xRSI > overbought and time_cond and timetobuy and rsiflipped and noemafilter)
    strategy.entry("Short", strategy.short, alert_message = message_entershort)
    
if strategy.position_size > 0 and timetoclose and enableclose
    strategy.close_all(alert_message = message_closelong)
if strategy.position_size < 0 and timetoclose and enableclose
    strategy.close_all(alert_message = message_closeshort)
    
if strategy.position_size > 0 and enablesl and time_cond
    strategy.exit(id="Close Long", stop=longStop, limit=longTake, alert_message = message_closelong)
if strategy.position_size < 0 and enablesl and time_cond
    strategy.exit(id="Close Short", stop=shortStop, limit=shortTake, alert_message = message_closeshort)
    
if strategy.position_size > 0 and enabletp and time_cond
    strategy.exit(id="Close Long", stop=longStop, limit=longTake, alert_message = message_closelong)
if strategy.position_size < 0 and enabletp and time_cond
    strategy.exit(id="Close Short", stop=shortStop, limit=shortTake, alert_message = message_closeshort)
    



Lebih lanjut