컨텍스트 스위칭, 'security' 함수

From TradingView Wiki
Jump to: navigation, search
Language: English  • 日本語 • 한국어 • Русский

security 함수를 쓰면 현재 인디케이터가 적용된 심볼/레졸루션과 다른 심볼/레졸루션 데이터를 불러와 쓸 수 있습니다.

상세 설명

현재 차트가 IBM,1 분 차트라고 가정하겠습니다. 다음 스크립트는 이 1분 차트에서 15분 종가를 화면에 그려주는 코드입니다.

study("security 보기 1", overlay=true)
ibm_15 = security("NYSE:IBM", "15", close)
plot(ibm_15)
security 보기 1

security 아규먼트 설명을 보면, 첫번째 아규먼트는 불러올 데이터 심볼 이름입니다. 두번째 아규먼트는 불러올 레졸루션이고, 세번째는 불러온 데이터로 계산할 수식입니다.

심볼 이름은 단순히 심볼 이름만을 쓰거나 또는 심볼 이름앞에 거래소 (또는 데이터 프로바이더) 를 나타내는 프리픽스를 붙여 쓸 수 있습니다. 보기: “NYSE:IBM”, “BATS:IBM” 또는 “IBM”. 거래소 프리픽스없이 심볼 이름만을 쓰는 경우, 디폴트 거래소는 BATS 가 됩니다. 현재 심볼 이름은 빌트인 변수인 ‘ticker’ 및 ‘tickerid’ 에 들어갑니다. ‘ticker’ 변수는 거래소 프리픽스가 없는 심볼 이름 (보기: ‘MSFT’), ‘tickerid’ 변수에는 거래소 프리픽스가 붙은 심볼 이름 (보기: ‘BATS:MSFT’, ‘NASDAQ:MSFT’ 등) 이 들어갑니다. 서로 다른 거래소 데이터를 쓰는 인디케이터의 경우 값을 헷갈리지 않도록 ‘tickerid’ 를 쓰는 것이 좋습니다.

(security 함수의 두번째 아규먼트인 ) 레졸루션은 스트링으로 세팅합니다. 인트라데이 레졸루션은 쓰고자 하는 분값으로 세팅합니다. 가장 작은 '분' 레졸루션은 “1” 입니다. 아무 분이나 불러올 수 있습니다: “5”, “10”, “21”, 등. ‘시간’ 레졸루션 역시 분값으로 세팅합니다. 보기로, 한시간, 두시간, 네시간은 각각 “60”, “120”, “240” 이 됩니다. 1날 레졸루션은 “D” 또는 “1D” 로 세팅하면 됩니다. 아무 날수나 불러올 수 있습니다: “2D”, “3D”, 등 주와 달 레조루션도 비슷하게 세팅합니다: “W”, “1W”, “2W”, …, “M”, “1M”, “2M”. “M” 과 “1M” 은 똑같은 한달 레졸루션 값이 됩니다. “W” 와 “1W” 는 같은 한주 레졸루션 값입니다. security 함수 세번째 파라미터는 아무 식이나 함수 콜을 쓸 수 있으며, 해당 시리즈 컨텍스트에서 계산이 됩니다.

보기로, security 를 써서 유저는 1분 차트에 아무런 레졸루션 (보기, 날, 주, 달) 기반의 SMA 를 그릴 수 있습니다.

study(title="큰 타임 프레임 MA", overlay=true)
src = close, len = 9
out = sma(src, len)
out1 = security(tickerid, 'D', out)
plot(out1)

또는 다음과 같이 변수를 선언한 뒤,

spread = high - low

아래와 같이 1, 15 맟 60 분 레졸루션으로 계산할 수도 있습니다:

spread_1 = security(tickerid, '1', spread)
spread_15 = security(tickerid, '15', spread)
spread_60 = security(tickerid, '60', spread)


위 보기에서 본 바와 같이 security 함수는 리턴하는 시리즈를 현재 차트 심볼의 타임 스케일에 적절하게 맞춰 줍니다. 이 결과 시리즈는 메인 차트에서 plot 을 써서 곧바로 그리거나, 아니면 지표 코드안에서 또 다른 계산용으로 쓸 수도 있습니다. ‘Advance Decline Line’ 인디케이터에 좀 더 어려운 security 함수 보기가 나와 있습니다:

study(title = "Advance Decline Line", shorttitle="ADL")
sym(s) => security(s, period, close)
difference = (sym("INDEX:ADVN") - sym("INDEX:DECN"))/(sym("INDEX:UNCN") + 1)
adline = cum(difference > 0 ? sqrt(difference) : -sqrt(-difference))
plot(adline)

위 스크립트는 한꺼번에 세 개의 시큐어리티를 요청하여 그 값으로 수식을 계산합니다. 계산 결과는 투자자들이 윗쪽 또는 아랫쪽 트렌드를 보이는 스탁수를 세기 위한 스탁 마켓 인디케이터입니다 (자세한 설명).

위 코드를 보면 코딩량을 줄이기 위해 security 콜을 유저 함수 sym 안에 넣어 썼음을 유의하시기 바랍니다.

security 함수는 현재 차트보다 더 큰 타임프레임 차트 데이터를 불러오기 위해 만들었습니다. 보기를 들자면, 1h 차르에서, 4h, 1D, 1W (또는 그 밖의 더 큰 타임프레임) 데이터를 불러와 플롯할 수 있습니다. 1h 차트에서 15m 차트를 불러 쓰는 것처럼, 현재 차트보다 작은 타임프레임 데이터를 불러오는 것은 삼가시기 바랍니다.

Barmerge: gaps 와 lookahead

불러올 데이터가 현재의 타임프레임에 어떻게 매핑이 될지를 정하는 두 가지 스위치가 있습니다.

첫번째는 갭을 조절하며 디폴트값은 barmerge.gaps_off 로써, 데이터를 (갭없이) 이어서 머지합니다. barmerge.gaps_on 이면 데이터를 (na 값으로) 갭을 채워 머지합니다.

두번째는 버전 3에서 새로 생긴 lookahead 파라미터로써 두가지 값을 가질 수 있습니다: barmerge.lookahead_offbarmerge.lookahead_on 을 써서 security를 새 버전인 버전 3 와 옛 버전인 버전 1,2 로 스위치할 수 있습니다.

보기를 통해 5분 차트에서 security 함수가 다르게 쓰이는 것을 보겠습니다:

//@version=3
study("My Script", overlay=true)
a = security(tickerid, '60', low, lookahead=barmerge.lookahead_off)
plot(a, color=red)
b = security(tickerid, '60', low, lookahead=barmerge.lookahead_on)
plot(b, color=lime)
V3.png

차트위 녹색 줄은 lookahead 값을 on 으로 하여 불러온 시간 바의 저가입니다. PineScript v2 로 구현한 security 함수로써 쓰이고 있습니다. 과거 데이터를 기반으로 한 녹색 줄이 새로운 시간 바 (파란 색 점선 세로 줄) 가 만들어지고 난 뒤 바로 시간 바 저가 레벨에서 그려집니다. 빨간 줄은 lookahead 값을 off 로 하여 불러온 시간 바의 저가입니다. 이 경우 불러온 시간 바의 과거 저가는 불러온 시간의 마지막 분 바에 대해서만 나오게 되는데, 이때는 시간 바의 저가는 미래 데이터를 리턴하지 않기 때문입니다. 핑크색 점선은 실시간 데이터의 시작을 나타냅니다. 실시간 데이터에 대해서는 barmerge.lookahead_onbarmerge.lookahead_off 모두 barmerge.lookahead_off와 같이 행동합니다.


lookahead 이해하기

퍼블리쉬된 많은 스크립트가 다음과 같은 코드를 갖고 있습니다:

//@version=2
//...
a = security(tickerid, 'D', close[1]) // version=2 이므로 barmerge.lookahead_on 입니다

security 함수에 쓰인 수식 (close[1]) 은 전날의 close 값을 쓰고 있으므로 미래 데이터를 쓰지 않습니다.

v3 에서는 두가지 방법으로 다시 쓸 수있습니다.

barmerge.lookahead_on 또는 barmerge.lookahead_off. barmerge.lookahead_on 를 쓰게 되면 아주 간단해집니다:

//@version=3
//...
a = security(tickerid, 'D', close[1], lookahead=barmerge.lookahead_on)

원본에서 미래 데이터를 쓰지 않기 때문에 barmerge.lookahead_off 를 써서 다시 코드를 쓸 수 있습니다. barmerge.lookahead_off 를 쓰면 스크립트는 훨씬 복잡해지지만 lookahead 파라미터가 어떻게 쓰이는 지를 이해할 수 있게 됩니다:

//@version=3
//...
indexHighTF = barstate.isrealtime ? 1 : 0
indexCurrTF = barstate.isrealtime ? 0 : 1
a0 = security(tickerid, 'D', close[indexHighTF], lookahead=barmerge.lookahead_off)
a = a0[indexCurrTF]

과거 데이터 기반의 인디케이터의 경우 (다시 말해, barstate.isrealtime 값이 false 라면), 현재 데일리 레졸루션의 종가를 읽어 security 결과를 현재 레졸루션에서 오른쪽으로 한 바 쉬프트합니다. 인디케이터를 실시간 데이터로 계산할 경우는 전날 종가를 security 에서 쉬프트하지 않습니다.


이전: 줄 넘김, 다음: Bar_states._Built-in_variables_‘barstate’/ko, 위로: Pine 스크립트 튜토리얼