Chiến lược đảo ngược xu hướng RSI là một chiến lược giao dịch định lượng dựa trên chỉ số tương đối yếu ((RSI) và sóng thực trung bình ((ATR)). Chiến lược này thích ứng với biến động thị trường nhanh chóng bằng cách điều chỉnh động dừng lỗ ((TP / SL) để nắm bắt cơ hội đảo ngược xu hướng. Chiến lược lấy RSI làm trung tâm, kết hợp với ATR để đo lường biến động, xây dựng hai dải động tự thích ứng dưới đây để sử dụng làm cơ sở cho việc mở vị thế.
Cốt lõi của chiến lược đảo ngược xu hướng RSI là xây dựng các vùng dừng dừng động. Đầu tiên, hãy sử dụng hàm highest_custom và lowest_custom tùy chỉnh để tìm thấy giá cao nhất và giá thấp nhất kể từ lần giao dịch trước, tạo thành cơ sở của dải sóng. Sau đó, tính RSI và ATR theo chiều dài, sau đó tính toán như sau:
Trong đó, multiplier mở rộng nhân tố cho dải sóng tùy chỉnh của người dùng. Nếu giá lên phá vỡ đường lên thì làm nhiều, nếu giảm xuống phá vỡ đường xuống thì làm trống. Ngoài ra, màu sắc của hai dải này cũng thay đổi tùy theo vị trí của dải sóng so với giá, dễ dàng quan sát.
Chiến lược đảo ngược xu hướng RSI sử dụng RSI và ATR để xây dựng dải tự thích ứng, có thể điều chỉnh động điểm dừng lỗ để phản ứng kịp thời với sự thay đổi của thị trường. Lập luận của chiến lược rõ ràng, có phạm vi rộng, có thể là một công cụ mạnh mẽ cho thương nhân định lượng.
/*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)