
Chiến lược đảo ngược RSI bằng cách kết hợp chỉ số RSI và hướng thực thể K-line để xác định hiện tượng quá mua quá bán và 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 một lúc và kết hợp với bộ lọc thực thể K-line để xác định hiệu quả cơ hội đảo ngược.
Chiến lược này được thực hiện thông qua các phần sau:
Tính RSI thông thường, RSI tỷ lệ thắng và RSI Paris-Charles, lấy trung bình của ba chỉ số này làm RSI của Connor.
RSI nhanh được tính bằng biến động giá, phản ánh chu kỳ siêu ngắn.
Cần nhiều dây mặt trời thực tế, dây âm trống, để ngăn chặn đột phá giả.
Connors RSI thấp hơn 20 và RSI nhanh hơn 25 khi đường nắng thực sự xuất hiện, làm nhiều hơn.
Connors RSI cao hơn 80 và RSI nhanh hơn 75 khi đường chân thực xuất hiện, tạo khoảng trống.
Đánh giá giá của một thực thể
Thông qua RSI của Connor để xác định điểm đảo ngược xu hướng đường dài, RSI nhanh để xác định điểm đảo ngược đường ngắn, thực thể đường K để đảm bảo hiệu quả phá vỡ, do đó có thể phát hiện hiệu quả cơ hội đảo ngược, mở vị trí và thực hiện hành động đảo ngược kịp thời khi mua quá mức.
Chiến lược này có những ưu điểm sau:
Connors RSI phản ánh chu kỳ đường dài, RSI nhanh phản ánh chu kỳ đường ngắn, kết hợp giữa hai điều này có thể xác định chính xác hơn điểm đảo ngược.
Chỉ hoạt động khi thực tế phá vỡ, có thể giảm thiệt hại do phá vỡ giả.
Các tham số RSI, loại giao dịch và thời gian giao dịch có thể được điều chỉnh tùy theo thị trường.
Các thực thể RSI và K-line là các chỉ số cơ bản, logic chiến lược rất đơn giản và dễ hiểu.
Chỉ sử dụng chỉ số tích hợp, ít mã, ít khó thực hiện.
Chiến lược này có những rủi ro chính như sau:
Sau khi tín hiệu đảo ngược, giá tiếp tục chạy theo xu hướng ban đầu, dẫn đến tổn thất.
Các tín hiệu liên tục được kích hoạt trong các tình huống chấn động, gây ra quá nhiều giao dịch vô hiệu.
Bộ lọc thực tế không hoàn toàn tránh được các trường hợp đột phá giả.
Các tham số RSI được thiết lập không chính xác, có thể làm mất cơ hội giao dịch hoặc gây ra nhiều giao dịch không hợp lệ.
Trong trường hợp đặc biệt, chỉ số RSI sẽ không hoạt động và tạo ra tín hiệu sai.
Chiến lược này có thể được tối ưu hóa theo các khía cạnh sau:
Tối ưu hóa chiến lược dừng lỗ để dừng lỗ hợp lý hơn và giảm tổn thất đơn lẻ.
Thêm bộ lọc MACD, KD và các chỉ số khác để tín hiệu đáng tin cậy hơn.
Kết hợp xu hướng, hỗ trợ kháng cự và các khả năng phán đoán, tránh giao dịch có khả năng thấp.
Kiểm tra các tham số cho các loại giao dịch khác nhau và chu kỳ để tìm các tham số tối ưu.
Nhận biết các trường hợp đặc biệt, tạm dừng giao dịch và tránh thiệt hại lớn.
Chiến lược đảo ngược động lực RSI thông qua Connor RSI và RSI nhanh để xác định đường dài ngắn đảo ngược, kết hợp với bộ lọc thực thể đường K để tăng hiệu quả tín hiệu. Chiến lược này có các lợi thế như danh mục chỉ số, linh hoạt điều chỉnh tham số, có thể nắm bắt cơ hội đảo ngược, can thiệp giao dịch kịp thời khi quá mua quá bán. Tuy nhiên, chiến lược này cũng có một số rủi ro về thất bại đảo ngược, phá vỡ phá vỡ giả mạo, cần tối ưu hóa thêm các chỉ số dừng lỗ để giảm rủi ro và nâng cao khả năng 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()