RSI 반전 거래 전략

저자:차오장, 날짜: 2023-09-28 16:09:39
태그:

전반적인 설명

이 전략은 RSI 지표를 사용하여 시장 동향을 판단하고 과잉 구매 또는 과잉 판매 조건이 발생하면 거래 신호를 생성합니다. 시장에서 단기적 역전 움직임을 포착하는 것을 목표로합니다. 또한 이동 평균과 수익 취득 / 중단 손실 논리를 통합하여 신호를 필터하고 위험을 제어합니다.

전략 논리

  1. 14주기 RSI를 계산하고 과잉 구매 라인을 67로 설정하고 과잉 판매 라인을 44로 설정합니다.

  2. RSI가 과소매 라인을 넘어서면 판매 신호가 생성됩니다. RSI가 과소매 라인을 넘어서면 구매 신호가 생성됩니다.

  3. 이동 평균 필터를 추가합니다. 닫는 신호는 전날의 MA보다 낮을 때만 발생합니다. 닫는 신호는 전날의 MA보다 높을 때만 발생합니다.

  4. 이윤 취득 및 스톱 로스 논리를 포함합니다. 고정 포인트 또는 RSI 기반 출구가 사용될 수 있습니다.

이점 분석

  1. 단기적 역전 기회는 RSI 과잉 구매/ 과잉 판매 수준을 사용하여 포착합니다.

  2. 이동 평균 필터는 트렌드에 반하는 거래를 피합니다.

  3. 이윤 취득 및 스톱 로스는 단일 거래 손실을 통제합니다.

  4. 트렌드 역전 기회를 조기에 파악할 수 있습니다.

위험 과 해결책

  1. RSI 지연은 잘못된 신호를 일으킬 수 있습니다. 매개 변수를 조정하거나 다른 지표와 결합합니다.

  2. 고정 스톱 손실은 너무 넓거나 너무 좁을 수 있습니다. 후속 스톱을 고려하십시오.

  3. 고정 이윤 취득은 너무 일찍 또는 너무 작은 목표를 종료 할 수 있습니다. RSI 또는 ATR 기반 출구를 고려하십시오.

  4. 시장의 범위를 필터링하는 데 실패하여 과도한 거래와 손실을 유발합니다. RSI 매개 변수를 조정하거나 필터를 추가하십시오.

최적화 방향

  1. 다른 시간 프레임에서 RSI 매개 변수를 테스트합니다.

  2. 과잉 구매/ 과잉 판매 RSI 수준을 조정합니다.

  3. 다른 이동 평균이나 다른 필터를 시도해보세요.

  4. 일정한 수익 목표/동적 수익 목표/동적 수익 목표/동적 수익 목표/동적 수익 목표

  5. 시장의 변동성에 맞게 수익/정지 값을 최적화합니다.

  6. 필터를 추가해서 다양한 시장에서 화이트사 (wipssaws) 를 피합니다.

  7. 신호 품질을 향상시키기 위해 여러 시간 프레임의 합동을 고려하십시오.

요약

이 전략은 이동평균과 수익/손실 논리를 결합한 RSI를 사용하여 반전을 거래합니다. 시장에서 단기 전환을 포착하는 것을 목표로합니다. 추가 매개 변수 최적화 및 추가 필터는 위험을 줄이는 동시에 수익성을 향상시킬 수 있습니다. 단기 움직임에 민감하고 빈번한 거래를 추구하는 투자자에게 적합합니다.


/*backtest
start: 2022-09-21 00:00:00
end: 2023-09-27 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//© профешинил хомячело
//@version = 4

strategy("RSI Strategy Professional Хомячело", overlay=false)
length = input( 14 )
overSold = input( 44 )
overBought = input( 67 )
price = open
rsi = rsi(price, length)
band1 = hline(overSold, "overSold12", color=#C0C0C0)
band0 = hline(overBought, "overBought12", color=#C0C0C0)
plot(rsi, "RSI", color=color.red)
fill(band1, band0, color=color.black, transp=90, title="Background")
src = close
a = sma(src, 1)
aaa = strategy.opentrades + 1

n = input(defval = 0.0576923077, title = "AvgPrice - n")
//n = 0.0576923077

buysignal = crossover(rsi, overSold) and (a < (strategy.position_avg_price - n) or strategy.opentrades == 0)
sellsignal = crossunder(rsi, overBought) and (a > (strategy.position_avg_price + n) or strategy.opentrades == 0)


// crossover(rsi, overSold)
// crossunder(rsi, overBought)
if (not na(rsi))
    if(buysignal)
        strategy.entry("LONG", strategy.long, comment = tostring(a) + "\n(" + tostring(aaa) + ")")
        n += 1000
    if(sellsignal)
        strategy.entry("SHORT", strategy.short, comment = tostring(a) + "\n(" + tostring(aaa) + ")")
        n += 1000

//лонги орні       
    if(rsi < 15 and strategy.opentrades != 5 and a < (strategy.position_avg_price - n))
        strategy.entry("LONG", strategy.long, comment = "ЙОБАНИЙ НАСРАВ ТА БЕРИ ЛОНГ НА ВСЬО ШО Є НАХУЙ\n" + tostring(a) + "\n(" + tostring(aaa) + "!!!)")
    if(rsi < 20 and strategy.opentrades != 5 and a < (strategy.position_avg_price - n))
        strategy.entry("LONG", strategy.long, comment = "ЛОНГ НА ВСЮ КОТЛЄТУ\n" + tostring(a) + "\n(" + tostring(aaa) + "!!!)")
//шорти орні
    if(rsi > 85 and strategy.opentrades != 5 and a < (strategy.position_avg_price - n))
        strategy.entry("SHORT", strategy.short, comment = "ЙОБАНИЙ НАСРАВ ТА БЕРИ ШОРТ НА ВСЬО ШО Є НАХУЙ\n" + tostring(a) + "\n(" + tostring(aaa) + "!!!)")
    if(rsi > 80 and strategy.opentrades != 5 and a < (strategy.position_avg_price - n))
        strategy.entry("SHORT", strategy.short, comment = "ШОРТ НА ВСЮ КОТЛЄТУ\n" + tostring(a) + "\n(" + tostring(aaa) + "!!!)")


//стоп-лосс і ціль

//rsi
rsion = input(defval = false, title = "Тейк-профіт по RSI")
rcl = input(defval = 73.0, title = "RSI тейк по лонгу")
rcs = input(defval = 44.0, title = "RSI тейк по шорту")
possize = input(defval = 250.0, title = "Маржа")
posp = input(defval = 3.0, title = "Плече")

//tick
ut = input(defval = false, title = "Тейк-профіт")
tar = input(defval = 4500.0, title = "Тейк-профіт у тіках")
us = input(defval = false, title = "Стоп-лосс")
stop = input(defval = 0.0, title = "Стоп-лосс у тіках")
tar:=tar/syminfo.mintick
stop:=stop/syminfo.mintick

if(ut==true and us==false)
    strategy.exit(id="LX", from_entry = "LONG", profit = tar, comment = "ТейкL")
    strategy.exit(id="SX", from_entry = "SHORT", profit = tar, comment = "ТейкS")
if(us==true and ut==false)
    strategy.exit(id="LX", from_entry = "LONG", loss = stop, comment = "СтопL")
    strategy.exit(id="SX", from_entry = "SHORT", loss = stop, comment = "СтопS")
    
if(ut==true and us==true)
    strategy.exit(id="LX", from_entry = "LONG", profit = tar, loss = stop, comment ="Тейк/СтопL")
    strategy.exit(id="SX", from_entry = "SHORT", profit = tar, loss = stop, comment ="Тейк/СтопS")
    
//закриття по rsi
if(rsion == 1 )
    pr = round(((a / strategy.position_avg_price - 1) * possize * posp), 2)
    ppr = round(((a / strategy.position_avg_price - 1) * 100 * posp), 2)
    spr = round((1 - (a / strategy.position_avg_price)) * possize * posp, 2)
    sppr = round((100 - (a / strategy.position_avg_price * 100)) * posp, 2)
    
    if(rsi > rcl)
        strategy.close(id="LONG", comment = "LT\n" + tostring(ppr) + "%\n" + tostring(pr) + "$\n" + tostring(a))
    if(rsi < rcs)
        strategy.close(id="SHORT", comment = "ST\n" + tostring(sppr) + "%\n" + tostring(spr) + "$\n" + tostring(a))

더 많은