
Chiến lược giao dịch RSI trái ngược với RSI ngẫu nhiên là một phương pháp phân tích kỹ thuật cao, được thiết kế đặc biệt để xác định các bước ngoặt quan trọng trong thị trường. Chiến lược này kết hợp sức mạnh của chỉ số tương đối mạnh (RSI) và chỉ số tương đối mạnh ngẫu nhiên (SRSI) để dự đoán sự thay đổi xu hướng tiềm ẩn bằng cách theo dõi sự thay đổi giữa giá và các chỉ số động lực này. Ngoài ra, chiến lược này cũng tích hợp chỉ số trung bình di chuyển (EMA) làm bộ lọc xu hướng và áp dụng bộ lọc khoảng cách dao động chính xác để đảm bảo nắm bắt sự thay đổi cấu trúc thị trường có ý nghĩa thay vì tiếng ồn thị trường.
Nguyên tắc cốt lõi của chiến lược này dựa trên khái niệm lệch lạc trong phân tích kỹ thuật. Khi xảy ra khi xu hướng giá không phù hợp với xu hướng của các chỉ số kỹ thuật, nó thường cho thấy xu hướng hiện tại có thể sắp đảo ngược. Chiến lược này tập trung vào bốn loại lệch lạc:
Chiến lược này sử dụng các điều kiện lọc nghiêm ngặt để đảm bảo chất lượng của tín hiệu:
Khi phát hiện sai lệch, chiến lược sẽ vẽ các nhãn và đường nối trên biểu đồ, cho phép các nhà giao dịch nhận ra các tín hiệu quan trọng này một cách trực quan. Ngoài ra, chiến lược sẽ tự động tạo ra các tín hiệu nhập vào và đi theo tín hiệu sai lệch.
Để giảm thiểu những rủi ro này, chúng tôi đề nghị:
Chiến lược giao dịch RSI và RSI ngẫu nhiên là một công cụ phân tích kỹ thuật phức tạp và mạnh mẽ, có khả năng nắm bắt các tín hiệu đảo ngược thị trường tiềm năng và tiếp tục xu hướng bằng cách xác định sự không phù hợp giữa giá và các chỉ số động lực. Chiến lược này cung cấp một phương pháp toàn diện để xác định các cơ hội giao dịch có khả năng cao bằng cách tích hợp các phát hiện ngẫu nhiên và ẩn, và áp dụng các bộ lọc được thiết kế cẩn thận.
Tuy nhiên, giống như tất cả các phương pháp phân tích kỹ thuật, chiến lược này cũng có những hạn chế và rủi ro. Bằng cách thực hiện các tối ưu hóa được đề xuất, chẳng hạn như thêm cơ chế quản lý rủi ro, cải thiện xác nhận tín hiệu và tích hợp điều chỉnh tham số động, sự ổn định và hiệu suất của chiến lược có thể được cải thiện đáng kể.
Cuối cùng, chiến lược này phù hợp nhất với một phần của hệ thống giao dịch rộng lớn hơn, kết hợp với các công cụ phân tích khác và các nguyên tắc quản lý vốn thích hợp. Đối với các nhà giao dịch hiểu về phân tích kỹ thuật và cấu trúc thị trường, chiến lược này có thể trở thành một công cụ quý giá để phát hiện các thiết lập giao dịch chất lượng cao.
/*backtest
start: 2024-06-26 00:00:00
end: 2025-06-24 08:00:00
period: 2d
basePeriod: 2d
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/
//@version=6
strategy("RSI Divergence Strategy", overlay=true)
//strategy("RSI & SRSI Divergence Strategy with EMA & Min Swing Filter + Price Chart Lines", overlay=true)
rsiLength = input.int(14, title="RSI Length")
srsiLength = input.int(14, title="Stochastic RSI Length")
kLength = input.int(3, title="%K Length")
dLength = input.int(3, title="%D Length")
emaLength = input.int(200, title="EMA Length")
lookback = input.int(40, title="Lookback Period for Divergence")
minSwingDistPercent = input.float(1.5, title="Minimum Swing Distance (%)")
minPriceMovePercent = input.float(0.5, title="Minimum Price Move from Last Swing (%)")
rsi = ta.rsi(close, rsiLength)
srsi = ta.stoch(rsi, rsi, rsi, srsiLength)
k = ta.sma(srsi, kLength)
d = ta.sma(k, dLength)
ema200 = ta.ema(close, emaLength)
// === Bullish Regular Divergence ===
var float lastLowPrice = na
var float lastLowRsi = na
var float lastLowSrsi = na
var int lastLowIndex = na
bullishDiv = false
if ta.lowestbars(low, lookback) == 0
if not na(lastLowPrice) and not na(lastLowRsi) and not na(lastLowSrsi)
swingDistLow = math.abs(low - lastLowPrice) / lastLowPrice * 100
priceMoveLow = math.abs(low - lastLowPrice) / lastLowPrice * 100
if swingDistLow >= minSwingDistPercent and priceMoveLow >= minPriceMovePercent
if (low < lastLowPrice and rsi > lastLowRsi) or (low < lastLowPrice and k > lastLowSrsi)
bullishDiv := true
lastLowPrice := low
lastLowRsi := rsi
lastLowSrsi := k
lastLowIndex := bar_index
else
lastLowPrice := low
lastLowRsi := rsi
lastLowSrsi := k
lastLowIndex := bar_index
// === Bearish Regular Divergence ===
var float lastHighPrice = na
var float lastHighRsi = na
var float lastHighSrsi = na
var int lastHighIndex = na
bearishDiv = false
if ta.highestbars(high, lookback) == 0
if not na(lastHighPrice) and not na(lastHighRsi) and not na(lastHighSrsi)
swingDistHigh = math.abs(high - lastHighPrice) / lastHighPrice * 100
priceMoveHigh = math.abs(high - lastHighPrice) / lastHighPrice * 100
if swingDistHigh >= minSwingDistPercent and priceMoveHigh >= minPriceMovePercent
if (high > lastHighPrice and rsi < lastHighRsi) or (high > lastHighPrice and k < lastHighSrsi)
bearishDiv := true
lastHighPrice := high
lastHighRsi := rsi
lastHighSrsi := k
lastHighIndex := bar_index
else
lastHighPrice := high
lastHighRsi := rsi
lastHighSrsi := k
lastHighIndex := bar_index
// === Bullish Hidden Divergence ===
bullishHiddenDiv = false
if ta.lowestbars(low, lookback) == 0
if not na(lastLowPrice) and not na(lastLowRsi) and not na(lastLowSrsi)
swingDistLowHidden = math.abs(low - lastLowPrice) / lastLowPrice * 100
priceMoveLowHidden = math.abs(low - lastLowPrice) / lastLowPrice * 100
if swingDistLowHidden >= minSwingDistPercent and priceMoveLowHidden >= minPriceMovePercent
if (low > lastLowPrice and rsi < lastLowRsi) or (low > lastLowPrice and k < lastLowSrsi)
bullishHiddenDiv := true
// === Bearish Hidden Divergence ===
bearishHiddenDiv = false
if ta.highestbars(high, lookback) == 0
if not na(lastHighPrice) and not na(lastHighRsi) and not na(lastHighSrsi)
swingDistHighHidden = math.abs(high - lastHighPrice) / lastHighPrice * 100
priceMoveHighHidden = math.abs(high - lastHighPrice) / lastHighPrice * 100
if swingDistHighHidden >= minSwingDistPercent and priceMoveHighHidden >= minPriceMovePercent
if (high < lastHighPrice and rsi > lastHighRsi) or (high < lastHighPrice and k > lastHighSrsi)
bearishHiddenDiv := true
// === PLOTS ===
plot(ema200, title="EMA 200", color=color.purple, linewidth=2)
// === STRATEGY ENTRIES ===
if bullishDiv or bullishHiddenDiv
strategy.entry("Long", strategy.long)
if bearishDiv or bearishHiddenDiv
strategy.entry("Short", strategy.short)