[관련글]
2024.04.05 - [AI 활용법/AI 활용기] - [AI] 트레이딩뷰 파인스크립트 사용해보기
[AI] 트레이딩뷰 파인스크립트 사용해보기
AI로 이것저것 사용해보고 싶은데 일단 바로 생각나는 게 트레이딩뷰 파인스크립트여서 각 회사별 AI에게 한번 동일한 질문을 해보고 적용이 가능한지 알아보고자 한다. 트레이딩뷰는 별도 프로
alldig0001.tistory.com
2024.04.16 - [AI 활용법/AI 활용기] - 트레이딩뷰 지표 파인스크립트 복사해서 붙여넣기로 쉽게 만들기(이동평균선)
트레이딩뷰 지표 파인스크립트 복사해서 붙여넣기로 쉽게 만들기(이동평균선)
이전글에서는 파인스크립트에 대해 전혀모르지만 AI를 사용해서 트레이딩뷰에 사용되는 파인스크립트로 이동평균선을 보여주는 코드를 작성했습니다. 그때의 교훈은 AI는 만들어주긴 하는데
alldig0001.tistory.com
2024.04.25 - [AI 활용법/AI 활용기] - 트레이딩뷰 지표 파인스크립트 복사해서 붙여넣기로 쉽게 만들기(이동평균선+이평크로스)
트레이딩뷰 지표 파인스크립트 복사해서 붙여넣기로 쉽게 만들기(이동평균선+이평크로스)
[관련글]2024.04.05 - [AI 활용법/AI 활용기] - [AI] 트레이딩뷰 파인스크립트 사용해보기 [AI] 트레이딩뷰 파인스크립트 사용해보기AI로 이것저것 사용해보고 싶은데 일단 바로 생각나는 게 트레이딩
alldig0001.tistory.com
위 3개에서 연속되는 시리즈 글입니다. 이전에 ai로 파인스크립트 코드를 만들어 봤었고 그냥 복사해서 붙여넣는게 더 쉽겠다고 생각해서 복사/붙여넣기로 이동평균선과 이동평균선의 골든크로스와 데드크로스까지 차트에 표시되도록 만들었습니다. 이렇게 지표 2개를 섞는 코드를 만들어 봤으니 3개는 동일한 방식으로 쉽게 할 수 있겠죠.
그래서 이번글은 볼린저밴드까지 추가해보려고 합니다. 바로 진행해볼게
1. 이전 내용 요약
이전코드는 단순이동평균선(SAM) 5,20,60,120,240일선
이동평균선 크로스 9일선과 21일선 사용: 골든크로스 빨간십자가 표시, 데드크로스 파란십자가 표시
그럼 아래 화면처럼 구성이 됩니다.

2. 추가 할 볼린저밴드 지표 파인스크립트 수정하기
트레이딩뷰에서 지표 검색에서 "BB"라고 검색해서 검색되는 것 중에 하나씩 들어가봐서 가장 마음에 드는걸 고릅니다.
저는 그냥 제일 위에 있는걸 골랐습니다.

제가 고른 볼린저밴드는 지표의 표시는 아래 그림과 같이 되는데요. 분석해보면 파란색 20일선이 가운데에 위치하고 위에는 빨간선이 아래는 초록선이 표준편차 2만큼 GAP을 가지고 그려집니다. 그리고 그 gap을 희미한 빨강? 핑크?색이 채우고 있습니다.
저는 이걸 가운데선, upper선, lower선 모두 주황색으로 바꿔볼게요(왜냐면 이동평균선 중에 20일선이 주황색이거든요)

자 이제 이전과 동일하게 Pine에디터 열어서 "작업복사본 만들기" 해서 파일이름을 바꿔서 내 스크립트에 저장합니다.

일단 기존코드를 한번 볼게요. 기존코드에 이번에는 클로바x를 사용해서 주석달아달라고 했습니다. 해석을 포함할게요.
//@version=5
// Bollinger Bands 지표입니다.
indicator(shorttitle="BB", title="Bollinger Bands", overlay=true, timeframe="", timeframe_gaps=true)
// BB 밴드의 기준선이 되는 이동평균선의 길이를 설정합니다. (default: 20)
// 아래 20을 60이나 120으로 바꾸면 기준선이 60일선 120일 선으로 바뀐다(올딕추가)
length = input.int(20, minval=1, title="Length")
// BB 밴드의 기준선이 되는 이동평균선의 종류를 선택합니다. (default: SMA)
maType = input.string("SMA", "Basis MA Type", options = ["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"])
// BB 밴드를 계산할 때 사용할 가격 데이터를 선택합니다. (default: close)
// 시가, 고가, 저가, 종가 중 종가를 사용한다(올딕추가)
src = input(close, title="Source")
// BB 밴드의 표준편차를 설정합니다. (default: 2.0)
mult = input.float(2.0, minval=0.001, maxval=50, title="StdDev")
// 선택한 이동평균선을 계산하는 함수입니다.
// 이동평균선 작성 함수를 미리 만들어 놓는다. 단순이동sma, 지수이동 ema 등(올딕추가)
ma(source, length, _type) =>
switch _type
case "SMA":
return ta.sma(source, length)
case "EMA":
return ta.ema(source, length)
case "SMMA (RMA)":
return ta.rma(source, length)
case "WMA":
return ta.wma(source, length)
case "VWMA":
return ta.vwma(source, length)
// BB 밴드의 기준선을 계산합니다.
basis = ma(src, length, maType)
// BB 밴드의 상단선과 하단선을 계산합니다.
dev = mult * ta.stdev(src, length)
upper = basis + dev
lower = basis - dev
// 지표선을 그릴 때 사용할 오프셋을 설정합니다. (default: 0)
offset = input.int(0, "Offset", minval = -500, maxval = 500, display = display.data_window)
// BB 밴드의 기준선을 그립니다.
plot(basis, "Basis", color=#2962FF, offset = offset)
// BB 밴드의 상단선을 그립니다.
p1 = plot(upper, "Upper", color=#F23645, offset = offset)
// BB 밴드의 하단선을 그립니다.
p2 = plot(lower, "Lower", color=#089981, offset = offset)
// BB 밴드의 상단선과 하단선 사이를 채웁니다.
fill(p1, p2, title = "Background", color=color.rgb(33, 150, 243, 95))
어떻게 바꿀지 생각합니다. 저는 기존거에 추가를 할건데 기존에 20일선이 주황색선이어서 볼린저밴드의 중심선과 위아래 선을 모두 주황색으로 바꿔볼게요. 이전에 만든 이동평균선 20일선 선색과 동일하게 주황색 color.rgb(248, 132, 0) 이 색을 사용할게요. 아래그림처럼 수정했어요.

적용한 차트 모습입니다.

3. 기존 스크립트와 이번에 만튼 스크립트를 합친다.
이제 기존스크립트에 추가해볼게요
이번에 만들어 놓은 스크립트를 복사해놓고 "열기-내스크립트" 를 눌러서 기존에 이동평균선용으로 작성해놓은 내스크립트의 "지표만드는연습중"을 불러옵니다.

불러왔으면 맨 아래로 내려가서 아까 복사해놓은(이평 크로스 스크립트)를 붙여 넣습니다. 그리고 스크립트 이름을 "지표만드는연습중(이평+크로스)" → "지표만드는연습중(이평+크로스+bb)" 로 바꾸고 바로저장을 누르던가 아니면 다른이름으로 저장을 합니다.(혹시나 기존거도 안될까봐서요)
일단 새로만든 파일은 에러가 납니다. 이제 이 에러들을 하나씩 해결해볼게요.
첫번째 에러는 이미 ma 라는 함수가 존재한다는 에러입니다. 이건 기존에 작성했던 이동평균선과 동일한 함수를 지정해서 그래요. 둘 중에 하나를 삭제해주면 되겠죠

그리고 저장을 눌러보면 또 에러가 납니다. 이번에는 indicator()가 2개나 있다고 에러가 뜹니다. 위에 있는 indicator를 하나만 남기고 아래 중복되는 indicator()를 삭제합니다. 그리고 indicator() 내부에 있는 shorttle을 "지표만드는중(이동평균선+크로스)" → "지표만드는중(이동평균선+크로스+bb)"로 바꿨습니다. 그리고 저장을 누릅니다.

그리고 차트에 넣기를 하면 아래와 같이 됩니다. 최종 차트모습과 스크립트 입니다.

//@version=5
indicator("Moving Average Ribbon", shorttitle="지표만드는중(이동평균선+크로스+bb)", overlay=true, timeframe="", timeframe_gaps=true)
ma(source, length, type) =>
type == "SMA" ? ta.sma(source, length) :
type == "EMA" ? ta.ema(source, length) :
type == "SMMA (RMA)" ? ta.rma(source, length) :
type == "WMA" ? ta.wma(source, length) :
type == "VWMA" ? ta.vwma(source, length) :
na
show_ma(source, length, type) =>
type == "SMA" ? ta.sma(source, length) :
type == "EMA" ? ta.ema(source, length) :
type == "SMMA (RMA)" ? ta.rma(source, length) :
type == "WMA" ? ta.wma(source, length) :
type == "VWMA" ? ta.vwma(source, length) :
na
show_ma1 = input(true , "MA №1", inline="MA #1", display = display.data_window)
ma1_type = input.string("SMA" , "" , inline="MA #1", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"])
ma1_source = input(close , "" , inline="MA #1", display = display.data_window)
ma1_length = input.int(5 , "" , inline="MA #1", minval=1)
ma1_color = input(color.rgb(246, 41, 9), "" , inline="MA #1", display = display.data_window)
ma1 = ma(ma1_source, ma1_length, ma1_type)
plot(show_ma1 ? ma1 : na, color = ma1_color, title="MA №1")
show_ma2 = input(true , "MA №2", inline="MA #2", display = display.data_window)
ma2_type = input.string("SMA" , "" , inline="MA #2", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"])
ma2_source = input(close , "" , inline="MA #2", display = display.data_window)
ma2_length = input.int(20 , "" , inline="MA #2", minval=1)
ma2_color = input(color.rgb(248, 132, 0), "" , inline="MA #2", display = display.data_window)
ma2 = ma(ma2_source, ma2_length, ma2_type)
plot(show_ma2 ? ma2 : na, color = ma2_color, title="MA №2")
show_ma3 = input(true , "MA №3", inline="MA #3", display = display.data_window)
ma3_type = input.string("SMA" , "" , inline="MA #3", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"])
ma3_source = input(close , "" , inline="MA #3", display = display.data_window)
ma3_length = input.int(60 , "" , inline="MA #3", minval=1)
ma3_color = input(#f6ff00, "" , inline="MA #3", display = display.data_window)
ma3 = ma(ma3_source, ma3_length, ma3_type)
plot(show_ma3 ? ma3 : na, color = ma3_color, title="MA №3")
show_ma4 = input(true , "MA №4", inline="MA #4", display = display.data_window)
ma4_type = input.string("SMA" , "" , inline="MA #4", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"])
ma4_source = input(close , "" , inline="MA #4", display = display.data_window)
ma4_length = input.int(120 , "" , inline="MA #4", minval=1)
ma4_color = input(color.rgb(0, 255, 47), "" , inline="MA #4", display = display.data_window)
ma4 = ma(ma4_source, ma4_length, ma4_type)
plot(show_ma4 ? ma4 : na, color = ma4_color, title="MA №4")
show_ma5 = input(true , "MA №5", inline="MA #5", display = display.data_window)
ma5_type = input.string("SMA" , "" , inline="MA #5", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"])
ma5_source = input(close , "" , inline="MA #5", display = display.data_window)
ma5_length = input.int(240 , "" , inline="MA #5", minval=1)
ma5_color = input(color.rgb(10, 6, 243), "" , inline="MA #5", display = display.data_window)
ma5 = ma(ma5_source, ma5_length, ma5_type)
plot(show_ma5 ? ma5 : na, color = ma5_color, title="MA №5")
//@version=5
shortlen = input.int(9, "Short MA Length", minval=1)
longlen = input.int(21, "Long MA Length", minval=1)
short = ta.sma(close, shortlen)
long = ta.sma(close, longlen)
//plot(short, color = #FF6D00, title="Short MA")
//plot(long, color = #43A047, title="Long MA")
plot(ta.crossover(short, long) ? short : na, color=color.rgb(255, 2, 2), style = plot.style_cross, linewidth = 4, title="Cross")
plot(ta.crossunder(short, long) ? short : na, color=#2962FF, style = plot.style_cross, linewidth = 4, title="Cross")
//@version=5, 볼린저밴드 추가
length = input.int(20, minval=1)
maType = input.string("SMA", "Basis MA Type", options = ["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"])
src = input(close, title="Source")
mult = input.float(2.0, minval=0.001, maxval=50, title="StdDev")
basis = ma(src, length, maType)
dev = mult * ta.stdev(src, length)
upper = basis + dev
lower = basis - dev
offset = input.int(0, "Offset", minval = -500, maxval = 500, display = display.data_window)
plot(basis, "Basis", color=color.rgb(248, 132, 0), offset = offset)
p1 = plot(upper, "Upper", color=color.rgb(248, 132, 0), offset = offset)
p2 = plot(lower, "Lower", color=color.rgb(248, 132, 0), offset = offset)
fill(p1, p2, title = "Background", color=color.rgb(33, 150, 243, 95))
4. 결론 및 정리
오늘은 지표 3개를 합쳐봤습니다. 이전보다는 훨씬 수월하게 끝냈네요. 공부한게 아까워서 How-To에 파인스크립트 사용법을 다양한 지표들로 만들어서 올려봐야겠습니다. 저는 한 3번정도 하니까 단순 지표 추가하는건 어렵지 않은 것 같습니다. 검색하다보니 지표와 비슷한 전략이란게 있던데 다음번에는 전략을 한번 만들어보는 도전을 한번 해보도록 하겠습니다. 오늘도 감사합니다.
'AI 활용법 > AI 활용기' 카테고리의 다른 글
AI로 로또 당첨번호 예측해보기(feat.GEMINI) (0) | 2024.04.30 |
---|---|
AI로 로또 당첨번호 예측해보기(feat.뤼튼-GPT4) (0) | 2024.04.30 |
트레이딩뷰 지표 파인스크립트 복사해서 붙여넣기로 쉽게 만들기(이동평균선+이평크로스) (1) | 2024.04.25 |
트레이딩뷰 지표 파인스크립트 복사해서 붙여넣기로 쉽게 만들기(이동평균선) (0) | 2024.04.17 |
[AI] 파이썬 크롤링 코드 만들어줘(네이버 뉴스에서 키워드로 관련 뉴스 가져오기) (0) | 2024.04.06 |