RSI 격차 거래 전략

저자:차오장, 날짜: 2023-10-25 16:47:14
태그:

img

전반적인 설명

RSI 디버전스 거래 전략은 RSI 지표와 가격 움직임 사이의 차이를 식별하여 구매 및 판매 신호를 생성합니다. 이 전략은 또한 위험을 효과적으로 관리하기 위해 스톱 로스, 영업 영업 및 트레일 스톱 로스를 포함합니다.

원칙

이 전략은 주로 거래 기회를 식별하기 위해 RSI 지표의 오차를 사용합니다. 구체적으로, 전략은 먼저 특정 기간 동안 RSI 값을 계산하고, RSI 지표와 가격의 트렌드 라인을 그래프화합니다. RSI 라인이 가격 라인에서 오차 할 때, 즉 RSI가 가격 하락과 동시에 상승하거나 RSI가 가격 상승과 동시에 하락하면 전략은 임박한 트렌드 역전의 신호로 받아들이고 거래 신호를 생성합니다.

이 전략은 가격 선이 상위점에 있는 동안 RSI 라인의 바닥을 감지하면 구매 신호가 생성됩니다. 가격 선이 하단에 있는 동안 RSI 라인이 상위점에 있는 경우 판매 신호가 생성됩니다. 거래 신호가 발생하면 전략은 RSI 가치 크기에 따라 거래 할 수 있습니다.

또한 전략에는 스톱 로스, 트레이프 로스 및 트래일링 스톱 로스 기능이 있습니다. 스톱 로스는 하락 위험을 제어하고, 이윤에 이윤 잠금을 취하고, 트래일링 스톱은 이윤을 실행할 수 있습니다. 이러한 설정은 각 거래의 위험을 효과적으로 관리합니다.

장점

RSI 분산 거래 전략은 다음과 같은 장점을 가지고 있습니다.

  1. RSI의 오차를 파악하면 트렌드 반전을 조기에 감지할 수 있습니다.

  2. RSI는 널리 사용되고 대부분의 거래 플랫폼에서 사용할 수 있습니다. 전략은 높은 적용 가능성을 가지고 있습니다.

  3. RSI 매개 변수는 유연하며 다른 시장 조건에 맞게 조정할 수 있습니다.

  4. 스톱 로스, 영업 영업 및 후속 스톱 로스 통제는 효과적으로 위험합니다.

  5. 이 전략은 신호의 빈도가 적고, 과도한 거래는 피합니다.

  6. 이 논리는 간단하고 자동화를 위해 프로그래밍하기가 쉽습니다.

위험성

이 전략은 또한 몇 가지 위험을 안고 있습니다.

  1. RSI 분차는 완전히 신뢰할 수 없으며 잘못된 신호를 생성 할 수 있습니다. 다른 필터가 필요합니다.

  2. 강한 트렌드 시장에서 격차는 실패할 수 있습니다. 이것은 피해야합니다.

  3. 부적절한 RSI 매개 변수는 성능에 영향을 줄 수 있습니다. 너무 짧은 기간은 빈도와 위험을 증가시킵니다.

  4. 너무 긴 스톱 로스 설정 은 이윤 을 단축 시키고, 너무 느슨 한 스톱 로스 설정 은 위험 을 제한 하지 않는다. 세밀 한 조정 이 필요 하다.

  5. 트레일링 스톱은 변동성 시 시장에서 조기에 중단될 수 있습니다. 변동성을 고려할 때 합리적인 트레일링 폭이 필요합니다.

위험은 다음을 통해 완화 될 수 있습니다.

  1. MACD, 볼링거 밴드 같은 다른 지표를 추가하여 신호를 필터하고 잘못된 신호를 줄입니다.

  2. 이 전략을 사용 하 여 강렬한 추세를 피하는 범위에 묶인 옆 시장을 사용 합니다.

  3. RSI 매개 변수를 최적화하고 최적의 룩백 기간을 선택합니다. 다른 시장에 대한 매개 변수를 테스트합니다.

  4. 합리적인 스톱 로스 레벨을 설정하고 과거 백테스팅을 기반으로 수익을 취합니다.

  5. 시장의 변동성과 위험을 감수하려는 욕구에 따라 후속 정지 거리를 조정합니다.

최적화

이 전략은 다음과 같은 측면에서 개선될 수 있습니다.

  1. 신호를 필터링하고 신뢰성을 높이기 위해 다른 지표를 포함합니다.

  2. RSI 매개 변수를 자동으로 최적화하기 위해 기계 학습을 활용합니다.

  3. 시장 체제에 따라 동적 스톱 로스 알고리즘을 설계합니다. 범위에서 더 넓은 스톱, 트렌딩 시장에서 더 긴 스톱.

  4. 포지션 크기를 조정하기 위해 변동성에 기반한 동적 포지션 크기 모델을 구축합니다.

  5. 가격 변동에 따라 트레일링 스톱에서 트레일링 거리를 설정하는 변동성을 도입합니다.

  6. 외환과 암호화폐와 같은 다른 시장에 전략을 배치합니다.

  7. 자동화를 위한 양적 거래 시스템을 개발합니다.

결론

RSI 분산 거래 전략은 RSI와 가격 사이의 분리를 식별하여 신호를 생성합니다. 논리는 간단하고 자동화하기가 쉽습니다. 스톱 로스, 수익 취득 및 트레일링 스톱은 위험을 효과적으로 제어합니다. 그러나 전략은 정확성과 트렌딩 시장의 한계를 가지고 있습니다. 매개 변수 최적화, 필터 추가 및 동적 스톱을 통해 개선이 가능합니다. 기술적 전략으로서 체계화되면 범위 제한 시장에서 보완 역할을 할 수 있습니다.


/*backtest
start: 2023-09-24 00:00:00
end: 2023-10-24 00:00:00
period: 4h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © faytterro

//@version=5
// strategy("RSI Divergence Strategy", overlay=true, scale = scale.none)
rsilen=input.int(14, title="rsi length")
rsisrc=input(close, title="source")
x=ta.rsi(rsisrc,rsilen)
len=input.int(14, title="RSI Divergence length", maxval=500)
tpb = input.float(25, title="take profit", group = "buy", step = 0.5)
sb = input.float(5, title="stop", group = "buy", step = 0.5)
tsb = input.float(0.25, title="trailing stop", group = "buy", step = 0.5)
tps = input.float(25, title="take profit", group = "sell", step = 0.5)
ss =input.float(5, title="stop", group = "sell", step = 0.5)
tss = input.float(0.25, title="trailing stop", group = "sell", step = 0.5)
src=close
extrapolation=0
zoom=input.int(0, title="zoom", maxval=27, minval=-27)
hline(300-zoom*10, color=color.rgb(54, 58, 69, 100))
hline(10, color=color.rgb(54, 58, 69, 100))
// for ax+b
xo=0.0
yo=0.0
xyo=0.0
xxo=0.0
for i=0 to len-1
    xo:= xo + i/(len)
    yo:= yo + x[len-1-i]/(len)
    xyo:= xyo + i*x[len-1-i]/(len)
    xxo:= xxo + i*i/(len)
dnm=ta.lowest(low,200)
dizi=array.new_float(len*2+1+extrapolation)
// linedizi=array.new_line()
a=(xo*yo-xyo)/(xo*xo-xxo)
b=yo-a*xo
for i=0 to len-1+extrapolation
    array.set(dizi,i,a*i+b)
//// for src
// for ax+b
xo2=0.0
yo2=0.0
xyo2=0.0
xxo2=0.0
for i=0 to len-1
    xo2:= xo2 + i/(len)
    yo2:= yo2 + src[len-1-i]/(len)
    xyo2:= xyo2 + i*src[len-1-i]/(len)
    xxo2:= xxo2 + i*i/(len)

dizi2=array.new_float(len*2+1+extrapolation)
// linedizi2=array.new_line()
a2=(xo2*yo2-xyo2)/(xo2*xo2-xxo2)
b2=yo2-a*xo2
for i=0 to len-1+extrapolation
    array.set(dizi2,i,a2*i+b2)
ttk=((array.get(dizi,0)<array.get(dizi,1)) and (array.get(dizi2,0)>array.get(dizi2,1)))? 1 : 
 ((array.get(dizi,0)>array.get(dizi,1)) and (array.get(dizi2,0)<array.get(dizi2,1)))? -1 : 0
cg=((array.get(dizi,0)<array.get(dizi,1)) and (array.get(dizi2,0)>array.get(dizi2,1)))// and ta.highest(ttk[1],len/2)<1)
cr=((array.get(dizi,0)>array.get(dizi,1)) and (array.get(dizi2,0)<array.get(dizi2,1)))// and ta.lowest(ttk[1],len/2)>-1)
bgcolor(color=(cg and ta.highest(ttk[1],len/2)<1)? color.rgb(76, 175, 79, 50) : 
 (cr and ta.lowest(ttk[1],len/2)>-1)? color.rgb(255, 82, 82, 50) : na, offset=0, display=display.none)
plot(x)

// for ax+b
xo3=0.0
yo3=0.0
xyo3=0.0
xxo3=0.0
for i=0 to len-1
    xo3:= xo3 + i/(len)
    yo3:= yo3 + x[len-1-i+(ta.barssince(cg))]/(len)
    xyo3:= xyo3 + i*x[len-1-i+(ta.barssince(cg))]/(len)
    xxo3:= xxo3 + i*i/(len)

dizi3=array.new_float(len*2+1+extrapolation)
// linedizi3=array.new_line()
a3=(xo3*yo3-xyo3)/(xo3*xo3-xxo3)
b3=yo3-a3*xo3
for i=0 to len-1+extrapolation
    array.set(dizi3,i,a3*i+b3)

// for ax+b
xo4=0.0
yo4=0.0
xyo4=0.0
xxo4=0.0
for i=0 to len-1
    xo4:= xo4 + i/(len)
    yo4:= yo4 + x[len-1-i+(ta.barssince(cr))]/(len)
    xyo4:= xyo4 + i*x[len-1-i+(ta.barssince(cr))]/(len)
    xxo4:= xxo4 + i*i/(len)

dizi4=array.new_float(len*2+1+extrapolation)
// linedizi4=array.new_line()
a4=(xo4*yo4-xyo4)/(xo4*xo4-xxo4)
b4=yo4-a4*xo4
for i=0 to len-1+extrapolation
    array.set(dizi4,i,a4*i+b4)

// line=line.new((last_bar_index-ta.barssince(cg)-len),
//  array.get(dizi3,0), 
//  last_bar_index-ta.barssince(cg),
//  array.get(dizi3,len-1), color=color.rgb(0,255,0), width=2)
// line2=line.new((last_bar_index-ta.barssince(cr)-len),
//  array.get(dizi4,0), 
//  last_bar_index-ta.barssince(cr),
//  array.get(dizi4,len-1), color=color.rgb(255, 0, 0, 0), width=2)
// line.delete(line[1])
// line.delete(line2[1])

alert=((array.get(dizi,0)<array.get(dizi,1)) and (array.get(dizi2,0)>array.get(dizi2,1)) and ta.highest(ttk[1],len/2)<1)
 or ((array.get(dizi,0)>array.get(dizi,1)) and (array.get(dizi2,0)<array.get(dizi2,1)) and ta.lowest(ttk[1],len/2)>-1)
alertcondition(alert)
hline(50)
rs=hline(30)
rss=hline(70)
fill(rs, rss, color=color.rgb(126, 87, 194, 90), title="RSI Background Fill")

longCondition = cg and ta.highest(ttk[1],len/2)<1 
if (longCondition)
    strategy.entry("Long", strategy.long)
    strategy.exit("exit long", "Long", limit = close*(100+tpb)/100 , stop =close*(100-sb)/100 , trail_price = close , trail_offset = close*tsb)

shortCondition = cr and ta.lowest(ttk[1],len/2)>-1 
if (shortCondition)
    strategy.entry("Short", strategy.short)
    strategy.exit("exit short", "Short", limit = close*(100-tps)/100, stop = close*(100+ss)/100, trail_price = close , trail_offset = close*tss)


더 많은