
RSI 동적 역전 전략은 RSI 지표와 K선 엔티티의 방향을 결합하여 과매매 과매매 현상을 식별하여 역전 거래를 한다. 이 전략은 평상시 RSI와 빠른 RSI를 동시에 사용하고 K선 엔티티 필터와 함께 역전 기회를 효과적으로 식별 할 수 있다.
이 전략은 다음의 몇 가지 부분으로 이루어집니다.
정규 RSI, RSI 승률 지수, RSI 파리 샤르 지수를 계산하고, 이 세 가지의 평균을 콘너스 RSI로 니다.
가격변화를 이용한 급속한 RSI를 계산하고, 초단계순환을 반영한다.
실제 선이 더 필요하고, 선이 공허하여, 가짜 돌파를 방지한다.
코너스 RSI가 20보다 낮으면, 빠른 RSI가 25보다 낮으면, 실물 선이 나타납니다.
코너스 RSI가 80보다 높을 때, 빠른 RSI가 75보다 높을 때, 실물 선이 나타납니다.
엔티티가 회전할 때 정지 손실이 종료된다.
코너스 RSI를 통해 긴 선의 트렌드 반전점을 판단하고, 빠른 RSI를 통해 짧은 선의 반전점을 판단하고, K 선의 엔터티는 돌파 효과를 보장하여 반전 기회를 효과적으로 발견하고, 오버 바이 오버 세일 모두에 적시에 포지션을 열어 반전 작업을 수행한다.
이 전략은 다음과 같은 장점을 가지고 있습니다.
코너스 RSI는 긴 라인 사이클을 반영하고, 빠른 RSI는 짧은 라인 사이클을 반영하며, 둘을 결합하면 역전점을 더 정확하게 판단할 수 있다.
실제 돌파구에서만 작동하면 가짜 돌파구로 인한 손실을 줄일 수 있다.
RSI 파라미터, 거래 종류, 거래 기간은 시장에 따라 자유롭게 조정할 수 있습니다.
RSI와 K선 엔터티는 기본 지표이며, 전략 논리는 간단하고 이해하기 쉽습니다.
내장된 지표만 사용하며, 코드가 적고, 실행의 어려움이 적습니다.
이 전략의 주요 위험은 다음과 같습니다.
반전 신호가 발신된 후 가격이 원래의 추세로 계속 운행되어 손실이 발생했다.
이 신호는 수없이 많은 거래가 무효화되는 현상과 함께 반복적으로 발생한다.
실체 필터링은 가짜 침입을 완전히 피할 수 없습니다.
RSI 파라미터가 잘못 설정되어 놓친 거래 기회 또는 여러 번 유효하지 않은 거래를 초래할 수 있습니다.
특별한 상황에서 RSI 지표가 작동하지 않아 잘못된 신호가 발생한다.
이 전략은 다음과 같은 부분에서 최적화될 수 있습니다.
단편적 손실을 줄이기 위해 손실을 막는 전략을 최적화하십시오.
MACD, KD 등 지표 필터를 추가하여 신호를 더 신뢰할 수 있게 한다.
추세와 지지 저항과 같은 판단 확률을 결합하여 낮은 확률 거래를 피하십시오.
다른 거래 종류, 주기에 대해 파라미터를 테스트하여 최적의 파라미터를 찾습니다.
이 경우, 거래가 중단되고 큰 손실이 발생하지 않도록 주의해야 합니다.
RSI 동량 역전 전략은 코너스 RSI와 빠른 RSI를 통해 긴 짧은 선의 역전 판단, K선 엔티티 필터와 함께 신호 효율성을 증가시킨다. 이 전략은 지표 포트폴리, 파라미터 조정 유연성 등의 장점을 가지고 있으며, 역전 기회를 잡을 수 있으며, 과매매 할 때 거래에 적시에 개입 할 수 있다. 그러나 이 전략은 또한 역전 실패, 가짜 돌파, 가짜 돌파 등의 위험이 있으며, 위험을 줄이고 수익성을 높이기 위해 손해 중지 지표 포트폴리 등의 측면을 추가적으로 최적화해야 한다.
/*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()