RSI 모멘텀 역전 전략

저자:차오장, 날짜: 2023-11-07 15:45:15
태그:

img

전반적인 설명

RSI 모멘텀 역전 전략은 역전 거래를 위해 RSI 지표와 촛불 몸 방향 등을 결합하여 과반 구매 및 과반 판매 조건을 식별합니다. 이 전략은 역전 기회를 효과적으로 식별하기 위해 촛불 몸 필터와 함께 기존 RSI와 빠른 RSI를 모두 사용합니다.

전략 논리

이 전략은 주로 다음과 같은 부분으로 실행됩니다.

  1. 코너스 RSI 지표

    일반적인 RSI, RSI Win Ratio, 그리고 RSI 파리 인을 계산하여 Connors RSI를 평균으로 얻습니다.

  2. 빠른 RSI 지표

    급속한 RSI를 계산하기 위해 가격 변화를 사용합니다. 극단기 주기를 반영합니다.

  3. 촛불체 필터

    거짓 파장을 막기 위해 길게는 상승률과 짧게는 하락률을 요구합니다.

  4. 긴 조건과 짧은 조건

    코너의 RSI가 20 이하로 떨어지면 롱하고, 25 이하의 빠른 RSI는 상승세로 떨어집니다.

    코너스 RSI가 80 이상이면 단축하고, 하향적인 몸매로 75 이상이면 빠른 RSI가 됩니다.

  5. 스톱 로스 출구

    촛불이 돌면 Stop Loss로 종료됩니다.

코너스 RSI는 장기 트렌드 역전 지점을 식별하고, 빠른 RSI는 단기 역전 지점을 식별하고, 촛불 보디는 브레이크아웃의 유효성을 보장합니다. 이것은 역전 기회를 효과적으로 탐지하고 과잉 구매 및 과잉 판매 조건에서 역 트렌드 거래를 할 수 있습니다.

이점 분석

이 전략의 장점은 다음과 같습니다.

  1. 장기 및 단기 지표의 조합

    코너의 RSI는 장기 주기를 반영하고 빠른 RSI는 단기 주기를 반영합니다. 둘을 결합하면 전환점을 정확하게 식별 할 수 있습니다.

  2. 촛불체 필터

    신체 브레이크로만 거래하면 가짜 브레이크로 인한 손실을 줄일 수 있습니다.

  3. 조절 가능한 매개 변수

    RSI 매개 변수, 거래 제품 및 거래 시간 프레임은 다른 시장에 맞게 자유롭게 조정할 수 있습니다.

  4. 간단하고 직관적입니다.

    RSI와 촛불은 기본적인 지표이고 이해하기 쉬운 논리입니다.

  5. 적용하기 쉽다

    내장된 지표만 사용해서 코드를 많이 쓰지 않고 쉽게 구현할 수 있습니다.

위험 분석

이 전략의 주요 위험은:

  1. 실패한 환전 위험

    이변 신호 이후에도 가격이 원래 추세를 유지하면서 손실이 발생합니다.

  2. 다양한 시장 위험

    다양한 시장에서 빈번하게 무효 신호가 발사됩니다.

  3. 허위 탈출 위험

    촛불 필터는 가짜 파장을 완전히 피할 수 없습니다.

  4. 매개 변수 위험

    부적절한 RSI 매개 변수는 거래를 놓칠 수 있거나 여러 가지 비효율적인 거래를 유발할 수 있습니다.

  5. 특수 시장 조건 위험

    특정 시장 조건에서 RSI 지표가 실패하고 잘못된 신호를 생성 할 수 있습니다.

최적화 방향

전략은 다음 측면에서 최적화 될 수 있습니다:

  1. 스톱 로스 메커니즘을 추가

    더 합리적인 스톱을 위해 스톱 손실 전략을 최적화하여 단일 거래 손실을 줄이십시오.

  2. 여러 지표를 통합

    MACD와 KD 같은 필터를 추가하여 신호를 더 신뢰할 수 있습니다.

  3. 확률 필터를 추가합니다

    트렌드, 지원/저항 분석을 결합하여 낮은 확률 거래를 피합니다.

  4. 매개 변수 설정을 최적화

    최적의 값을 찾기 위해 다양한 제품과 시간 프레임에서 매개 변수를 테스트합니다.

  5. 특별 시장 조건 을 피하라

    큰 손실을 방지하기 위해 특별한 시장 조건에서 거래를 확인하고 피하십시오.

결론

RSI 모멘텀 역전 전략은 코너의 RSI와 빠른 RSI를 사용하여 촛불 몸 필터를 사용하여 신호 유효성을 높이기 위해 장기 및 단기 역전을 식별합니다. 지표 조합 및 조정 가능한 매개 변수와 같은 장점은 과도한 구매 또는 과반 판매 시 역전 및 거래 역동 트렌드를 파악 할 수 있습니다. 그러나 실패한 역전 및 잘못된 브레이크업과 같은 위험이 남아 있으며, 위험을 줄이고 수익성을 향상시키기 위해 중지 손실, 지표 조합에 대한 추가 최적화가 필요합니다.


/*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()

더 많은