Chiến lược chỉ số sức mạnh tương đối trung bình chuyển động là một chiến lược giao dịch định lượng sử dụng cả đường trung bình chuyển động và chỉ số sức mạnh tương đối (RSI) làm tín hiệu giao dịch để nắm bắt các cơ hội trong xu hướng thị trường.
Chiến lược này chủ yếu dựa trên hai chỉ số:
Logic cốt lõi của chiến lược là:
Khi đường chỉ số RSI thấp hơn đường trung bình động, nó nằm trong vùng bán quá mức và cho thấy cổ phiếu bị đánh giá thấp, tạo ra tín hiệu mua. Khi đường chỉ số RSI cao hơn đường trung bình động, nó nằm trong vùng mua quá mức và báo hiệu cổ phiếu được đánh giá quá cao, do đó tạo ra tín hiệu bán.
Nói cách khác, đường trung bình động phản ánh giá trị hợp lý của cổ phiếu ở một mức độ nào đó, trong khi chỉ số RSI đại diện cho sức mạnh hoặc điểm yếu hiện tại của giá.
Cụ thể, chiến lược này tạo ra tín hiệu giao dịch thông qua các bước sau:
Bằng cách kết hợp đánh giá xu hướng của các đường trung bình động và chỉ số mua quá mức / bán quá mức của RSI, chiến lược này có thể xác định hiệu quả các điểm uốn cong trên thị trường bằng cách tận dụng điểm mạnh của các chỉ số khác nhau.
Những lợi thế chính là:
Ngoài ra còn có một số rủi ro với chiến lược này:
Để quản lý rủi ro, tối ưu hóa có thể được thực hiện theo các cách sau:
Các hướng tối ưu hóa khác bao gồm:
Thông qua tối ưu hóa tham số, tối ưu hóa chỉ số, tối ưu hóa quản lý rủi ro vv, sự ổn định và lợi nhuận của chiến lược này có thể được cải thiện liên tục.
Chiến lược RSI Moving Average sử dụng cả xu hướng giá và phân tích mua quá mức / bán quá mức để xác định hiệu quả các bước ngoặt của thị trường và nắm bắt các cơ hội đảo ngược. Chiến lược đơn giản, thực tế này có rủi ro có thể kiểm soát và hữu ích cho giao dịch định lượng. Tăng cường thêm có thể dẫn đến kết quả tốt hơn.
/*backtest start: 2023-11-20 00:00:00 end: 2023-11-24 06:00:00 period: 10m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=2 strategy(title = "RSI versus SMA", shorttitle = "RSI vs SMA", overlay = false, pyramiding = 0, default_qty_type = strategy.percent_of_equity, default_qty_value = 10, currency = currency.GBP) // Revision: 1 // Author: @JayRogers // // *** USE AT YOUR OWN RISK *** // - Nothing is perfect, and all decisions by you are on your own head. And stuff. // // Description: // - It's RSI versus a Simple Moving Average.. Not sure it really needs much more description. // - Should not repaint - Automatically offsets by 1 bar if anything other than "open" selected as RSI source. // === INPUTS === // rsi rsiSource = input(defval = open, title = "RSI Source") rsiLength = input(defval = 8, title = "RSI Length", minval = 1) // sma maLength = input(defval = 34, title = "MA Period", minval = 1) // invert trade direction tradeInvert = input(defval = false, title = "Invert Trade Direction?") // risk management useStop = input(defval = false, title = "Use Initial Stop Loss?") slPoints = input(defval = 25, title = "Initial Stop Loss Points", minval = 1) useTS = input(defval = true, title = "Use Trailing Stop?") tslPoints = input(defval = 120, title = "Trail Points", minval = 1) useTSO = input(defval = false, title = "Use Offset For Trailing Stop?") tslOffset = input(defval = 20, title = "Trail Offset Points", minval = 1) // === /INPUTS === // === BASE FUNCTIONS === // delay for direction change actions switchDelay(exp, len) => average = len >= 2 ? sum(exp, len) / len : exp[1] up = exp > average down = exp < average state = up ? true : down ? false : up[1] // === /BASE FUNCTIONS === // === SERIES and VAR === // rsi shunt = rsiSource == open ? 0 : 1 rsiUp = rma(max(change(rsiSource[shunt]), 0), rsiLength) rsiDown = rma(-min(change(rsiSource[shunt]), 0), rsiLength) rsi = (rsiDown == 0 ? 100 : rsiUp == 0 ? 0 : 100 - (100 / (1 + rsiUp / rsiDown))) - 50 // shifted 50 points to make 0 median // sma of rsi rsiMa = sma(rsi, maLength) // self explanatory.. tradeDirection = tradeInvert ? 0 <= rsiMa ? true : false : 0 >= rsiMa ? true : false // === /SERIES === // === PLOTTING === barcolor(color = tradeDirection ? green : red, title = "Bar Colours") // hlines medianLine = hline(0, title = 'Median', color = #996600, linewidth = 1) limitUp = hline(25, title = 'Limit Up', color = silver, linewidth = 1) limitDown = hline(-25, title = 'Limit Down', color = silver, linewidth = 1) // rsi and ma rsiLine = plot(rsi, title = 'RSI', color = purple, linewidth = 2, style = line, transp = 50) areaLine = plot(rsiMa, title = 'Area MA', color = silver, linewidth = 1, style = area, transp = 70) // === /PLOTTING === goLong() => not tradeDirection[1] and tradeDirection killLong() => tradeDirection[1] and not tradeDirection strategy.entry(id = "Buy", long = true, when = goLong()) strategy.close(id = "Buy", when = killLong()) goShort() => tradeDirection[1] and not tradeDirection killShort() => not tradeDirection[1] and tradeDirection strategy.entry(id = "Sell", long = false, when = goShort()) strategy.close(id = "Sell", when = killShort()) if (useStop) strategy.exit("XSL", from_entry = "Buy", loss = slPoints) strategy.exit("XSS", from_entry = "Sell", loss = slPoints) // if we're using the trailing stop if (useTS and useTSO) // with offset strategy.exit("XSL", from_entry = "Buy", trail_points = tslPoints, trail_offset = tslOffset) strategy.exit("XSS", from_entry = "Sell", trail_points = tslPoints, trail_offset = tslOffset) if (useTS and not useTSO) // without offset strategy.exit("XSL", from_entry = "Buy", trail_points = tslPoints) strategy.exit("XSS", from_entry = "Sell", trail_points = tslPoints)