RSI 롱-숏 다이버전스 지표


생성 날짜: 2024-01-25 11:49:36 마지막으로 수정됨: 2024-01-25 11:49:36
복사: 0 클릭수: 861
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

RSI 롱-숏 다이버전스 지표

개요

RSI 다공간 격차 지표는 상대적으로 강한 지표 (RSI) 를 기반으로 한 양적 거래 전략이다. RSI 지표와 가격 사이의 격차를 분석하여 가격 추세 반전의 기회를 발견하고, 낮은 가격으로 고가 판매하는 것을 목표로 한다.

전략 원칙

이 전략의 핵심 지표는 RSI이다. 그것은 RSI 지표와 가격 사이의 오차를 분석한다. RSI 지표와 가격 사이에 반전 신호가 나타나는 것을 오차라고 한다.

구체적으로, RSI가 낮은 낮은 지점을 형성하고 가격이 높은 낮은 지점을 형성할 때, RSI와 가격 사이의 다단계입니다. 이것은 가격이 상승을 반전할 수 있음을 암시합니다. 전략은 이 시점에서 다단계 포지션을 구축합니다.

반대로, RSI가 높은 고점을 형성하고 가격이 낮은 고점을 형성할 때, RSI와 가격 사이의 공백이다. 이것은 가격이 하락을 반전할 수 있음을 암시한다. 전략은 이 시점에서 공백 포지션을 구축한다.

RSI와 가격 사이의 이러한 불일치점을 포착함으로써, 전략은 가격 반전의 기회를 발견하여 낮은 가격과 높은 가격으로 판매 할 수 있습니다.

전략적 이점

RSI 다공간 분산 전략은 다음과 같은 장점이 있습니다.

  1. 가격 반전 지점을 정확하게 잡는다. RSI와 가격의 불일치가 종종 다가오는 추세 반전을 예고하는 매우 효과적인 예측 신호이다.

  2. 낮은 가격으로 구매하고 높은 가격으로 판매한다. 분기점을 통해 포지션을 구축하여 상대적으로 낮은 가격으로 구매하고 상대적으로 높은 가격으로 판매할 수 있다.

  3. 일반적인 RSI 전략의 한계를 뛰어넘습니다. 일반적인 RSI 전략은 오버 바이 오버 셀 영역에만 초점을 맞추고 있습니다. 이 전략은 RSI 지표 자체의 역전 속성을 사용하여 전환점을 더 정확하게 포착합니다. 전략의 효율성을 크게 향상시킵니다.

  4. 간단한 변수 설정. 주요 변수는 RSI 주기 및 회고 간격 두 개만 있으며, 매우 간단하고 쉽게 최적화 할 수 있습니다.

전략적 위험

RSI의 다공간 분산 전략에는 위험도 있습니다.

  1. 이차 신호는 가짜 신호일 수 있다. RSI와 가격 사이의 이차는 반드시 실제 가격 반전을 초래하지 않는다. 때로는 가짜 반전이 형성되기도 한다. 이것은 거래 손실을 초래한다. 위험을 통제하기 위해 적절하게 스톱을 설정할 수 있다.

  2. 트렌드 시장에서 성능이 좋지 않다. 주가가 방향이 명확한 트렌드 행태가 발생했을 때 이 전략의 수익 공간은 상대적으로 작다. 이 경우, 일시적으로 이 전략을 중단하고 새로운 충격 행태를 기다리는 것이 좋습니다.

  3. 복귀 위험. 이 전략은 복귀 파라미터를 설정하여 여러 손실 거래가 발생하면 계좌 손실을 가속화 할 수 있습니다. 이는 포지션 규모와 스톱포트를 제어하여 위험을 줄이는 데 필요합니다.

전략 최적화

이 전략은 다음과 같은 부분에서 최적화될 수 있습니다.

  1. 다른 지표와 함께 필터링 신호. MACD, KDJ 등의 다른 지표가 추가되어 RSI의 불일치를 검증하고, 몇 가지 가짜 신호를 필터링하여 전략 승률을 높일 수 있습니다.

  2. RSI 파라미터를 최적화한다. 다양한 RSI 주기 파라미터를 테스트하여 품종 특성에 가장 적합한 RSI 주기 설정을 찾을 수 있다. 일반적으로 6-15 사이가 가장 효과적이다.

  3. 회귀 영역을 최적화하십시오. 회귀 영역은 전략의 거래 빈도에 직접 영향을 미칩니다. 다양한 매개 변수를 테스트하여 최적의 빈도를 찾을 수 있습니다. 일반적으로 5-15 사이의 효과가 좋습니다.

  4. 손실을 증가시키는 전략. ATR, 이동 손실 등에 따라 합리적인 손실 논리를 설정할 수 있다. 손실이 발생했을 때 신속하게 중단하여 전략 위험을 효과적으로 제어할 수 있다.

요약하다

RSI 다공차 전략은 RSI 지표 자체의 반전 속성을 분석하여 가격 변화의 전환점을 정확하게 포착한다. 낮은 가격과 높은 가격의 거래 전략을 구현한다. 전통적인 의미의 RSI 과잉 구매와 과잉 판매 전략에 비해 더 정교하고 원시적인 RSI 특성을 사용하여 전략의 효율성을 크게 향상시킵니다. 변수 최적화 및 위험 제어와 함께, 그것은 충격적인 상황에서 짧은 라인 거래 기회를 포착하는 데 적합합니다.

전략 소스 코드
/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
//study(title="Divergence Indicator", format=format.price)
//GOOGL setting  5 , close, 3 , 1  profitLevel at 75 shows win rate  87.21 %  profit factor 7.059
//GOOGL setting  8 , close, 3 , 1  profitLevel at 80 shows win rate  86.57 %  profit factor 18.96 
//SPY setting    5, close , 3, 3  profitLevel at 70  , shows win rate 80.34%  profit factor 2.348
strategy(title="RSI Divergence Indicator", overlay=false,pyramiding=2, default_qty_value=2,   default_qty_type=strategy.fixed, initial_capital=10000, currency=currency.USD)

len = input(title="RSI Period", minval=1, defval=9)
src = input(title="RSI Source", defval=close)
lbR = input(title="Pivot Lookback Right", defval=3)
lbL = input(title="Pivot Lookback Left", defval=1)
takeProfitRSILevel = input(title="Take Profit at RSI Level", minval=70, defval=80)

rangeUpper = input(title="Max of Lookback Range", defval=60)
rangeLower = input(title="Min of Lookback Range", defval=5)
plotBull = input(title="Plot Bullish", defval=true)
plotHiddenBull = input(title="Plot Hidden Bullish", defval=true)
plotBear = input(title="Plot Bearish", defval=true)
plotHiddenBear = input(title="Plot Hidden Bearish", defval=false)

//useTrailStopLoss = input(false, title="Use Trailing Stop Loss")

sl_type = input("NONE", title="Trailing StopLoss Type", options=['ATR','PERC', 'NONE'])

stopLoss = input(title="Stop Loss%", defval=5, minval=1)

atrLength=input(14, title="ATR Length (for Trailing stop loss)")
atrMultiplier=input(3.5, title="ATR Multiplier (for Trailing stop loss)")


bearColor = color.purple
bullColor = color.green
hiddenBullColor = color.new(color.green, 80)
hiddenBearColor = color.new(color.red, 80)
textColor = color.white
noneColor = color.new(color.white, 100)

osc = rsi(src, len)

plot(osc, title="RSI", linewidth=2, color=#8D1699)
hline(50, title="Middle Line", linestyle=hline.style_dotted)
obLevel = hline(70, title="Overbought", linestyle=hline.style_dotted)
osLevel = hline(30, title="Oversold", linestyle=hline.style_dotted)
fill(obLevel, osLevel, title="Background", color=#9915FF, transp=90)

plFound = na(pivotlow(osc, lbL, lbR)) ? false : true
phFound = na(pivothigh(osc, lbL, lbR)) ? false : true

_inRange(cond) =>
    bars = barssince(cond == true)
    rangeLower <= bars and bars <= rangeUpper

//------------------------------------------------------------------------------
// Regular Bullish

// Osc: Higher Low
oscHL = osc[lbR] > valuewhen(plFound, osc[lbR], 1) and _inRange(plFound[1])

// Price: Lower Low
priceLL = low[lbR] < valuewhen(plFound, low[lbR], 1)

bullCond = plotBull and priceLL and oscHL and plFound

plot(
	 plFound ? osc[lbR] : na,
	 offset=-lbR,
	 title="Regular Bullish",
	 linewidth=2,
	 color=(bullCond ? bullColor : noneColor),
	 transp=0
	 )


plotshape(
	 bullCond ? osc[lbR] : na,
	 offset=-lbR,
	 title="Regular Bullish Label",
	 text=" Bull ",
	 style=shape.labelup,
	 location=location.absolute,
	 color=bullColor,
	 textcolor=textColor,
	 transp=0
	 )

//------------------------------------------------------------------------------
// Hidden Bullish

// Osc: Lower Low
oscLL = osc[lbR] < valuewhen(plFound, osc[lbR], 1) and _inRange(plFound[1])

// Price: Higher Low
priceHL = low[lbR] > valuewhen(plFound, low[lbR], 1)

hiddenBullCond = plotHiddenBull and priceHL and oscLL and plFound

plot(
	 plFound ? osc[lbR] : na,
	 offset=-lbR,
	 title="Hidden Bullish",
	 linewidth=2,
	 color=(hiddenBullCond ? hiddenBullColor : noneColor),
	 transp=0
	 )

plotshape(
	 hiddenBullCond ? osc[lbR] : na,
	 offset=-lbR,
	 title="Hidden Bullish Label",
	 text=" H Bull ",
	 style=shape.labelup,
	 location=location.absolute,
	 color=bullColor,
	 textcolor=textColor,
	 transp=0
	 )

longCondition=bullCond or hiddenBullCond
//? osc[lbR] : na  
//hiddenBullCond
strategy.entry(id="RSIDivLE", long=true,  when=longCondition)


//Trailing StopLoss
////// Calculate trailing SL
/////////////////////////////////////////////////////
sl_val = sl_type == "ATR"      ? stopLoss * atr(atrLength) : 
         sl_type == "PERC" ? close * stopLoss / 100 : 0.00

trailing_sl = 0.0
trailing_sl :=   strategy.position_size>=1 ?  max(low  - sl_val, nz(trailing_sl[1])) :  na

//draw initil stop loss
//plot(strategy.position_size>=1 ? trailing_sl : na, color = color.blue , style=plot.style_linebr,  linewidth = 2, title = "stop loss")
//plot(trailing_sl, title="ATR Trailing Stop Loss", style=plot.style_linebr, linewidth=1, color=color.purple, transp=30)
//Trailing StopLoss
////// Calculate trailing SL
/////////////////////////////////////////////////////


//------------------------------------------------------------------------------
// Regular Bearish

// Osc: Lower High
oscLH = osc[lbR] < valuewhen(phFound, osc[lbR], 1) and _inRange(phFound[1])

// Price: Higher High
priceHH = high[lbR] > valuewhen(phFound, high[lbR], 1)

bearCond = plotBear and priceHH and oscLH and phFound

plot(
	 phFound ? osc[lbR] : na,
	 offset=-lbR,
	 title="Regular Bearish",
	 linewidth=2,
	 color=(bearCond ? bearColor : noneColor),
	 transp=0
	 )

plotshape(
	 bearCond ? osc[lbR] : na,
	 offset=-lbR,
	 title="Regular Bearish Label",
	 text=" Bear ",
	 style=shape.labeldown,
	 location=location.absolute,
	 color=bearColor,
	 textcolor=textColor,
	 transp=0
	 )

//------------------------------------------------------------------------------
// Hidden Bearish

// Osc: Higher High
oscHH = osc[lbR] > valuewhen(phFound, osc[lbR], 1) and _inRange(phFound[1])

// Price: Lower High
priceLH = high[lbR] < valuewhen(phFound, high[lbR], 1)

hiddenBearCond = plotHiddenBear and priceLH and oscHH and phFound

plot(
	 phFound ? osc[lbR] : na,
	 offset=-lbR,
	 title="Hidden Bearish",
	 linewidth=2,
	 color=(hiddenBearCond ? hiddenBearColor : noneColor),
	 transp=0
	 )

plotshape(
	 hiddenBearCond ? osc[lbR] : na,
	 offset=-lbR,
	 title="Hidden Bearish Label",
	 text=" H Bear ",
	 style=shape.labeldown,
	 location=location.absolute,
	 color=bearColor,
	 textcolor=textColor,
	 transp=0
	 )
longCloseCondition=crossover(osc,takeProfitRSILevel) or bearCond
strategy.close(id="RSIDivLE", comment="Close All="+tostring(close - strategy.position_avg_price, "####.##"), when= abs(strategy.position_size)>=1  and  sl_type == "NONE" and longCloseCondition)

//close all on stop loss
strategy.close(id="RSIDivLE", comment="TSL="+tostring(close - strategy.position_avg_price, "####.##"),  when=abs(strategy.position_size)>=1 and (sl_type == "PERC"   or sl_type == "ATR" ) and crossunder(close, trailing_sl)  )  //close<ema55 and rsi5Val<20 //ema34<ema55  //close<ema89


// Calculate start/end date and time condition
startDate  = input(timestamp("2019-01-01T00:00:00"), type = input.time)
finishDate = input(timestamp("2021-01-01T00:00:00"), type = input.time)
 
time_cond  = time >= startDate and time <= finishDate