Chiến lược đảo ngược đà RSI xác định các điều kiện mua quá mức và bán quá mức bằng cách kết hợp các chỉ số RSI và hướng cơ thể nến để giao dịch đảo ngược. Chiến lược này sử dụng cả RSI thông thường và RSI nhanh, cùng với bộ lọc cơ thể nến, để xác định hiệu quả các cơ hội đảo ngược.
Chiến lược được thực hiện chủ yếu thông qua các phần sau:
Chỉ số RSI của Connors
Tính toán chỉ số RSI thông thường, tỷ lệ thắng RSI và chỉ số RSI Paris để có được chỉ số RSI của Connors là trung bình.
Chỉ số RSI nhanh
Sử dụng thay đổi giá để tính RSI nhanh, phản ánh chu kỳ cực ngắn hạn.
Bộ lọc thân cây nến
Cần cơ thể tăng trong thời gian dài và cơ thể giảm trong thời gian ngắn để ngăn chặn sự phá vỡ sai.
Điều kiện dài và ngắn
Đi dài khi Connors RSI dưới 20 và nhanh RSI dưới 25 với cơ thể tăng.
Đi ngắn khi Connors RSI trên 80 và nhanh RSI trên 75 với cơ thể giảm.
Khóa lệnh dừng lỗ
Rời với stop loss khi thân cây nến quay lại.
Connors RSI xác định các điểm đảo ngược xu hướng dài hạn, RSI nhanh xác định các đảo ngược ngắn hạn và thân cây nến đảm bảo tính hợp lệ của sự đột phá. Điều này cho phép phát hiện hiệu quả các cơ hội đảo ngược và thực hiện các giao dịch chống xu hướng trong điều kiện mua quá mức và bán quá mức.
Những lợi thế của chiến lược này bao gồm:
Kết hợp các chỉ số dài hạn và ngắn hạn
Connors RSI phản ánh chu kỳ dài hạn và RSI nhanh phản ánh chu kỳ ngắn hạn, kết hợp cả hai có thể xác định chính xác các điểm đảo ngược.
Bộ lọc thân cây nến
Giao dịch chỉ trên cơ thể breakouts có thể giảm tổn thất từ breakouts giả.
Các thông số điều chỉnh
Các thông số RSI, sản phẩm giao dịch và khung thời gian giao dịch có thể được điều chỉnh tự do để phù hợp với các thị trường khác nhau.
Đơn giản và trực quan
RSI và thân cây nến là các chỉ số cơ bản, logic dễ hiểu.
Dễ thực hiện
Chỉ sử dụng các chỉ số tích hợp, đòi hỏi ít mã và dễ thực hiện.
Những rủi ro chính của chiến lược này:
Rủi ro đảo ngược thất bại
Giá tiếp tục xu hướng ban đầu sau tín hiệu đảo ngược, dẫn đến tổn thất.
Rủi ro thị trường khác nhau
Các tín hiệu không hiệu quả thường xuyên được kích hoạt trong các thị trường khác nhau.
Rủi ro thoát sai
Bộ lọc thân nến không thể hoàn toàn tránh được sự đột phá giả.
Rủi ro tham số
Các thông số RSI không phù hợp có thể bỏ lỡ giao dịch hoặc kích hoạt nhiều giao dịch không hiệu quả.
Rủi ro điều kiện thị trường đặc biệt
Các chỉ số RSI có thể thất bại và tạo ra các tín hiệu không chính xác trong điều kiện thị trường đặc biệt.
Chiến lược có thể được tối ưu hóa từ các khía cạnh sau:
Thêm cơ chế dừng lỗ
Tối ưu hóa các chiến lược dừng lỗ để dừng hợp lý hơn, giảm lỗ giao dịch duy nhất.
Tích hợp nhiều chỉ số
Thêm các bộ lọc như MACD và KD để làm cho tín hiệu đáng tin cậy hơn.
Thêm bộ lọc xác suất
Kết hợp phân tích xu hướng, hỗ trợ / kháng cự để tránh các giao dịch có xác suất thấp.
Tối ưu hóa cài đặt tham số
Kiểm tra các thông số trên các sản phẩm khác nhau và khung thời gian để tìm ra các giá trị tối ưu.
Tránh các điều kiện thị trường đặc biệt
Xác định và tránh giao dịch trong điều kiện thị trường đặc biệt để tránh tổn thất lớn.
Chiến lược đảo ngược đà RSI xác định các đảo ngược dài và ngắn hạn bằng cách sử dụng Connors RSI và RSI nhanh, với các bộ lọc thân nến để tăng tính hợp lệ của tín hiệu. Những lợi thế như sự kết hợp của chỉ báo và các tham số có thể điều chỉnh cho phép nắm bắt sự đảo ngược và giao dịch ngược xu hướng khi mua quá nhiều hoặc bán quá nhiều. Nhưng các rủi ro như đảo ngược thất bại và đột phá sai vẫn còn, đòi hỏi tối ưu hóa thêm trong dừng lỗ, sự kết hợp của chỉ báo để giảm rủi ro và cải thiện lợi nhuận.
/*backtest start: 2023-10-07 00:00:00 end: 2023-11-06 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //Noro //2018 //@version=2 strategy(title = "Noro's Connors RSI Strategy v1.0", shorttitle = "CRSI str 1.0", overlay = false, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 10) //Settings needlong = input(true, defval = true, title = "Long") needshort = input(true, defval = true, title = "Short") usemar = input(false, defval = false, title = "Use Martingale") capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Capital, %") usecrsi = input(true, defval = true, title = "Use CRSI Strategy") usefrsi = input(true, defval = true, title = "Use FRSI Strategy") usemod = input(true, defval = true, title = "CRSI+FRSI Mode") limit = input(25, defval = 25, minval = 1, maxval = 100, title = "RSI limit") usebod = input(true, defval = true, title = "Use Body-filter") usecol = input(true, defval = true, title = "Use Color-filter") fromyear = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year") toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year") frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month") tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month") fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day") today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day") //CRSI rsilen = 3 streaklen = 2 lookback = 100 rsi = rsi(close,rsilen) upday = close > close[1] ? 1 : 0 downday = close < close[1] ? -1 : 0 upstreak = upday!=0 ? upstreak[1] + upday : 0 downstreak = downday!=0 ? downstreak[1] + downday : 0 streak = upstreak + downstreak streakrsi = rsi(streak,streaklen) roc = close/close[1] - 1 roccount = 0 for i=1 to lookback-1 roccount := roc[i]<roc ? roccount + 1 : roccount crsi = (rsi + streakrsi + roccount) / 3 //Oscilator // rsiplot = plot(crsi, title="RSI", style=line, linewidth=1, color=blue) // band1 = hline(80, title="Upper Line", linestyle=dashed, linewidth=1, color=red) // band0 = hline(20, title="Lower Line", linestyle=dashed, linewidth=1, color=green) // fill(band1, band0, color=purple, transp=90) //Fast RSI fastup = rma(max(change(close), 0), 7) fastdown = rma(-min(change(close), 0), 7) fastrsi = fastdown == 0 ? 100 : fastup == 0 ? 0 : 100 - (100 / (1 + fastup / fastdown)) //Body Filter nbody = abs(close - open) abody = sma(nbody, 10) body = nbody > abody / 3 or usebod == false //Color Filter bar = close > open ? 1 : close < open ? -1 : 0 gbar = bar == 1 or usecol == false rbar = bar == -1 or usecol == false //Signals up1 = rbar and (strategy.position_size == 0 or close < strategy.position_avg_price) and crsi < limit and body and usecrsi dn1 = gbar and (strategy.position_size == 0 or close > strategy.position_avg_price) and crsi > 100 - limit and body and usecrsi up2 = rbar and (strategy.position_size == 0 or close < strategy.position_avg_price) and fastrsi < limit and body and usefrsi dn2 = gbar and (strategy.position_size == 0 or close > strategy.position_avg_price) and fastrsi > 100 - limit and body and usefrsi exit = ((strategy.position_size > 0 and bar == 1) or (strategy.position_size < 0 and bar == -1)) and body //Trading profit = exit ? ((strategy.position_size > 0 and close > strategy.position_avg_price) or (strategy.position_size < 0 and close < strategy.position_avg_price)) ? 1 : -1 : profit[1] mult = usemar ? exit ? profit == -1 ? mult[1] * 2 : 1 : mult[1] : 1 lot = strategy.position_size == 0 ? strategy.equity / close * capital / 100 * mult : lot[1] if ((up1 or up2) and usemod == false) or (up1 and up2 and usemod) if strategy.position_size < 0 strategy.close_all() strategy.entry("Long", strategy.long, needlong == false ? 0 : lot) if ((dn1 or dn2) and usemod == false) or (dn1 and dn2 and usemod) if strategy.position_size > 0 strategy.close_all() strategy.entry("Short", strategy.short, needshort == false ? 0 : lot) if exit strategy.close_all()