[#3] 파인스크립트 강좌 - 변수와 자료형

[#3] 파인스크립트 강좌 - 변수와 자료형

안녕하세요! 이번 글에선 가장 기초라고 할 수 있는 변수와 자료형에 대해 알아보도록 하겠습니다.

변수란 무엇인가요? — “값을 담는 상자”

  • 변수(variable) = “필요한 값을 잠시 보관했다가 꺼내 쓰는 상자”
  • 주가·거래량처럼 시계가 흐르며 계속 변하는 숫자도,
    ‘매수 신호인가?’ 같은 참/거짓,
    ‘알림 메시지’ 같은 글자도 모두 변수에 담아 둡니다.

변수 이름 짓기 — 상자에 라벨 붙이기

추천 비추천 이유
todayClose tc 글자만 봐도 ‘오늘 종가’임을 알 수 있어요.
isBullish flag1 목적이 분명해야 나중에 찾기 쉽습니다.
팁: 띄어쓰기 대신 대문자(camelCase)나 밑줄(snake_case)을 씁니다.
한글도 기술적으로 가능하지만, 해외 사용자와 코드 공유 시 깨질 수 있어 영어를 권장합니다.

값의 종류(자료형)

자료형 일상 속 예 파인스크립트에서 주로 쓰는 값
숫자(정수) int 사람 수 “3명” 봉 개수, 카운터
숫자(실수) float 체중계 65.3 kg 가격, 이동평균
참/거짓 bool 전구 스위치 ON/OFF 조건 만족 여부
글자 string 포스트잇 문장 알림 메시지
색깔 color 형광펜 컬러 상승·하락 표시
목록 array 10칸 달걀 판 최근 N개의 값 묶음

변수 선언 방식 3가지 + 기초 코드 예시

1. 암시적(자동) 선언 — 빠르지만 오타 주의!

//@version=5
indicator("암시적 선언", overlay=true)

// 값 저장 상자를 따로 선언하지 않고 바로 대입
price    = close               // 실수(float) 시계열
isUpBar  = close > open        // 참/거짓(bool)
plot(price, color=isUpBar ? color.lime : color.red)
  • 대입(=)과 함께 자동으로 상자가 만들어집니다.
  • 오타(prcie)를 내면 새로운 변수로 인식하니 코드를 잘못 이해할 위험이 있습니다.

2. 명시적 선언 — 팀 작업·대형 스크립트에 필수

//@version=5
indicator("명시적 선언", overlay=true)

// 자료형 + 이름 = 값
float todayClose = close
bool  isUpBar    = close > open
int   count20    = 20

plot(todayClose, title="종가")
  • float todayClose처럼 자료형을 앞에 써서
    “저 상자 안에는 실수가 들어 있다”는 걸 확실히 합니다.
  • 유지보수와 협업 시 가독성이 훨씬 좋아집니다.

3. var 고정 변수 — 한 번만 초기화하고 평생 기억

//@version=5
indicator("var 변수", overlay=false)

// 첫 캔들에서만 값을 넣고, 이후로는 유지
var float highestClose = na    // 아직 모르면 na(비어 있음)

if na(highestClose) or close > highestClose
    highestClose := close      // := 는 상자 내용 바꾸기

plot(highestClose, color=color.orange, title="역대 최고 종가")
  • var첫 번째 봉에서 딱 한 번 실행됩니다.
  • 백테스트 기간이 길어져도 최고값이 초기화되지 않아 효율적입니다.

“값을 꺼내 쓰는” 3가지 패턴 예제

1. 오늘 종가가 어제 종가보다 높을 때 색상 바꾸기

//@version=5
indicator("전일 대비 상승", overlay=true)

// 어제 종가 = close[1]  ← 과거 값은 대괄호 [1], [2] …
bool isUpFromYesterday = close > close[1]

barcolor(isUpFromYesterday ? color.new(color.green, 0)
                           : color.new(color.red,   0))
  • close[1]은 “하나 전 봉” 종가입니다.

2. 최근 5봉 평균 가격 계산하기

//@version=5
indicator("최근 5봉 평균", overlay=true)

float avg5 = ta.sma(close, 5)   // Simple Moving Average(단순 평균)
plot(avg5, color=color.yellow, title="5봉 평균")
  • 내장 함수 ta.sma()를 쓰면 “5개 값 합 ÷ 5”를 자동으로 해줍니다.
  • ta 접두사는 “Technical Analysis(기술적 분석)” 함수 모음을 뜻합니다.

3. 상승 신호 발생 횟수 세기

//@version=5
indicator("신호 카운터", overlay=false)

float sma20   = ta.sma(close, 20)
bool  buyCond = ta.crossover(close, sma20)

// 신호가 나올 때마다 1씩 증가 (var 로 고정)
var int buyCount = 0
if buyCond
    buyCount += 1

label.new(bar_index, high, text="총 신호: " + str.tostring(buyCount))
  • var int buyCount = 0 → 첫 봉에 0 저장, 이후 카운터 역할
  • str.tostring()으로 숫자를 문자로 바꿔 라벨에 표시합니다.

초보자가 가장 많이 묻는 “에러·궁금증 TOP 3”

상황 쉬운 해결책
Cannot use 'series float' in 'if' condition 값이 비어 있으면(na) 참/거짓을 판단 불가. if not na(price)로 먼저 확인
Index can't be negative close[-1] 처럼 음수는 불가. 0 이상 인덱스만 사용하세요.
변수 이름에 한글 썼더니 깨져요 에디터·브라우저마다 인코딩 이슈가 있으니 영어로 바꾸면 해결됩니다.

핵심 5줄 요약

  1. 변수 = 값 보관 상자 (우편함처럼 꺼내 쓰기)
  2. 상자에 라벨(이름) 을 붙여야 헷갈리지 않음
  3. 숫자·글자·참/거짓 등 값 종류(자료형) 에 맞는 상자를 선택
  4. var 를 쓰면 한 번만 값 넣고 평생 유지할 수 있음
  5. 직접 작은 코드를 타이핑해 보며 “상자 안 값이 바뀌는 순간”을 눈으로 확인해 보세요!

다음 강의 예고

다음 글에서는 연산자와 조건문을 배웁니다.
오늘 만든 변수들을 더하고, 빼고, 비교해서
“3일 연속 상승” 같은 매매 조건을 완성하는 방법을 다룰 예정입니다.
쉽고 재미있는 예제도 많이 준비했으니 기대해 주세요!