[#4] 파인스크립트 강좌 - 연산자
![[#4] 파인스크립트 강좌 - 연산자](/content/images/size/w1200/2025/07/6a7d4b5a-5fa8-4f5d-a107-657e18e98261.png)
앞서 값(데이터)을 담을 그릇을 만들었다면, 이번에는 그 값들을 어떻게 가공하고 판단할지 배우게 됩니다.
파인스크립트에서 그 역할을 담당하는 핵심 도구가 바로 연산자(Operator) 입니다.
왜 ‘연산자’부터 공부해야 할까요?
트레이딩뷰 차트 위에서 자동매매나 알림 스크립트를 작성할 때, 결국 우리는 가격·거래량·지표 값이라는 숫자를 가지고 “어떤 조건이면 매수(또는 매도)하라” 같은 논리를 만듭니다.
이 논리를 구현하려면 다음 두 가지가 필요합니다.
- 값을 계산하고 변환하는 도구
- 계산된 값을 비교하고 결합하는 도구
위 두 가지를 모두 품고 있는 것이 연산자이기 때문에, 변수·자료형을 배운 직후 연산자를 익히는 것이 가장 자연스러운 흐름입니다.
연산자의 세 가지 축
파인스크립트 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
→ 산술 (*
, /
, %
, +
, -
) → 비교 → and
→ or
- 긴 조건은 괄호로 가독성을 높이세요.
- 우선순위 실수는 흔한 버그 원인입니다. 예)
close > sma20 and rsiVal < 60 or volume > volAvg
→ 의도와 달리or
가 더 먼저 평가될 수 있으니 괄호로 묶는 습관이 필요합니다.
실전에서 자주 만나는 오류 TOP 3
- 0으로 나누기
- 분모가
0
또는na
인 상태에서/
연산 시 런타임 에러. - 해결:
nz(open, 1)
처럼nz()
로 안전 값 지정.
- 분모가
- 타입 불일치
- 문자열과 숫자를 곧장 더하기(
"Price: " + close
) → 에러. - 해결:
str.tostring(close)
등 형변환 함수 사용.
- 문자열과 숫자를 곧장 더하기(
- 시리즈·스칼라 혼용
if
문에 시리즈와 스칼라를 비교할 때 경고.- 해결: 두 값 모두 같은 타입인지 확인.
실전 로직에 적용하기
이제까지 배운 내용을 실제 매매 시나리오에 녹여 보겠습니다.
“20일 이동평균선 위에서 RSI(14) < 60이고, 거래량이 20일 평균보다 크면 매수” 같은 조건은 아래처럼 해석됩니다.
- 산술: 이동평균, RSI, 거래량 평균 계산
- 비교:
close > sma20
rsiVal < 60
volume > volAvg20
- 논리: 세 비교 결과를
and
로 연결 → 매수 조건 완성
매도 조건은 or
를 써서 여러 탈출 시나리오를 구현할 수 있겠죠.
오늘의 핵심 정리
- 연산자 3축(산술·비교·논리) 을 알면 대부분의 전략 로직을 표현할 수 있습니다.
and
는 필터,or
는 대안이라는 감각을 먼저 잡아 두세요.- 괄호·재대입(
:=
) 사용을 습관화하면 가독성과 성능이 동시에 향상됩니다.
다음 글에선 조건문과 반복문에 대해 알아보도록 하겠습니다~