이중 RSI 돌파구 전략

저자:차오장, 날짜: 2023-12-27 14:33:15
태그:

img

전반적인 설명

듀얼 RSI 브레이크아웃 전략은 RSI 지표를 사용하여 가격 반전 지점을 식별하는 알고리즘 거래 전략입니다. 시장이 과소매 또는 과소매인지 결정하기 위해 RSI 지표를 미리 설정된 상위 및 하위 임계 값과 비교하여 거래 신호를 생성합니다.

전략 논리

이 전략은 주로 시장 상태를 판단하기 위해 RSI 지표에 의존합니다. RSI 지표는 특정 기간 동안 종점 가격의 변화를 기반으로 계산되며 주식의 구매 및 판매 동력을 반영합니다. RSI가 미리 설정된 상위 임계 (디폴트 75) 를 넘을 때 주식이 과소매 구역에 진입했음을 나타냅니다. RSI가 미리 설정된 하위 임계 (디폴트 25) 아래로 떨어지면 주식이 과소매 구역에 진입했음을 나타냅니다.

판단 규칙은 다음과 같습니다.

  1. RSI가 상단점을 넘을 때, 단축한다.
  2. RSI가 하위 임계치 아래로 넘어가면, 긴 거래가 됩니다.
  3. 스톱 로스 또는 리프트를 달성할 때 포지션을 닫습니다.

거래 논리는 간단하고 명확하며 합리적인 참조 매개 변수 설정과 큰 구성 공간으로 시장의 더 큰 추세를 포착하기에 적합합니다.

이점 분석

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

  1. 이해하기 쉽고 구현하기 쉬운 간단한 논리
  2. 개인화할 수 있는 합리적인 기준 파라미터 설정
  3. 시장 조건에 유연하게 대응할 수 있는 설정 가능한 역거래 로직
  4. 가격 전환점을 효과적으로 파악하고 주요 추세를 파악할 수 있습니다.

일반적으로 합리적인 기준 매개 변수 설정, 간단한 구현 및 RSI를 통해 가격 반전을 효과적으로 결정 할 수있는 능력으로이 전략은 중장기 트렌드 포착에 적합하며 수치 전략으로 이해하기 쉽고 사용하기 쉽습니다.

위험 분석

이 전략은 비교적 간단하고 신뢰할 수 있음에도 불구하고 잠재적인 위험을 무시할 수는 없습니다.

  1. RSI 지표가 잘못된 신호를 유발할 확률이 상대적으로 높습니다. RSI는 가격 반전을 완벽하게 예측할 수 없으며 잘못된 판단으로 이어질 수 있습니다.
  2. 트렌드 시장에서 지속적인 스톱 로즈의 가능성 RSI는 일반적인 범위에 묶인 조정과 트렌드 역전에서 구별하기가 어렵습니다.
  3. 범위 시장에서 더 많은 손실이 발생할 수 있습니다. RSI는 범위 추세를 효과적으로 결정할 수 없으며이 환경에서 더 큰 손실을 초래합니다.

위험 을 조절 하기 위해 다음 과 같은 점 들 에 주의 를 기울여야 합니다.

  1. 과도한 잘못된 판단률을 방지하기 위해 적절한 매개 변수를 조정합니다.
  2. 거래 신호를 다른 지표로 확인하여 정확도를 높입니다.
  3. 수익률을 높이고 단독 스톱 손실 크기를 줄이세요.
  4. 다양한 시장에서 거래를 피하십시오.

최적화 방향

이 전략에 직면한 주요 위험은 역전 판단과 다양한 시장에서 손실을 고려하면 다음 측면에서 최적화 할 수 있습니다.

  1. 다른 지표와 신호를 필터링합니다. KDJ와 MACD와 같은 지표는 잘못된 판단을 피하기 위해 필터링 역할을 할 수 있습니다.
  2. 단일 중지 손실 금액의 문턱을 높입니다. 적절한 단일 중지 손실 공간을 확장하면 전략이 큰 추세를 따라 할 수 있습니다.
  3. 오픈 포지션 주파수 제한을 설정. 너무 빈번한 포지션 오픈을 제어하기 위해 특정 기간에 한 번 또는 N 번으로 엔트리를 제한하는 논리를 추가합니다.
  4. 시장 조건 판단을 설정하십시오. 전략이 트렌딩 시장에서만 실행되는지 확인하고, 전략의 위험/이익 비율을 크게 최적화 할 수있는 다양한 시장을 피하십시오.

결론

요약하자면, 이중 RSI 브레이크아웃 전략은 간단하고 실용적인 양적 전략이다. 그것은 단순한 트렌드를 따라하기 위해 RSI를 통해 가격 반전을 식별한다. 일부 잘못된 판단 위험이 존재하지만, 매개 변수 조정, 신호 필터링과 같은 최적화는 이를 완화하고 중장기 트렌드를 파악하는 데 중요한 역할을 할 수 있다. 그것의 논리는 간단하며, 초보자 양자가 참조하고 배울 수 있도록 적합하다. 추가 최적화로, 이 전략은 비교적 안정적인 양적 수익을 얻는 데 유망하는 것을 보여준다.


/*backtest
start: 2023-12-19 00:00:00
end: 2023-12-26 00:00:00
period: 3m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("RSI Algo", overlay=true)

// Calculate start/end date and time condition
DST = 1 //day light saving for usa
//--- Europe
London = iff(DST==0,"0000-0900","0100-1000")
//--- America
NewYork = iff(DST==0,"0400-1500","0500-1600")
//--- Pacific
Sydney = iff(DST==0,"1300-2200","1400-2300")
//--- Asia
Tokyo = iff(DST==0,"1500-2400","1600-0100")

//-- Time In Range
timeinrange(res, sess) => time(res, sess) != 0

london = timeinrange(timeframe.period, London)
newyork = timeinrange(timeframe.period, NewYork)

time_cond = true


myPeriod = input(defval=14, type=input.integer, title="Period")
myThresholdUp = input(defval=75, type=input.float, title="Upper Threshold")
myThresholdDn = input(defval=25, type=input.float, title="Lower Threshold")
myAlgoFlipToggle = input(defval=false, type=input.bool, title="Imverse Algorthim")
myLineToggle = input(defval=true, type=input.bool, title="Show Lines")
myLabelToggle = input(defval=true, type=input.bool, title="Show Labels")
myRSI=rsi(close, myPeriod)
buy = myAlgoFlipToggle ? falling(myRSI,1) and cross(myRSI, myThresholdDn) : rising(myRSI, 1) and cross(myRSI,myThresholdUp) //and time_cond
sell = myAlgoFlipToggle ? rising(myRSI, 1) and cross(myRSI,myThresholdUp) : falling(myRSI,1) and cross(myRSI, myThresholdDn) //and time_cond
myPosition = 0
myPosition := buy==1 ? 0 : sell==1 or myPosition[1]==1 ? 1 : 0
trendColor = buy ? color.red : sell ? color.green : na
plot(myLineToggle ? buy and myPosition[1]==1 ? low - 0.004: sell and myPosition[1]==0 ? high + 0.004 : na : na, color=trendColor, style=plot.style_line, linewidth=4, editable=false)
plotshape(myLabelToggle ? buy and myPosition[1]==1 ? low - 0.005 : na : na, style=shape.labelup, location=location.absolute, text="Buy", transp=0, textcolor = color.white, color=color.black, editable=false)
plotshape(myLabelToggle ? sell and myPosition[1]==0 ? high + 0.005 : na : na, style=shape.labeldown, location=location.absolute, text="Sell", transp=0, textcolor = color.white, color=color.black, editable=false)

strategy.initial_capital = 50000
    //Calculate the size of the next trade
balance = strategy.netprofit + strategy.initial_capital //current balance
floating = strategy.openprofit          //floating profit/loss
risk = input(2,type=input.float,title="Risk %")/100           //risk % per trade
isTwoDigit = input(false,"Is this a 2 digit pair? (JPY, XAU, XPD...")


stop = input(250, title="stop loss pips")
tp = input(2500, title="take profit pips")
if(isTwoDigit)
    stop := stop/100
    
temp01 = balance * risk     //Risk in USD
temp02 = temp01/stop        //Risk in lots
temp03 = temp02*100000      //Convert to contracts
size = 1
    
strategy.entry("long",1,size,when=buy and myPosition[1]==1 )
strategy.entry("short",0,size,when=sell and myPosition[1]==0)

strategy.exit("exit_long","long",loss=stop, profit=tp)      //Long exit (stop loss)
strategy.exit("exit_short","short",loss=stop, profit=tp)      //Short exit (stop loss)

//strategy.close_all(when= not time_cond)


더 많은