RSI 다이버전스 트레이딩 전략


생성 날짜: 2023-10-25 16:47:14 마지막으로 수정됨: 2023-10-25 16:47:14
복사: 0 클릭수: 846
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

RSI 다이버전스 트레이딩 전략

개요

RSI 지표와 가격 움직임 사이의 오차를 식별하여 구매 및 판매 신호를 주는 거래 전략. 이 전략은 동시에 중단, 중지, 중단 등의 기능을 가지고 있으며 위험을 효과적으로 제어 할 수 있습니다.

원칙

이 전략은 주로 RSI 지표의 이탈을 기반으로 거래 기회를 식별합니다. 구체적으로, 전략은 먼저 일정 주기 동안의 RSI 값을 계산하고 RSI 지표의 트렌드 라인을 그립니다. 동시에, 전략은 가격의 트렌드 라인도 그립니다. RSI 라인이 가격 라인과 떨어져있는 경우, 즉 RSI가 상승하면 가격이 떨어지거나 RSI가 떨어지면서 가격이 상승하면 전략 판단이 전환되어 거래 신호가 발생 할 수 있습니다.

만약 RSI 선이 낮은 곳에서 상승하고 가격 선이 높은 곳에서 떨어지는 상황을 식별하면, 구매 신호를 준다. 만약 RSI 선이 높은 곳에서 떨어지고 가격 선이 낮은 곳에서 상승하는 상황을 식별하면, 판매 신호를 준다. 거래 신호가 형성되면, 전략은 RSI 값의 크기에 따라 적당한 거래를 할 수 있다.

또한, 전략은 중지, 중지, 추적 중지 기능을 설정합니다. 중지 손실을 제어 할 수 있습니다. 중지 손실을 제어 할 수 있습니다. 중지 수익을 고정 할 수 있습니다.

장점

이 RSI 외환 거래 전략은 다음과 같은 장점이 있습니다.

  1. RSI 지표의 이탈을 포착함으로써 가격 변동을 조기에 발견할 수 있다.

  2. RSI 지표는 널리 사용되며, 대부분의 거래 소프트웨어는 RSI 지표를 내장하고 있다. 이 전략은 적용성이 강하다.

  3. RSI 지표의 매개 변수는 유연하게 설정되어 시장의 관찰 주기에 따라 조정될 수 있으며, 다른 상황에 적응할 수 있다.

  4. 스톱로스, 스톱스, 그리고 스톱로스를 추적하는 설정과 함께, 각 거래의 위험을 효과적으로 제어할 수 있습니다.

  5. 전략 거래 신호의 빈도가 적고, 너무 밀도 높은 거래를 피한다.

  6. 전략적 아이디어는 명확하고 이해하기 쉽고, 컴퓨터 프로그램으로 구현하기 편리하다.

위험

이 전략에는 몇 가지 위험도 있습니다.

  1. RSI의 이탈은 100% 신뢰할 수 없으며, 가짜 신호가 발생할 수 있습니다. 다른 지표와 결합하여 필터링 신호가 필요합니다.

  2. 동향상태에서 RSI의 이탈 신호는 무효가 될 수 있으므로 사용을 피해야 한다.

  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)