파인 스크립트 지표 만들기

파인스크립트로 RSI(상대강도지수) 지표를 만들어보자

Going Run V 2022. 7. 9.
반응형

RSI

파인스크립트로 RSI 지표를 만들어보자

트레이딩뷰 하단에 지표를 만드는 창이있다.


1. RSI는 어떤 지표일까?

상대강도지수(Relative Strength Index = RSI)는 
주식, 선물, 옵션 등의 기술적 분석에 사용되는 보조 지표입니다.
RSI는 가격의 상승 압력과 하락 압력 간의 상대적인 강도를 나타냅니다. 

1978년 미국의 월레스 와일더(J. Welles Wilder Jr.)에 의해서 만들어진 지표입니다.

더욱 자세하게 공부하고 싶다면 아래에 링크에서 참고하시면 됩니다.

RSI (투자지표) - 위키백과, 우리 모두의 백과사전 (wikipedia.org)


2. 트레이딩 뷰에서 제공하는 RSI의 기본 소스코드

//@version=5

indicator(title='Relative Strength Index', shorttitle='RSI', format=format.price, precision=2, timeframe='')
len = input.int(14, minval=1, title='Length')
src = input(close, 'Source')
up = ta.rma(math.max(ta.change(src), 0), len) 
down = ta.rma(-math.min(ta.change(src), 0), len)
rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - 100 / (1 + up / down)

plot(rsi, 'RSI', color=color.new(color.red, 0))
band1 = hline(70, 'Upper Band', color=#787B86)
bandm = hline(50, 'Middle Band', color=color.new(#787B86, 50))
band0 = hline(30, 'Lower Band', color=#787B86)
fill(band1, band0, color=color.rgb(126, 87, 194, 90), title='Background')

 

  • version = 해당 지표의 버전을 나타냅니다.
  • indicator = 지표의 제목과 부제목 기본적인 설정 등을 합니다.
  • len = 인풋 값을 인트로 주고 기간을 14일로 정합니다.
  • src = source의 약어입니다. close는 종가를 나타냅니다.
  • up, down, rsi = RSI를 구하는 공식입니다.(굳이 안 외우셔도 됩니다.)
  • plot = rsi를 차트 위에 빨간색으로 출력합니다.
  • band1, bandm, band0 = hline(가로선)을 차트 위에 출력합니다.
  • fill = band1, band0 사이에 배경을 출력합니다.

 

기본적으로 트레이딩 뷰에서 제공하는 RSI를 이용해서

아래에서는 이 내용에 추가적인 기능을 넣어서

조금 더 쉽고 간결하게 만들어보겠습니다.


3. 파인스크립트 지표의 버전 설정하기.

//@version=3
//@version=4
//@version=5

지표를 만들기에 앞서 어떤 언어를 사용할 건지에 대한 버전을 입력해야 합니다.

앞으로 다루게 될 내용에서는 버전 5를 사용할 예정입니다.

이유는 버전 5 밑으로는 트레이딩 뷰에서 리버전 하는 기능이 있기에 호환이 가능합니다.

그리고 또한 구현하는 함수들이 사용하기 쉽도록 더욱 간결해졌습니다.

 

4. RSI의 타이틀 설정하기

//https://goingrunv.com/
//@version=5

indicator(title='GRV-RSI', shorttitle='GRV-RSI', format=format.price, precision=2, timeframe='')

 

  • title = 스크립트의 이름을 설정합니다. 
  • shorttitle = 스크립트에 단축된 이름을 설정합니다. 
  • overlay = 스크립트를 차트 위에 표시합니다. 
  • format = 스크립트의 플롯 된 값이 가격 척도에 사용하는 형식을 정의합니다.
  • precision = 스크립트의 값에 나타나는 소수 자릿수를 설정합니다.

5. RSI의 함수 설정하고 라인 출력하기

//@version=5
indicator(title='Relative Strength Index', shorttitle='RSI', format=format.price, precision=2, timeframe='')

//rsi 함수 정의
len = input.int(14, minval=1, title='rsi_Length')
src = input(close, 'rsi_Source')
rsi = ta.rsi(src, len)

//rsi 출력
plot(rsi, title='rsi', color=color.yellow, linewidth=2)

 

버전 5 파인 스크립트에서는 ta.***라는 함수로 간단하게 지표를 불러올 수 있습니다.

rsi는 (close, 기간=14)로 정의하고 출력해보겠습니다.

plot(차트 위에 rsi를 색상은 노란색, 라인 굵기는 2로 출력합니다.)

  


6. RSI의 상단선 중간선 하단선 설정하기

Top_line = hline(70, title='상단선', color=color.new(color.white, 50), linestyle=hline.style_dotted, linewidth=1)
Middle_line = hline(50, title='중간선', color=color.new(color.white, 50), linestyle=hline.style_dotted, linewidth=1)
Bottom_line = hline(30, title='하단선', color=color.new(color.white, 50), linestyle=hline.style_dotted, linewidth=1)

 

color=color.new(color. 색상, 0~100)

color.new 함수로 색상과 투명도를 설정할 수 있습니다.

linestyle=(hline.style_dotted // hline.style_solid // hline.style_dashed)

라인의 스타일을 설정할 수 있습니다.

linewidth=1

라인 굵기입니다.

 


7. RSI의 과매도 구간 과매수 구간 색칠하기

//rsi 과매도 과매수 구간

overbought = plot(70, title='과매수구간1', color=color.new(color.white, 100), editable=false)
oversold = plot(30, title='과매도구간1', color=color.new(color.white, 100), editable=false)

obcolor = plot(rsi > 70 ? rsi : 70, title='과매수구간2', color=color.new(color.red, 100), editable=false)
oscolor = plot(rsi < 30 ? rsi : 30, title='과매도구간2', color=color.new(color.red, 100), editable=false)

fill(overbought, obcolor, color=color.new(color.red, 30), title='과매수구간')
fill(oversold, oscolor, color=color.new(color.blue, 30), title='과매도구간')

editable이라는 함수로 차트 테이블 위에 표시하지 않습니다.(숨김 처리)

fill이라는 함수로 과매도 구간 과매수 구간에 색을 칠해줍니다.


8. 최종 RSI 보조지표 소스코드

//https://goingrunv.com/
//@version=5

indicator(title='GRV-RSI', shorttitle='GRV-RSI', format=format.price, precision=2, timeframe='')

//rsi 함수 정의
len = input.int(14, minval=1, title='rsi_Length')
src = input(close, 'rsi_Source')
rsi = ta.rsi(src, len)

//rsi 출력
plot(rsi, title='rsi 라인설정', color=color.new(color.white, 50), linewidth=2)

//rsi 기준 라인 설정
top = hline(70, title='상단선', color=color.new(color.red, 40), linestyle=hline.style_solid, linewidth=1)
middle = hline(50, title='중간선', color=color.new(color.orange, 40), linestyle=hline.style_dotted, linewidth=1)
bottom = hline(30, title='하단선', color=color.new(color.green, 40), linestyle=hline.style_solid, linewidth=1)

//rsi 매도 매수 구간

overbought = plot(70, title='과매수구간1', color=color.new(color.white, 100), editable=false)
oversold = plot(30, title='과매도구간1', color=color.new(color.white, 100), editable=false)

obcolor = plot(rsi > 70 ? rsi : 70, title='과매수구간2', color=color.new(color.red, 100), editable=false)
oscolor = plot(rsi < 30 ? rsi : 30, title='과매도구간2', color=color.new(color.red, 100), editable=false)

fill(overbought, obcolor, color=color.new(color.red, 30), title='과매수구간')
fill(oversold, oscolor, color=color.new(color.blue, 30), title='과매도구간')

최종본

 

댓글0

💲 추천 글