[#4] 파인스크립트 강좌 - 연산자

[#4] 파인스크립트 강좌 - 연산자

앞서 값(데이터)을 담을 그릇을 만들었다면, 이번에는 그 값들을 어떻게 가공하고 판단할지 배우게 됩니다.
파인스크립트에서 그 역할을 담당하는 핵심 도구가 바로 연산자(Operator) 입니다.

왜 ‘연산자’부터 공부해야 할까요?

트레이딩뷰 차트 위에서 자동매매나 알림 스크립트를 작성할 때, 결국 우리는 가격·거래량·지표 값이라는 숫자를 가지고 “어떤 조건이면 매수(또는 매도)하라” 같은 논리를 만듭니다.
이 논리를 구현하려면 다음 두 가지가 필요합니다.

  1. 을 계산하고 변환하는 도구
  2. 계산된 값을 비교하고 결합하는 도구

위 두 가지를 모두 품고 있는 것이 연산자이기 때문에, 변수·자료형을 배운 직후 연산자를 익히는 것이 가장 자연스러운 흐름입니다.

연산자의 세 가지 축

파인스크립트 v5 기준으로 실제 코드에서 가장 많이 쓰는 연산자는 아래 세 분류로 나뉩니다.

범주 대표 기호 주된 역할 반환형
산술 + - * / % 값 계산 및 문자열 연결 숫자 또는 문자열
비교 < > <= >= == != 두 값을 비교 bool (참·거짓)
논리 not and or 여러 조건 결합 bool

이 세 축을 자유자재로 조합하면 시그널 필터링·다중 조건 매매·경보 로직을 손쉽게 만들 수 있습니다.

산술 연산자 ― 숫자와 문자열을 다루는 기본기

산술 연산자는 이름 그대로 숫자를 산술하는 도구입니다. 특히 파인스크립트에서는 +문자열 연결까지 겸하기 때문에 활용 빈도가 높습니다.

기호 의미 실전 활용 예시
+ 더하기·문자열 연결 종가 close에서 이동평균 ma 값을 더해 변동 폭 계산
"RSI = " + str.tostring(rsi(close,14))
- 빼기·부호 전환 일중 고가·저가 차이 계산 (high - low)
* 곱하기 거래량에 가격 곱해 거래 대금 추정
/ 나누기 변동률(%) 구하기 – (close - open) / open * 100
% 나머지(모듈로) 봉 인덱스 홀·짝 구분 — bar_index % 2
Tip
+를 이용한 문자열 연결은 디버깅 메시지를 차트에 띄울 때 유용합니다. 예를 들어 라벨(label)로 현재 RSI 값을 보여주고 싶다면 label.new(text = "RSI : " + str.tostring(rsiVal))처럼 쓰면 됩니다.

비교 연산자 ― 조건문의 심장

가격이 특정 라인 위인지, RSI가 기준선 이상인지 등을 판단할 때 쓰이는 기호입니다.
연산 결과는 참(true) 또는 거짓(false) 두 값만 가지므로, 이후 if 문이나 strategy.entry() 등에서 바로 활용할 수 있습니다.

기호 읽는 법 예시 설명
< 미만 close < sma20 → 종가가 20일선 아래면 참
> 초과 volume > volAvg → 거래량이 평균보다 많으면 참
<= 이하 rsiVal <= 30 → RSI가 30 이하(과매도)면 참
>= 이상 rsiVal >= 70 → RSI가 70 이상(과매수)면 참
== 같다 year == 2025
!= 같지 않다 market != "KOSPI"
주의 사항부동소수 비교(예: 1.0000001 == 1.0) 는 미세한 오차 때문에 예기치 못한 결과를 낳을 수 있습니다. 필요한 경우 round()abs(x - y) < 0.0001과 같은 방식으로 오차 범위를 고려해 주세요.문자열 비교 시 대소문자를 엄격하게 구분합니다. "BTC""btc"는 다릅니다.

논리 연산자 ― 조건 결합의 마법

현실 매매 로직은 “A 이고(and) B 이며 C”처럼 복합 조건으로 이루어집니다. 논리 연산자는 이런 복합 논리를 간결하게 만들어 줍니다.

키워드 의미 실전 활용 예
not 부정 not na(close) → 종가가 na(결측값)가 아니면
and 두 조건 모두 참 close > sma20 and rsiVal < 60
or 둘 중 하나만 참 close < sma20 or rsiVal >= 70
  • and필터 역할: 조건을 좁혀 신호 품질을 높입니다.
  • or대안 조건: 여러 탈출(Exit) 시나리오를 허용할 때 쓰입니다.

조건부(삼항) 연산자 ? :

파인스크립트에서도 C 계열 언어처럼 한 줄로 if–else를 처리할 수 있습니다.

변수 = (조건) ? 참일 때 값 : 거짓일 때 값

예)
barColor = close >= open ? color.green : color.red
위처럼 양자택일을 간결하게 작성하되, 조건이 길어지면 가독성이 떨어지므로 일반 if 블록을 권장합니다.

7. 대입(=)과 재대입(:=)의 차이

파인스크립트는 시리즈(series) 변수가 기본값이므로, “선언 → 값 변경” 개념이 명확해야 합니다.

구문 용도 핵심 포인트
variable = value 변수 최초 선언 해당 라인에서 한 번만 실행
variable := value 이미 존재하는 변수에 값 재할당 매 봉마다 새로운 값을 저장

예)

var float highest = na      // 최초 선언
highest := math.max(nz(highest), close)   // 매 봉 최고가 갱신

연산 우선순위 & 괄호 활용

우선순위(높음 → 낮음):
not산술 (*, /, %, +, -) → 비교andor

  • 긴 조건은 괄호로 가독성을 높이세요.
  • 우선순위 실수는 흔한 버그 원인입니다. 예)
    close > sma20 and rsiVal < 60 or volume > volAvg
    → 의도와 달리 or가 더 먼저 평가될 수 있으니 괄호로 묶는 습관이 필요합니다.

실전에서 자주 만나는 오류 TOP 3

  1. 0으로 나누기
    • 분모가 0 또는 na인 상태에서 / 연산 시 런타임 에러.
    • 해결: nz(open, 1)처럼 nz()로 안전 값 지정.
  2. 타입 불일치
    • 문자열과 숫자를 곧장 더하기("Price: " + close) → 에러.
    • 해결: str.tostring(close) 등 형변환 함수 사용.
  3. 시리즈·스칼라 혼용
    • if 문에 시리즈스칼라를 비교할 때 경고.
    • 해결: 두 값 모두 같은 타입인지 확인.

실전 로직에 적용하기

이제까지 배운 내용을 실제 매매 시나리오에 녹여 보겠습니다.
20일 이동평균선 위에서 RSI(14) < 60이고, 거래량이 20일 평균보다 크면 매수” 같은 조건은 아래처럼 해석됩니다.

  1. 산술: 이동평균, RSI, 거래량 평균 계산
  2. 비교:
    • close > sma20
    • rsiVal < 60
    • volume > volAvg20
  3. 논리: 세 비교 결과를 and로 연결 → 매수 조건 완성

매도 조건은 or를 써서 여러 탈출 시나리오를 구현할 수 있겠죠.

오늘의 핵심 정리

  • 연산자 3축(산술·비교·논리) 을 알면 대부분의 전략 로직을 표현할 수 있습니다.
  • and필터, or대안이라는 감각을 먼저 잡아 두세요.
  • 괄호·재대입(:=) 사용을 습관화하면 가독성과 성능이 동시에 향상됩니다.

다음 글에선 조건문과 반복문에 대해 알아보도록 하겠습니다~