변수 재할당과 시계열 다루기: Pine Script의 := 연산자 및 History Referencing ([]) 활용법

안녕하세요, 여러분! 👋 트레이딩뷰로 나만의 멋진 전략 지표를 만들려고 파인스크립트(Pine Script)를 처음 켜셨다가, 어딘가 익숙한 듯 묘하게 달라서 멈칫하셨던 적 없으신가요?

아마 일반적인 파이썬이나 자바스크립트 생각하고 a = 10처럼 변수 값을 바꿨는데, 조건문만 지나면 감쪽같이 원래 값으로 되돌아와 있어서 당황하셨거나, "도대체 바로 전 봉의 가격은 어떻게 불러오지?" 하며 머리를 싸매신 분들이 정말 많으실 겁니다. (저도 처음엔 그랬답니다! 😅)

그 이유는 일반 프로그래밍 언어와 달리, 파인스크립트는 차트의 캔들(봉) 하나하나를 차례대로 순회하며 실행되는 독특한 시계열(Series) 구조를 가졌기 때문인데요. 이 성질을 정확히 모르면 내가 원하지 않는 방향으로 지표가 엉뚱하게 그려지기 십상입니다.

그래서 이번 글에서는 파인스크립트 정복의 필수 관문이자, 시계열 데이터를 내 뜻대로 주무를 수 있게 해주는 두 가지 치트키! 재할당 연산자(:=)와 과거 참조 연산자([])의 모든 것을 알기 쉽게 싹 정리해 드리겠습니다.

이것만 딱 짚고 넘어가시면 여러분의 코딩 실력이 한 차원 훌쩍 뛰어오를 거예요. 자, 그럼 가볍게 출발해 볼까요? 🚀

1. 변수 선언(=)과 변수 재할당(:=)의 차이

파인스크립트에서 변수를 다룰 때 =과 :=의 차이를 구분하는 것은 매우 중요합니다.

  • = (선언 및 최초 할당): 새로운 변수를 생성할 때 사용합니다.

  • := (재할당): 이미 선언된 기존 변수의 값을 새로운 값으로 업데이트할 때 사용합니다.

왜 := 연산자가 필요할까요?

파인스크립트는 새로운 봉(Bar)이 시작될 때마다 스크립트 전체를 위에서 아래로 다시 실행합니다. 만약 조건문(if) 내에서 =으로 변수를 다시 작성하면, 파인스크립트는 기존 변수를 수정하는 것이 아니라 새로운 지역 변수(Local Variable)를 선언하는 것으로 받아들이거나 구문 오류(Syntax Error)를 발생시킵니다.

//@version=5

indicator("변수 재할당 예시", overlay=true)


// 1. 변수 선언 (최초 할당)

var int trendState = 0 


// 2. 조건에 따라 변수 재할당 (:= 연산자 사용)

if ta.crossover(ta.sma(close, 10), ta.sma(close, 20))

    trendState := 1   // 상승 추세 전환 시 1로 재할당

else if ta.crossunder(ta.sma(close, 10), ta.sma(close, 20))

    trendState := -1  // 하강 추세 전환 시 -1로 재할당


plot(trendState, title="추세 상태")

위 코드처럼 이미 선언된 trendState의 값을 조건에 맞춰 변경할 때는 반드시 := 연산자를 사용해야 의도한 대로 값이 유지됩니다.


2. History Referencing Operator ([]) : 과거 데이터 참조하기

파인스크립트에서 모든 가격 데이터(open, high, low, close 등)와 사용자가 만든 변수는 기본적으로 시계열(Series) 데이터 형태로 저장됩니다.

현재 봉의 값뿐만 아니라 N개 이전 봉의 값을 가져오고 싶을 때 사용하는 것이 바로 History Referencing 연산자 []입니다.

대괄호 [] 사용법과 의미

  • close: 현재 진행 중인 봉(또는 확정된 현재 봉)의 종가 (close[0]과 동일)

  • close[1]: 바로 전 1개 봉(Bar)의 종가

  • close[5]: 5개 전 봉의 종가

  • high[1]: 전 봉의 고가

//@version=5
indicator("과거 데이터 참조 예시", overlay=true)

// 1. 전 봉 대비 현재 종가가 상승했는지 확인
isPriceUp = close > close[1]

// 2. 3봉 연속 가격 상승 조건
threeBarRally = close > close[1] and close[1] > close[2] and close[2] > close[3]

// 3. 5봉 전 고가보다 현재 종가가 높은지 확인
breakout5Bar = close > high[5]

// 매수 신호 시각화
plotshape(threeBarRally, style=shape.triangleup, location=location.belowbar, color=color.green, size=size.small)

이처럼 [] 내부에 정수를 넣어 과거의 가격 데이터나 지표 결과값을 자유롭게 가져와서 조건 비교에 활용할 수 있습니다.


3. var 키워드와 := 연산자의 환상적인 시너지

:= 연산자를 이해할 때 빠질 수 없는 것이 바로 var 키워드입니다.

기본적으로 파인스크립트의 변수는 봉이 바뀔 때마다 재초기화됩니다. 하지만 변수 앞에 var를 붙이면 "첫 번째 봉에서만 초기화하고, 이후에는 이전 봉의 값을 그대로 유지"하게 됩니다.

이 var 변수와 := 재할당 연산자를 조합하면 계좌 잔고 추적, 특정 조건 발생 횟수 카운팅, 최고가/최저가 갱신 로직 등을 손쉽게 구현할 수 있습니다.

//@version=5

indicator("누적 골든크로스 카운터", overlay=true)


// var 키워드로 변수를 최초 1회만 0으로 초기화

var int crossCount = 0


// 골든크로스 조건

goldCross = ta.crossover(ta.sma(close, 20), ta.sma(close, 60))


// 골든크로스 발생 시 카운트 1 증가 (재할당)

if goldCross

    crossCount := crossCount + 1


// 차트상에 카운트 표시

plot(crossCount, title="골든크로스 누적 횟수", color=color.yellow)


4. 실전 지표 코딩 시 주의해야 할 점

1) 존재하지 않는 미래/초기 봉 참조 (na 값 주의)

차트의 가장 첫 번째 봉(Index 0)에서는 close[1]이나 close[5]의 값이 존재하지 않아 na (Not Available)를 반환합니다. 과거 참조 연산자를 사용할 때는 차트 극초반에 na 오류가 발생하지 않도록 nz() 함수를 활용하거나 초기 봉 예외 처리를 고려해야 합니다.

2) 루프(Loop) 문 내에서의 := 연산

for 문이나 while 문을 작성할 때 반복문 외부에서 선언된 변수의 값을 루프 내부에서 계속 갱신해야 하는 경우에도 반드시 = 대신 :=를 써야 정상적으로 누적 값이 계산됩니다.


💡 요약 및 정리

파인스크립트에서 시계열 데이터를 능숙하게 제어하기 위한 두 가지 핵심 포인트를 다시 정리해 보겠습니다.

  1. 변수의 값을 변경하거나 업데이트할 때는 반드시 := 연산자를 사용한다.

  2. 과거 봉의 데이터를 불러올 때는 변수명 뒤에 [N]을 붙여 N개 전 봉의 값을 참조한다.

이 두 가지 연산자 메커니즘을 제대로 이해하면 간단한 기술적 지표 구현부터 시작하여, 복잡한 조건의 리스크 관리 및 상태 기반 시스템 매매 로직까지 막힘없이 작성할 수 있게 됩니다. 지금 바로 트레이딩뷰 파인 에디터를 열고 직접 코드를 작성해 보세요!





댓글

이 블로그의 인기 게시물

엔트로픽 상장일 전망과 관련주 총정리: 클로드(Claude) 개발사의 IPO 주식 투자 가이드

RSI와 MACD를 결합한 나만의 커스텀 다중 하단 지표 제작 완벽 가이드

[파이썬 자동매매] CCXT 웹소켓(WebSocket)으로 해외 거래소 호가창 실시간 수집 및 DataFrame 재구성