minimimi
[TradingView] 09. 트레이딩뷰 파인스크립트 버전업하기(V5) - 지표표시부터 자동매매까지 파인 스크립트와 함께(with pine script) 본문
[TradingView] 09. 트레이딩뷰 파인스크립트 버전업하기(V5) - 지표표시부터 자동매매까지 파인 스크립트와 함께(with pine script)
99mini 2023. 4. 18. 11:59트레이딩뷰에서 제동하거나 사용자들이 많들어놓은 다양한 지표와 전략을 내 차트에 불러와서 사용하는 경우가 많을 것입니다. 이때 스크립트를 직접 지표와 전략을 수정하고 싶지만 버전이 V5가 아닌 이전 버전이라 오류가 발생하는 경우가 종종 있을 것입니다.
인기있는 스크립트 중 'Squeeze Momentum Indicator [LazyBear]'를 pine script v5로 버전업해보도록 하겠습니다.
우선 Squeeze Momentum Indicator [LazyBear]는 볼린저밴드와 켈트너 채널(Keltner Channel) 지표를 섞어서 만든 지표입니다.기존 볼린저밴드에 KC 지표를 가중치를 주어 조금더 신뢰할 수 있는 지표를 만들었다고 합니다. 자세한 내용은 아래의 링크를 통해서 제작자의 문서를 확인할 수 있습니다.
https://www.tradingview.com/chart/BTCUSD/4IneGo8h-Master-Index-List-of-all-my-indicators/
//
// @author LazyBear
// List of all my indicators: https://www.tradingview.com/v/4IneGo8h/
//
study(shorttitle = "SQZMOM_LB", title="Squeeze Momentum Indicator [LazyBear]", overlay=false)
length = input(20, title="BB Length")
mult = input(2.0,title="BB MultFactor")
lengthKC=input(20, title="KC Length")
multKC = input(1.5, title="KC MultFactor")
useTrueRange = input(true, title="Use TrueRange (KC)", type=bool)
// Calculate BB
source = close
basis = sma(source, length)
dev = multKC * stdev(source, length)
upperBB = basis + dev
lowerBB = basis - dev
// Calculate KC
ma = sma(source, lengthKC)
range = useTrueRange ? tr : (high - low)
rangema = sma(range, lengthKC)
upperKC = ma + rangema * multKC
lowerKC = ma - rangema * multKC
sqzOn = (lowerBB > lowerKC) and (upperBB < upperKC)
sqzOff = (lowerBB < lowerKC) and (upperBB > upperKC)
noSqz = (sqzOn == false) and (sqzOff == false)
val = linreg(source - avg(avg(highest(high, lengthKC), lowest(low, lengthKC)),sma(close,lengthKC)),
lengthKC,0)
bcolor = iff( val > 0,
iff( val > nz(val[1]), lime, green),
iff( val < nz(val[1]), red, maroon))
scolor = noSqz ? blue : sqzOn ? black : gray
plot(val, color=bcolor, style=histogram, linewidth=4)
plot(0, color=scolor, style=cross, linewidth=2)
스크립트를 확인하면 v4문법으로 작성된 것을 알 수 있습니다. 지표로 사용하거나 전략으로 사용하기 위해서 버전업이 필요합니다.
우선 스크립트 수정을 위하여 카피본을 생성해줍니다. 스크립트의 이름부분을 클릭하면 스크립트를 복제할 수 있습니다.
그 후 //@version=5
를 스크립트 상단에 명시해 주어 v5를 사용한다는 것을 알려줍니다. 이렇게 버전을 명시하게 되면 스크립트에 오류가 발생할 것입니다. 하나씩 차례로 수정해보겠습니다.
첫 번째로 오류 23:1 'range' cannot be used as a variable or function name.
라는 문구를 확인할 수 있습니다.range
는 예약어이기 때문 변수로 이름을 사용할 수 없습니다. KC 지표 사용 여부에 따라 range
를 다르게 할당해주고 있으니 using_range
라는 이름을 사용하도록 하겠습니다.
다음으로 오류 32:103 Syntax error at input 'end of line without line continuation'
오류가 발생하였습니다.
이 오류는 함수의 인자가 끝나지 않았는데 엔터키가 들어가면 발생하는 문제입니다. 간단하게 함수의 인자값을 엔터로 구분지어 놓은 부분을 모두 한 줄로 만들어 주면 됩니다.
val = linreg(source - avg(avg(highest(high, lengthKC), lowest(low, lengthKC)),sma(close,lengthKC)), lengthKC,0)
bcolor = iff( val > 0, iff( val > nz(val[1]), lime, green),iff( val < nz(val[1]), red, maroon))
이 오류를 해결하니 많은 오류가 생겼습니다. V5가 되면서 함수를 네임스페이스 별로 모듈화하여 네임스페이스를 수정해주면 대부분 해결할 수 있습니다.
그전에 study
함수가 strategy
함수로 이름이 바꼈습니다.
strategy(shorttitle = "SQZMOM_LB", title="Squeeze Momentum Indicator [LazyBear]", overlay=false)
input
함수에 type
를 명시하는 인자가 사라졌습니다.useTrueRange = input(true, title="Use TrueRange (KC)")
대부분 지표를 나타내는 함수는 네임 스페이스 ta
에 속해있습니다.ma = ta.sma(source, lengthKC)
ta.linreg()
ta.highest()
ta.lowest()
avg
함수는 array
, math
, matrix
에서 모두 존재하는 함수라서 내용을 더 살펴보아야합니다. array.avg
, matrix.avg
두 함수는 인자로 id
를 입력받아 어레이와 메트릭스의 모든 엘리먼트의 평균을 구하는 함수입니다. 이 지표에서는 숫자값이 2개 이상 인자로 들어가게 되니 math.avg
를 사용하는 것이 적절해 보입니다.
마지막으로 iff
대신에 삼항 연산자를 사용하도록 변하였습니다.
bcolor = val > 0 ? (val > nz(val[1]) ? color.lime : color.green) : (val < nz(val[1]) ? color.red: color.maroon)
위와 같이 iff
조건문 대신에 삼항 연산자를 연쇄적으로 작성해 주면 됩니다.
최종적으로 V5로 버전업한 Squeeze Momentum Indicator [LazyBear] 지표입니다. 버전업만 했기 때문에 지표 모양에는 아무런 변화는 없습니다.
// @version=5
strategy(shorttitle = "SQZMOM_LB", title="Squeeze Momentum Indicator [LazyBear]", overlay=false)
length = input(20, title="BB Length")
mult = input(2.0,title="BB MultFactor")
lengthKC=input(20, title="KC Length")
multKC = input(1.5, title="KC MultFactor")
useTrueRange = input(true, title="Use TrueRange (KC)")
// Calculate BB
source = close
basis = ta.sma(source, length)
dev = multKC * ta.stdev(source, length)
upperBB = basis + dev
lowerBB = basis - dev
// Calculate KC
ma = ta.sma(source, lengthKC)
using_range = useTrueRange ? ta.tr : (high - low)
rangema = ta.sma(using_range, lengthKC)
upperKC = ma + rangema * multKC
lowerKC = ma - rangema * multKC
sqzOn = (lowerBB > lowerKC) and (upperBB < upperKC)
sqzOff = (lowerBB < lowerKC) and (upperBB > upperKC)
noSqz = (sqzOn == false) and (sqzOff == false)
val = ta.linreg(source - math.avg(math.avg(ta.highest(high, lengthKC), ta.lowest(low, lengthKC)), ta.sma(close,lengthKC)), lengthKC, 0)
// 볼린저 밴드 색깔
// 상승 구간
// 상승 중: lime
// 상승 꺽임: green
// 하락 구간
// 하락 중: red
// 하락 꺽임: maroon
bcolor = val > 0 ? (val > nz(val[1]) ? color.lime : color.green) : (val < nz(val[1]) ? color.red: color.maroon)
// 스퀴지 구간 십자가 표시
// 스퀴지 없음: blue
// 스퀴지 on: black
// 스퀴지 off: grey
scolor = noSqz ? color.blue : sqzOn ? color.black : color.gray
plot(val, color=bcolor, style=plot.style_histogram, linewidth=4)
plot(0, color=scolor, style=plot.style_cross, linewidth=2)
지표를 pine script v5로 버전업해보았습니다. 그러나 생소한 프로그래밍 언어의 문법을 모두 외우고 바꾸는 것은 어렵습니다. 따라서 공식문서에서 V4와 V5의 함수를 검색하여 직접 인자를 비교하는 과정이 필요합니다.
https://kr.tradingview.com/pine-script-reference/v5/
https://kr.tradingview.com/pine-script-reference/v4/
대표적으로 이동평균선 함수인 SMA를 검색해 보았을 때 V4와 V5의 차이를 확인할 수 있습니다.
✅ 트레이딩 뷰 유료플랜을 원하신다면 아래의 링크로 가입해주세요.
https://kr.tradingview.com/gopro/?share_your_love=itman390
저와 여러분 모두 최대 30달러를 지급 받을 수 있습니다!