[관련글]
2024.04.05 - [AI 활용법/AI 활용기] - [AI] 트레이딩뷰 파인스크립트 사용해보기
[AI] 트레이딩뷰 파인스크립트 사용해보기
AI로 이것저것 사용해보고 싶은데 일단 바로 생각나는 게 트레이딩뷰 파인스크립트여서 각 회사별 AI에게 한번 동일한 질문을 해보고 적용이 가능한지 알아보고자 한다. 트레이딩뷰는 별도 프로
alldig0001.tistory.com
2024.04.16 - [AI 활용법/AI 활용기] - 트레이딩뷰 지표 파인스크립트 복사해서 붙여넣기로 쉽게 만들기(이동평균선)
트레이딩뷰 지표 파인스크립트 복사해서 붙여넣기로 쉽게 만들기(이동평균선)
이전글에서는 파인스크립트에 대해 전혀모르지만 AI를 사용해서 트레이딩뷰에 사용되는 파인스크립트로 이동평균선을 보여주는 코드를 작성했습니다. 그때의 교훈은 AI는 만들어주긴 하는데
alldig0001.tistory.com
위 2개에서 연속되는 시리즈 글입니다. 이전에 ai로 파인스크립트 코드를 만들어 봤었고 그냥 복사해서 붙여넣는게 더 쉽겠다고 생각해서 복사/붙여넣기로 이동평균선까지 나오게 만들었습니다.
오늘은 기존 스크립트 코드에 지표1개 추가해서 총 2개의 지표를 합쳐서 1개의 지표로 만들고자 합니다. 왜냐면 트레이딩뷰가 무료사용자에게는 지표2개까지만 무료니까 원하는 지표 여러개를 합쳐서 하나로 만들면 무료사용자도 여러가지 지표를 한번에 볼 수 있으니까요.
한번 시작해 보겠습니다.
1. 이전 내용 복습
누군가가 만든 이동평균선 관련 지표를 검색해서 복사/붙여넣기를 해서 "지표만드는중"이란 퍼스널 지표를 만들었습니다.
화면에 표시하고 싶으면 "지표-퍼스널"에서 그냥 클릭하면 되고, 스크립트를 수정하고 싶다면 { } 소스코드 보기 버튼을 누르면 됩니다.
오늘은 이평크로스를 여기에 추가할겁니다.

// (주석) 이전 소스코드 전제
//@version=5
indicator("Moving Average Ribbon", shorttitle="지표만드는중(이동평균선)", 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_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")
2. 이평 크로스 지표 검색해서 스크립트코드 복사해오기
트레이딩뷰에서 지표 검색에서 "cross"라고 검색해서 테크니컬즈에 검색되는 것 중에 하나씩 들어가봐서 가장 마음에 드는걸 고릅니다.(여기서 비공개는 복사하기가 허용되지 않습니다.)
저는 그냥 제일 위에 있는걸 골랐습니다.

제가 고른 지표의 표시는 아래 그림과 같이 되는데요. 분석해보면 9일선과 21일 이동평균선으로 만들어지고 9일선이 21일선을 뚫고 위로 올라갈때, 반대로 9일선이 21일선을 뚫고 아래로 내려갈때 파란 십자가가 표시됩니다. 9일선은 주황색, 21선은 연두색으로 표시되고 있습니다.

이전글과 동일하게 스크립트 보기 누르고 "작업복사본 만들기 해서 파일이름을 바꿔서 내 스크립트에 저장합니다.

코드는 몇 줄 되지 않는데 아무것도 모르는상태에서 바꾸는건 쉽지가 않습니다. 겨우 2줄 바꾸려고 1시간 동안 씨름했습니다. ㅠㅠ
//@version=5
indicator(title="MA Cross", overlay=true, timeframe="", timeframe_gaps=true)
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.cross(short, long) ? short : na, color=#2962FF, style = plot.style_cross, linewidth = 4, title="Cross")
일단 제가 바꾸고 싶은건 9일선과 21일선을 안보이게 하고 싶습니다.(어차피 기존에 만들어둔 이동평균선만 봐도 충분하다고 생각해서요) 이건 심플하게 주석처리(//) 하면 되니까 수정이 간단합니다.
추가적으로 수정하고 싶은건 9일선이 21일선을 뚫고 올라가는 골든크로스일때는 십자가 모양을 빨간색으로 하고 싶습니다.
아래표는 gemini에게 물어보면서 맨땅에 해딩하는 노가다의 기록입니다. 패스하셔도 됩니다.(실제로는 이것보다 훨씬 더 질문을 많이 주고 받았습니다. 다시 한 번 기본지식의 중요성을 깨닫습니다.)
[질문] 파인스크립트 코드 해석해줘 plot(ta.cross(short, long) ? short : na, color=#2962FF, style = plot.style_cross, linewidth = 4, title="Cross") [GEMINI] 설명: 이 코드는 두 개의 이동평균선 (short, long)의 교차 지점을 차트에 표시하는 Pine 스크립트입니다. 핵심 요소:
결과: 이 코드는 두 개의 이동평균선의 교차 지점을 파란색 십자가 마커로 표시된 선으로 차트에 표시합니다. [질문] short > long일때 True 조건 만들어줘 [GEMINI] Pine 스크립트 코드 수정: short > long 조건 추가 수정된 코드: plot(ta.cross(short, long) ? short : na, color=#2962FF, style = plot.style_cross, linewidth = 4, title="Cross") → 이걸했더니 크로스일때만 보여주는게 아니라 short>long인 모든일자에 다 십자가 표시를 해준다. [다시질문] short가 long보다 커질때 True인 조건 만들어줘 [GEMINI] Pine 스크립트 코드 수정: short 이동평균선이 long 이동평균선을 위로 교차하는 조건 만들기 수정된 코드: plot(ta.crossover(short, long) ? short : na, color=#2962FF, style = plot.style_cross, linewidth = 4, title="Cross") → 원래는 ta.cross 였는데 ta.crossover로 바뀌었다. → 비슷한 질문으로 crossunder 도 알아냈다. |
이제 코드를 수정합니다.(이평선은 주석처리해서 안보이게 하고 골든크로스와 데드크로스는 각각 빨간색과 파란색 십자가로 표시되도록 합니다)

//@version=5
indicator(title="MA Cross", overlay=true, timeframe="", timeframe_gaps=true)
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")
3. 2개 지표의 스크립트를 합친다.
이제 거의 다 왔네요
만들어 놓은 스크립트를 복사해놓고
"열기-내스크립트" 를 눌러서 기존에 이동평균선용으로 작성해놓은 내스크립트의 "지표만드는연습중"을 불러옵니다.

불러왔으면 맨 아래로 내려가서 아까 복사해놓은(이평 크로스 스크립트)를 붙여 넣습니다.
저장하고 차트에 넣으려고 하면 에러가 납니다. 검색해보면 indicator라는게 하나만 들어갈 수 있다는 겁니다. 아마 기존스크립트와 신규스크립트에 둘 다 indicator가 있어서 인 것 같습니다. 그래서 아래 indicator를 지웁니다. 그리고 저장을 하면 됩니다.

최종 차트모습과 스크립트 입니다.

//@version=5
indicator("Moving Average Ribbon", shorttitle="지표만드는중(이동평균선+크로스)", 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")
4. 결론 및 정리
오늘은 지표 2개를 합쳐봤습니다. 만약 ta.cross, ta.crossover, ta.crossunder를 미리 알았다면 5분 만에 끝낼 수 있었을 거 같은데 시간이 너무 걸렸네요. 그래도 결과는 만족합니다. 다음번에는 여기에 한가지 지표(볼린져밴드)를 하나 더 추가해보고 싶네요. 다음번에는 10분만에 끝냈으면 좋겠다는 바램입니다. 다들 본인만의 지표만들기에 성공하시길 바랍니다. 막힐때는 코드 복사해서 ai에게 붙여넣고 해석해달라고 부탁해보세요. 응용법을 물어봐도 알려줄거에요. 그럼 이만 줄이겠습니다. 오늘도 감사합니다.
'AI 활용법 > AI 활용기' 카테고리의 다른 글
AI로 로또 당첨번호 예측해보기(feat.뤼튼-GPT4) (0) | 2024.04.30 |
---|---|
트레이딩뷰 파인스크립트 복사해서 붙여넣기로 지표 여러개 합치기(이동평균선+이평크로스+볼린저밴드) (0) | 2024.04.25 |
트레이딩뷰 지표 파인스크립트 복사해서 붙여넣기로 쉽게 만들기(이동평균선) (0) | 2024.04.17 |
[AI] 파이썬 크롤링 코드 만들어줘(네이버 뉴스에서 키워드로 관련 뉴스 가져오기) (0) | 2024.04.06 |
[AI] 트레이딩뷰 파인스크립트 사용해보기 (0) | 2024.04.05 |