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ố sức mạnh tương đối (RSI) và phạm vi trung bình thực sự (ATR). Nó điều chỉnh năng động mức lợi nhuận và dừng lỗ (TP / SL) để thích nghi với biến động thị trường nhanh chóng và nắm bắt cơ hội đảo ngược xu hướng. Chiến lược tập trung vào RSI, kết hợp với ATR để đo biến động, và xây dựng hai dải động thích nghi như cơ sở để mở và đóng các vị trí. Chiến lược này có thể được sử dụng độc lập hoặc như một mô-đun lấy lợi nhuận và dừng lỗ cho các chiến lược khác. Nó đã được thử nghiệm tốt trên dữ liệu 15 phút của các cổ phiếu như Tesla (TSLA), Apple (AAPL) và Nvidia (NDAV).
Cốt lõi của Chiến lược đảo ngược xu hướng RSI nằm trong việc xây dựng các băng tần TP / SL năng động. Đầu tiên, nó sử dụng các hàm custom highest_custom và lowest_custom để tìm giá cao nhất và thấp nhất kể từ lần chéo cuối cùng, tạo thành cơ sở của các băng tần. Sau đó, nó tính toán RSI và ATR với chiều dài được chỉ định bởi người dùng và thực hiện các tính toán sau:
Ở đây, nhân là một yếu tố mở rộng dải được xác định bởi người dùng. Nếu giá phá vỡ trên dải trên, nó sẽ dài; nếu nó phá vỡ dưới dải dưới, nó sẽ ngắn. Màu sắc của hai dải này cũng thay đổi theo vị trí của giá so với các dải, giúp nó 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 các băng thông thích nghi có thể điều chỉnh động các điểm TP / SL và phản ứng nhanh chóng với những thay đổi trên thị trường. Chiến lược có logic rõ ràng, khả năng áp dụng rộng rãi và có thể là một công cụ mạnh mẽ cho các nhà giao dịch định lượng. Tuy nhiên, trong việc sử dụng thực tế, vẫn cần chú ý đến việc lựa chọn tham số và kiểm soát rủi ro, và nên sử dụng nó kết hợp với các tín hiệu chỉ số khác để cải thiện hiệu suất tổng thể. Chiến lược có thêm không gian tối ưu hóa, chẳng hạn như thêm các bộ lọc xu hướng và tối ưu hóa tham số.
/*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)