Chiến lược chỉ số phân kỳ RSI là một chiến lược giao dịch định lượng dựa trên chỉ số chỉ số sức mạnh tương đối (RSI). Nó phát hiện cơ hội đảo ngược xu hướng bằng cách phân tích sự phân kỳ giữa chỉ số RSI và giá, nhằm mục đích mua thấp và bán cao.
Chỉ số cốt lõi của chiến lược này là chỉ số RSI. Nó phân tích sự khác biệt giữa chỉ số RSI và giá.
Cụ thể, khi chỉ số RSI hình thành mức thấp tương đối thấp trong khi giá hình thành mức thấp tương đối cao, đó là sự khác biệt tăng giữa chỉ số RSI và giá. Điều này ngụ ý rằng giá có thể đảo ngược lên. Chiến lược sẽ thiết lập một vị trí dài tại thời điểm này.
Ngược lại, khi chỉ số RSI hình thành một mức cao tương đối cao trong khi giá hình thành một mức cao tương đối thấp, đó là sự khác biệt giảm giữa chỉ số RSI và giá. Điều này ngụ ý rằng giá có thể đảo ngược xuống. Chiến lược sẽ thiết lập một vị trí ngắn tại thời điểm này.
Bằng cách nắm bắt những khác biệt giữa chỉ số RSI và giá, chiến lược có thể phát hiện kịp thời cơ hội đảo ngược giá và đạt được mua thấp và bán cao.
Chiến lược RSI Divergence có những lợi thế sau:
Chính xác trong việc nắm bắt các điểm đảo ngược giá. Sự khác biệt giữa chỉ số RSI và giá thường ngụ ý một sự đảo ngược xu hướng sắp tới, đó là một tín hiệu dự đoán rất hiệu quả.
Nhận được mua thấp và bán cao. Bằng cách thiết lập các vị trí ở các điểm phân kỳ, nó có thể mua với giá tương đối thấp và bán với giá tương đối cao, phù hợp với các thực tiễn tốt nhất của giao dịch định lượng.
Đánh bại những hạn chế của các chiến lược RSI thông thường. Các chiến lược RSI thông thường chỉ tập trung vào các khu vực mua quá nhiều và bán quá nhiều. Chiến lược này sử dụng các tính chất đảo ngược nội tại của chính RSI để nắm bắt các bước ngoặt chính xác hơn, cải thiện đáng kể hiệu quả của chiến lược.
Các thông số chính chỉ là thời gian RSI và thời gian xem lại, rất đơn giản và dễ dàng để tối ưu hóa.
Chiến lược RSI Divergence cũng có một số rủi ro:
Các tín hiệu chênh lệch có thể là tín hiệu sai. Sự chênh lệch giữa chỉ số RSI và giá không nhất thiết dẫn đến sự đảo ngược giá thực sự. Đôi khi chúng cũng tạo thành sự đảo ngược sai, dẫn đến thua lỗ giao dịch.
Hiệu suất kém trong thị trường xu hướng. Khi giá cho thấy xu hướng hướng rõ ràng, không gian lợi nhuận của chiến lược này sẽ tương đối nhỏ. Tốt hơn là tạm thời vô hiệu hóa chiến lược trong trường hợp này và chờ đợi các thị trường mới.
Rủi ro của kim tự tháp. Chiến lược đã thiết lập các tham số kim tự tháp. Trong trường hợp các giao dịch thua liên tục, nó có thể đẩy nhanh việc rút tiền tài khoản. Định kích thước vị trí và dừng lỗ nên được kiểm soát để giảm thiểu rủi ro.
Chiến lược cũng có thể được tối ưu hóa trong các khía cạnh sau:
Kết hợp các chỉ số khác để lọc tín hiệu. MACD, KDJ và các chỉ số khác có thể được thêm vào để xác minh các điểm chênh lệch RSI, lọc ra một số tín hiệu sai và cải thiện tỷ lệ thắng của chiến lược.
Tối ưu hóa các thông số RSI. Các khoảng thời gian RSI khác nhau có thể được thử nghiệm để tìm ra thời gian phù hợp nhất với các đặc điểm của sản phẩm. Nói chung giữa 6-15 hoạt động tốt.
Tối ưu hóa thời gian xem lại. Thời gian xem lại trực tiếp ảnh hưởng đến tần suất giao dịch của chiến lược. Các giá trị khác nhau có thể được thử nghiệm để tìm thấy tần suất tối ưu, thường là giữa 5-15 là một phạm vi tốt.
Thêm logic dừng lỗ. Các phương pháp dừng lỗ hợp lý như ATR trailing stop loss có thể được thực hiện để nhanh chóng cắt giảm lỗ khi xảy ra. Điều này có thể kiểm soát hiệu quả rủi ro của chiến lược.
Chiến lược RSI Divergence nắm bắt chính xác các bước ngoặt giá bằng cách phân tích các tính chất đảo ngược nội tại của chỉ số RSI. Nó đạt được một phương pháp giao dịch mua thấp-bán cao. So với các chiến lược RSI mua quá nhiều-bán quá nhiều truyền thống, nó sử dụng các đặc điểm tinh tế và nội tại của RSI, cải thiện hiệu quả đáng kể. Với tối ưu hóa tham số và kiểm soát rủi ro, nó rất phù hợp để nắm bắt các cơ hội giao dịch ngắn hạn trong các thị trường khác nhau.
/*backtest start: 2023-12-01 00:00:00 end: 2023-12-31 23:59:59 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 //study(title="Divergence Indicator", format=format.price) //GOOGL setting 5 , close, 3 , 1 profitLevel at 75 shows win rate 87.21 % profit factor 7.059 //GOOGL setting 8 , close, 3 , 1 profitLevel at 80 shows win rate 86.57 % profit factor 18.96 //SPY setting 5, close , 3, 3 profitLevel at 70 , shows win rate 80.34% profit factor 2.348 strategy(title="RSI Divergence Indicator", overlay=false,pyramiding=2, default_qty_value=2, default_qty_type=strategy.fixed, initial_capital=10000, currency=currency.USD) len = input(title="RSI Period", minval=1, defval=9) src = input(title="RSI Source", defval=close) lbR = input(title="Pivot Lookback Right", defval=3) lbL = input(title="Pivot Lookback Left", defval=1) takeProfitRSILevel = input(title="Take Profit at RSI Level", minval=70, defval=80) rangeUpper = input(title="Max of Lookback Range", defval=60) rangeLower = input(title="Min of Lookback Range", defval=5) plotBull = input(title="Plot Bullish", defval=true) plotHiddenBull = input(title="Plot Hidden Bullish", defval=true) plotBear = input(title="Plot Bearish", defval=true) plotHiddenBear = input(title="Plot Hidden Bearish", defval=false) //useTrailStopLoss = input(false, title="Use Trailing Stop Loss") sl_type = input("NONE", title="Trailing StopLoss Type", options=['ATR','PERC', 'NONE']) stopLoss = input(title="Stop Loss%", defval=5, minval=1) atrLength=input(14, title="ATR Length (for Trailing stop loss)") atrMultiplier=input(3.5, title="ATR Multiplier (for Trailing stop loss)") bearColor = color.purple bullColor = color.green hiddenBullColor = color.new(color.green, 80) hiddenBearColor = color.new(color.red, 80) textColor = color.white noneColor = color.new(color.white, 100) osc = rsi(src, len) plot(osc, title="RSI", linewidth=2, color=#8D1699) hline(50, title="Middle Line", linestyle=hline.style_dotted) obLevel = hline(70, title="Overbought", linestyle=hline.style_dotted) osLevel = hline(30, title="Oversold", linestyle=hline.style_dotted) fill(obLevel, osLevel, title="Background", color=#9915FF, transp=90) plFound = na(pivotlow(osc, lbL, lbR)) ? false : true phFound = na(pivothigh(osc, lbL, lbR)) ? false : true _inRange(cond) => bars = barssince(cond == true) rangeLower <= bars and bars <= rangeUpper //------------------------------------------------------------------------------ // Regular Bullish // Osc: Higher Low oscHL = osc[lbR] > valuewhen(plFound, osc[lbR], 1) and _inRange(plFound[1]) // Price: Lower Low priceLL = low[lbR] < valuewhen(plFound, low[lbR], 1) bullCond = plotBull and priceLL and oscHL and plFound plot( plFound ? osc[lbR] : na, offset=-lbR, title="Regular Bullish", linewidth=2, color=(bullCond ? bullColor : noneColor), transp=0 ) plotshape( bullCond ? osc[lbR] : na, offset=-lbR, title="Regular Bullish Label", text=" Bull ", style=shape.labelup, location=location.absolute, color=bullColor, textcolor=textColor, transp=0 ) //------------------------------------------------------------------------------ // Hidden Bullish // Osc: Lower Low oscLL = osc[lbR] < valuewhen(plFound, osc[lbR], 1) and _inRange(plFound[1]) // Price: Higher Low priceHL = low[lbR] > valuewhen(plFound, low[lbR], 1) hiddenBullCond = plotHiddenBull and priceHL and oscLL and plFound plot( plFound ? osc[lbR] : na, offset=-lbR, title="Hidden Bullish", linewidth=2, color=(hiddenBullCond ? hiddenBullColor : noneColor), transp=0 ) plotshape( hiddenBullCond ? osc[lbR] : na, offset=-lbR, title="Hidden Bullish Label", text=" H Bull ", style=shape.labelup, location=location.absolute, color=bullColor, textcolor=textColor, transp=0 ) longCondition=bullCond or hiddenBullCond //? osc[lbR] : na //hiddenBullCond strategy.entry(id="RSIDivLE", long=true, when=longCondition) //Trailing StopLoss ////// Calculate trailing SL ///////////////////////////////////////////////////// sl_val = sl_type == "ATR" ? stopLoss * atr(atrLength) : sl_type == "PERC" ? close * stopLoss / 100 : 0.00 trailing_sl = 0.0 trailing_sl := strategy.position_size>=1 ? max(low - sl_val, nz(trailing_sl[1])) : na //draw initil stop loss //plot(strategy.position_size>=1 ? trailing_sl : na, color = color.blue , style=plot.style_linebr, linewidth = 2, title = "stop loss") //plot(trailing_sl, title="ATR Trailing Stop Loss", style=plot.style_linebr, linewidth=1, color=color.purple, transp=30) //Trailing StopLoss ////// Calculate trailing SL ///////////////////////////////////////////////////// //------------------------------------------------------------------------------ // Regular Bearish // Osc: Lower High oscLH = osc[lbR] < valuewhen(phFound, osc[lbR], 1) and _inRange(phFound[1]) // Price: Higher High priceHH = high[lbR] > valuewhen(phFound, high[lbR], 1) bearCond = plotBear and priceHH and oscLH and phFound plot( phFound ? osc[lbR] : na, offset=-lbR, title="Regular Bearish", linewidth=2, color=(bearCond ? bearColor : noneColor), transp=0 ) plotshape( bearCond ? osc[lbR] : na, offset=-lbR, title="Regular Bearish Label", text=" Bear ", style=shape.labeldown, location=location.absolute, color=bearColor, textcolor=textColor, transp=0 ) //------------------------------------------------------------------------------ // Hidden Bearish // Osc: Higher High oscHH = osc[lbR] > valuewhen(phFound, osc[lbR], 1) and _inRange(phFound[1]) // Price: Lower High priceLH = high[lbR] < valuewhen(phFound, high[lbR], 1) hiddenBearCond = plotHiddenBear and priceLH and oscHH and phFound plot( phFound ? osc[lbR] : na, offset=-lbR, title="Hidden Bearish", linewidth=2, color=(hiddenBearCond ? hiddenBearColor : noneColor), transp=0 ) plotshape( hiddenBearCond ? osc[lbR] : na, offset=-lbR, title="Hidden Bearish Label", text=" H Bear ", style=shape.labeldown, location=location.absolute, color=bearColor, textcolor=textColor, transp=0 ) longCloseCondition=crossover(osc,takeProfitRSILevel) or bearCond strategy.close(id="RSIDivLE", comment="Close All="+tostring(close - strategy.position_avg_price, "####.##"), when= abs(strategy.position_size)>=1 and sl_type == "NONE" and longCloseCondition) //close all on stop loss strategy.close(id="RSIDivLE", comment="TSL="+tostring(close - strategy.position_avg_price, "####.##"), when=abs(strategy.position_size)>=1 and (sl_type == "PERC" or sl_type == "ATR" ) and crossunder(close, trailing_sl) ) //close<ema55 and rsi5Val<20 //ema34<ema55 //close<ema89 // Calculate start/end date and time condition startDate = input(timestamp("2019-01-01T00:00:00"), type = input.time) finishDate = input(timestamp("2021-01-01T00:00:00"), type = input.time) time_cond = time >= startDate and time <= finishDate