Pine 에디터에서 저장을 눌렀는데 빨간 오류가 뜨면, 오류 문구를 그대로 검색하게 됩니다.
이 글은 파인스크립트에서 자주 만나는 오류를 문구별로 모아 원인과 해결 방법을 정리했습니다. 필요한 오류만 목차에서 찾아 보세요.

오류 찾는 요령
  • 에디터 아래 콘솔의 오류에는 줄 번호가 함께 표시됩니다. 그 줄과 바로 윗줄을 먼저 확인하세요.
  • 오류가 여러 개면 첫 번째 오류부터 고칩니다. 나머지는 첫 오류 때문에 생긴 경우가 많습니다.
  • 오류 문구는 파인스크립트 버전에 따라 조금 다를 수 있습니다. 이 글은 v6 기준입니다.

1. Mismatched input … / Syntax error at input …

원인: 들여쓰기나 줄 바꿈이 잘못된 문법 오류입니다. 파인스크립트는 들여쓰기로 블록을 구분합니다.

// ✗ if 블록 들여쓰기 없음
if longCondition
strategy.entry("Long", strategy.long)

// ✓ 스페이스 4칸(또는 탭 1개)
if longCondition
    strategy.entry("Long", strategy.long)

긴 줄을 나눌 때는 다음 줄을 4의 배수가 아닌 칸만큼(예: 5칸) 들여써야 합니다. 4칸이면 새 블록으로 인식해 오류가 납니다.

// ✓ 이어지는 줄은 5칸 들여쓰기
strategy("내 전략", overlay = true,
     initial_capital = 10000)

2. Undeclared identifier ‘xxx’

원인: 선언하지 않은 변수나 함수를 사용했습니다.

  • 변수 이름의 오타, 대소문자 차이 (longCond ↔ LongCond)
  • 선언보다 먼저 사용 (파인스크립트는 위에서 아래로 읽으므로 먼저 선언해야 함)
  • 블록 안(if, 함수)에서 선언한 변수를 블록 밖에서 사용
// ✗ if 안에서 만든 변수를 밖에서 사용
if close > open
    signal = true
plotshape(signal)

// ✓ 밖에서 선언하고 안에서 := 로 바꾸기
signal = false
if close > open
    signal := true
plotshape(signal)

3. Could not find function or function reference ‘sma’

원인: v4 이하 코드를 v5·v6로 쓰면서 함수 이름을 바꾸지 않았습니다. v5부터 대부분의 함수에 네임스페이스가 붙었습니다.

v4 이하v5 · v6
study()indicator()
sma(), ema(), rsi(), crossover()ta.sma(), ta.ema(), ta.rsi(), ta.crossover()
security()request.security()
input(10, type=input.integer)input.int(10)
abs(), max(), round()math.abs(), math.max(), math.round()

Pine 에디터 메뉴의 버전 변환 기능을 쓰면 대부분 자동으로 바뀝니다. v5에서 v6로 옮길 때 달라지는 점은 v6 변경점과 v5 코드 옮기기를 참고해 주세요.

4. Cannot call ‘xxx’ with argument ’length’=‘yyy’. An argument of ‘series int’ type was used but a ‘simple int’ is expected

원인: 일부 함수의 인수는 스크립트 시작 시 정해지는 값(simple)만 받는데, 봉마다 바뀌는 값(series)을 넣었습니다.

// ✗ 봉마다 바뀌는 길이
len = close > open ? 10 : 20
ma = ta.ema(close, len)

// ✓ input 이나 상수 사용
len = input.int(20, "길이")
ma = ta.ema(close, len)

ta.sma() 등 일부 함수는 series 길이도 받습니다. 오류가 나는 함수만 input이나 상수로 바꾸면 됩니다.

5. Cannot use ‘plot’ in local scope

원인: plot(), plotshape(), bgcolor(), alertcondition() 등은 if 문이나 함수 안에서 쓸 수 없습니다. 조건을 값에 넣어 바깥에서 호출합니다.

// ✗
if showMa
    plot(ma)

// ✓ 조건이 거짓이면 na 를 그림(표시 안 됨)
plot(showMa ? ma : na)

6. Cannot modify global variable ‘xxx’ in function

원인: 함수 안에서 바깥(전역) 변수를 := 로 바꿀 수 없습니다. 함수는 값을 돌려주고, 바깥에서 대입합니다.

// ✗
var count = 0
addOne() =>
    count := count + 1

// ✓
var count = 0
count := count + 1

배열(array)이나 사용자 정의 타입(UDT) 객체는 함수 안에서 내용을 바꿀 수 있습니다.

7. Pine cannot determine the referencing length of a series. Try using max_bars_back

원인: close[n] 처럼 과거 값을 참조하는데 n 이 봉마다 달라, 트레이딩뷰가 몇 봉까지 기억해야 할지 모릅니다.

// ✓ 방법 1: 스크립트 전체에 지정
indicator("내 지표", max_bars_back = 500)

// ✓ 방법 2: 해당 변수에만 지정
max_bars_back(close, 500)

※ 값을 너무 크게 잡으면 스크립트가 느려집니다. 실제로 참조하는 최대 봉 수만큼만 지정하세요.

8. Loop takes too long to execute

원인: for / while 반복이 봉마다 너무 오래 걸립니다. (실행 시간 제한 초과)

  • 매 봉마다 과거 수백 봉을 반복하는 계산을 내장 함수로 대체합니다. 예: 최고가 반복 → ta.highest(high, len)
  • 계산이 마지막 봉에서만 필요하면 if barstate.islast 안에서 실행합니다.
  • 반복 횟수(길이 input)의 최댓값을 줄입니다.

9. Script has too many plots / 호출 개수 제한

파인스크립트에는 스크립트당 개수 제한이 있습니다. 대표적인 것은 다음과 같습니다. (정확한 한도는 트레이딩뷰 공식 문서의 Limitations 항목에서 확인해 주세요.)

항목해결 방법
plot 개수쓰지 않는 plot 을 코드에서 삭제 (display = display.none 으로 숨겨도 개수에 포함됨)
request.*() 호출 수같은 심볼·시간봉 요청은 튜플로 한 번에 가져오기
라벨·선·박스 개수max_labels_count, max_lines_count 로 늘리거나 오래된 것을 삭제

10. 전략(strategy)에서 자주 겪는 문제

  • 전략 테스터에 거래가 하나도 없음: 진입 조건이 한 번도 참이 아니거나, 주문 수량이 0입니다. plotshape(longCondition) 으로 조건이 참인 봉을 먼저 확인해 보세요. v6에서는 증거금 기본값(100%) 때문에 자산보다 큰 주문이 체결되지 않을 수도 있습니다.
  • 청산 주문이 안 됨: strategy.close(), strategy.exit() 의 이름이 strategy.entry() 의 이름과 같은지 확인합니다.
  • 얼러트 메시지가 비어 있음: 얼러트 메시지 칸에 {{strategy.order.alert_message}} 를 넣었는지, 주문 함수에 alert_message 를 넣었는지 확인합니다. → 얼러트 메시지 정리

파인스크립트가 처음이라면 파인스크립트 기초부터 읽어 보세요.