
Strategi RSI Trend Reversal adalah strategi perdagangan kuantitatif berdasarkan indeks yang agak kuat (RSI) dan purata gelombang sebenar (ATR). Strategi ini menyesuaikan diri dengan turun naik pasaran yang cepat dengan menyesuaikan stop loss (TP / SL) secara dinamik, menangkap peluang untuk membalikkan trend. Strategi ini berpusat pada RSI, digabungkan dengan ATR untuk mengukur turun naik, dan membina dua segmen dinamika yang sesuai untuk digunakan sebagai dasar untuk membuka kedudukan.
Inti strategi pembalikan trend RSI adalah pembinaan barisan stop loss yang dinamik. Pertama, gunakan fungsi highest_custom dan lowest_custom yang disesuaikan untuk mencari harga tertinggi dan terendah sejak persimpangan terakhir, membentuk asas gelombang. Kemudian, perhitungan RSI dan ATR yang panjangnya adalah panjang, dan kemudian perhitungan seperti berikut:
Di antaranya multiplier adalah faktor pembesaran untuk band yang disesuaikan oleh pengguna. Jika harga naik ke atas, ia akan menjadi lebih banyak, dan jika turun ke bawah, ia akan menjadi kosong.
Strategi RSI Trend Reversal menggunakan RSI dan ATR untuk membina gelombang penyesuaian diri, yang dapat menyesuaikan secara dinamik titik-titik hentian dan kerugian, dan bertindak balas terhadap perubahan pasaran. Logik strategi ini jelas, luas, dan boleh digunakan sebagai alat yang kuat untuk pedagang kuantitatif. Tetapi dalam penggunaan praktikal, perhatian masih perlu diberikan kepada pilihan parameter dan kawalan risiko, dan disarankan untuk digunakan dengan kombinasi isyarat indikator lain untuk meningkatkan prestasi keseluruhan.
/*backtest
start: 2023-04-22 00:00:00
end: 2024-04-27 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("RSI Trend Reversal", overlay=true, max_bars_back = 4999, calc_on_every_tick = false)
//INPUTS
rsi_length = input.int(title = "Lenght", defval = 8)
rsi_mult = input.float(title = "Multiplier", defval = 1.5, step = .05)
lookback = input.int(title = "Delay to prevent idealization", defval = 1)
sltp = input.float(title = "Minimum Difference", defval = 10)
src = input.source(title = "Source Input", defval = close)
//PARAMETERS INITILIZATION
hclose = request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, src)
//FUNCTION INITILIZATION
highest_custom(src, length) =>
x = src
for i = 0 to length
if src[i] > x
x := src[i]
x
lowest_custom(src, length) =>
x = src
for i = 0 to length
if src[i] < x
x := src[i]
x
rsilev(src, length, mult, sltp) =>
sl = (100 - sltp) / 100
tp = (100 + sltp) / 100
var bool crossup = na
var bool crossdown = na
var float dir = na
dir_change = ta.change(dir)
var float BearGuy = 0
BullGuy = ta.barssince(crossup or crossdown)
if na(BullGuy)
BearGuy += 1
else
BearGuy := BullGuy
var float upper = na
var float lower = na
rsilower = ta.rsi(src, length)
rsiupper = math.abs(ta.rsi(src, length) - 100)
atr = ta.atr(length) / src
lower := highest_custom(math.max(highest_custom(highest_custom(src, BearGuy) * (1 - (atr + ((1 / (rsilower) * mult)))), BearGuy), src * sl), BearGuy)
upper := lowest_custom(math.min(lowest_custom(lowest_custom(src, BearGuy) * (1 + (atr + ((1 / (rsiupper) * mult)))), BearGuy), src * tp), BearGuy)
var float thresh = na
if na(thresh)
thresh := lower
if na(dir)
dir := 1
if crossdown
dir := -1
if crossup
dir := 1
if dir == 1
thresh := lower
if dir == -1
thresh := upper
crossup := ta.crossover(src, thresh)
crossdown := ta.crossunder(src, thresh)
thresh
rsiclose = rsilev(hclose, rsi_length, rsi_mult, sltp)
//PLOTTING
var color col = color.lime
if hclose > rsiclose
col := color.lime
if hclose < rsiclose
col := color.red
plot(rsiclose, linewidth = 2, color = col)
//STRATEGY
buy = ta.crossover(hclose, rsiclose)
sell = ta.crossunder(hclose, rsiclose)
if buy[lookback]
strategy.entry("long", strategy.long)
if sell[lookback]
strategy.entry("Short", strategy.short)