이동 평균 상대 강도 지표 전략은 이동 평균 라인과 상대 강도 지표 (RSI) 를 거래 신호로 사용하여 시장 트렌드의 기회를 포착하는 양적 거래 전략이다. 이 전략은 시장에서 역전 기회를 포착하기 위해 가격 이동 평균 라인을 RSI 지표의 가치와 비교하여 거래 신호를 생성합니다.
이 전략은 주로 두 가지 지표에 기반합니다.
전략의 핵심 논리는 다음과 같습니다.
RSI 지표 라인이 이동 평균 라인보다 낮을 때, 그것은 과잉 판매 영역에 있으며 주가가 과대평가되어 있다는 것을 나타내고 구매 신호를 생성합니다. RSI 라인이 이동 평균 라인보다 높을 때, 그것은 과대 구매 영역에 있으며 주가가 과대평가되어 있음을 신호하여 판매 신호를 생성합니다.
다른 말로, 이동 평균선은 어느 정도 주식의 적정 가치를 반영하고, RSI 지표는 현재 가격의 강도 또는 약도를 나타냅니다. RSI가 이동 평균선에서 벗어날 때, 그것은 반전 기회를 암시합니다.
특히 이 전략은 다음 단계를 통해 거래 신호를 생성합니다.
이동 평균의 추세 판단과 RSI의 과잉 구매/ 과잉 판매 지표를 결합함으로써 이 전략은 다른 지표의 강점을 활용하여 시장의 전환점을 효과적으로 결정할 수 있습니다.
주요 장점은 다음과 같습니다.
이 전략에는 몇 가지 위험도 있습니다.
리스크를 관리하려면 다음과 같은 방법으로 최적화를 할 수 있습니다.
추가 최적화 방향은 다음과 같습니다.
매개 변수 최적화, 지표 최적화, 위험 관리 최적화 등을 통해 이 전략의 안정성과 수익성이 지속적으로 향상될 수 있습니다.
이동평균 RSI 전략은 가격 추세와 과잉 구매/ 과잉 판매 분석을 모두 활용하여 시장 전환점을 효과적으로 파악하고 역전 기회를 포착합니다. 이 간단하고 실용적인 전략은 통제 가능한 위험을 가지고 있으며 양적 거래에 유용합니다. 추가 최적화는 더 나은 결과를 초래할 수 있습니다.
/*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)