RSI 격차 지표 전략

저자:차오장, 날짜: 2024-01-25 11:49:36
태그:

img

전반적인 설명

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 기간을 테스트하여 제품의 특성에 가장 적합한 것을 찾을 수 있다. 일반적으로 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


더 많은