
Chiến lược Moving Average Relative Strength Index là một chiến lược giao dịch định lượng sử dụng cả đường trung bình di chuyển và đường trung bình tương đối mạnh làm tín hiệu giao dịch. Chiến lược này tạo ra tín hiệu giao dịch để nắm bắt cơ hội trong xu hướng thị trường bằng cách so sánh giá với đường trung bình di chuyển và giá trị của đường trung bình tương đối mạnh.
Chiến lược này dựa trên hai chỉ số:
Chiến lược của chúng tôi là:
Khi đường chỉ số RSI thấp hơn đường trung bình di chuyển là khu vực bán tháo, được coi là cổ phiếu được đánh giá thấp, tạo ra tín hiệu mua; khi đường chỉ số RSI cao hơn đường trung bình di chuyển là khu vực mua quá mức, được coi là cổ phiếu được đánh giá cao, tạo ra tín hiệu bán.
Nói cách khác, đường trung bình di chuyển phản ánh giá trị công bằng của cổ phiếu ở một mức độ nhất định, và chỉ số RSI đại diện cho tình trạng mạnh và yếu của cổ phiếu hiện tại.
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:
Chiến lược này kết hợp sự phán đoán xu hướng của trung bình di chuyển và phán đoán mua bán quá mức của chỉ số RSI, sử dụng lợi thế tổng hợp của các chỉ số khác nhau để đánh giá hiệu quả điểm biến đổi của thị trường.
Những ưu điểm chính là:
Chiến lược này cũng có một số rủi ro:
Để kiểm soát rủi ro, bạn có thể tối ưu hóa bằng cách:
Chiến lược này có thể được tối ưu hóa hơn nữa trong các lĩnh vực như:
Bằng cách tối ưu hóa tham số, tối ưu hóa chỉ số và tối ưu hóa quản lý rủi ro, bạn có thể liên tục nâng cao tính ổn định và khả năng lợi nhuận của chiến lược.
Chiến lược trung bình di chuyển và các chỉ số tương đối mạnh mẽ sử dụng phán đoán xu hướng giá cả và phán đoán quá mua quá bán để đánh giá hiệu quả các điểm biến động của thị trường và nắm bắt cơ hội đảo ngược. Chiến lược này đơn giản, thực tế, có thể kiểm soát rủi ro, là một chiến lược giao dịch định lượng thực tế. Bằng cách tối ưu hóa liên tục, có thể đạt được hiệu quả tuyệt vời 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)