Pine Script v6
작동을 확인하기 전에 검증하라
Pine은 컴파일 타임에 페이지상으로는 정상처럼 보여도 오류가 발생합니다. 확인하지 않은 스크립트를 절대 반환하지 마십시오.
validate_pine_script # MCP 도구 — 줄 번호와 함께 구조화된 오류 반환
lookup_pine_reference # MCP 도구 — 모든 v6 심볼의 실제 시그니처
MCP 서버를 사용할 수 없는 경우, 스크립트가 컴파일된다고 암시하지 말고 검증되지 않았다고 말하십시오.
파라미터 이름을 추측하지 마십시오. lookup_pine_reference가 존재하는 이유는 추측이 가장 흔한 실수이기 때문입니다: colour를 color로, shape=를 style=로, 또는 text_halign이 필요한 함수에 textalign을 사용하는 경우 등이 있습니다.
실행 모델이 모든 것을 결정한다
스크립트는 막대 하나당 한 번씩, 과거 데이터를 왼쪽에서 오른쪽으로 실행한 후, 라이브 막대의 각 틱마다 실행됩니다.
// 잘못된 코드 — 매 막대마다 초기화되므로 항상 1입니다
int count = 0
count := count + 1
// 올바른 코드 — `var`는 한 번 초기화되고 유지됩니다
var int count = 0
count := count + 1
=은 선언입니다. :=는 재할당입니다. 같은 이름에 =를 두 번 사용하면 오류입니다.
ta.* 함수는 모든 막대에서 실행되어야 합니다. 내부 상태를 유지하므로 조건문 안에서 호출하면 조용히 상태가 손상됩니다:
// 잘못된 코드 — 조건이 참일 때만 ta.sma가 진행됩니다
value = condition ? ta.sma(close, 20) : na
// 올바른 코드 — 무조건 계산한 후 선택합니다
smaValue = ta.sma(close, 20)
value = condition ? smaValue : na
오버로드된 생성자
line.new, label.new, box.new는 각각 두 가지 형식을 허용합니다. 둘 다 유효합니다:
line.new(x1=bar_index[1], y1=low[1], x2=bar_index, y2=high) // 좌표
line.new(first_point=chart.point.now(low), second_point=chart.point.now(high))
label.new(x=bar_index, y=high, text="hi") // 좌표
label.new(point=chart.point.now(high), text="hi")
box.new(left=bar_index[5], top=high, right=bar_index, bottom=low) // 좌표
box.new(top_left=p1, bottom_right=p2)
파라미터 이름은 함수마다 다르며 혼동하기 쉽습니다: label.new는 textalign을 사용하고, box.new와 table.cell은 text_halign/text_valign을 사용합니다.
리페인팅 방지
// 리페인트됨 — 현재 상위 시간대 막대가 아직 형성 중입니다
d = request.security(syminfo.tickerid, "D", close)
// 안정적 — 이전, 닫힌 막대를 사용합니다
d = request.security(syminfo.tickerid, "D", close[1], lookahead=barmerge.lookahead_off)
호출 결과를 변수에 캐시하고, 인라인으로 반복하지 마십시오. 보안(security)에서 파생된 값의 나눗셈은 nz()로 보호하십시오.
플랫폼 제한
| 제한 | 값 |
|---|---|
plot() 호출 | 64 |
request.*() 호출 | 40 |
| 스크립트 크기 | 80,000 토큰 |
| 루프 시간 | 500 ms |
| 그리기 객체 | 각 line/label/box당 500개 (max_*_count로 증가 가능) |
2025년 이후 추가된 API — 자주 놓침
| 기능 | 출시일 |
|---|---|
box.set_xloc() | 2025년 3월 |
active on every input.*() | 2025년 7월 |
timeframe_bars_back on time() / time_close() | 2025년 10월 |
syminfo.isin | 2025년 11월 |
request.footprint(), footprint / volume_row 타입 | 2026년 1월 |
sort_field on array.sort() / matrix.sort() | 2026년 4월 |
여러 줄 문자열 """…""" | 2026년 4월 |
calc_on_every_history_tick on strategy() | 2026년 7월 |
규칙도 제거되었습니다: TradingView는 2025년 12월에 줄바꿈된 줄의 들여쓰기 제한을 해제했으므로, 연속 줄이 공백 4칸으로 들여쓰기되거나 전혀 들여쓰기되지 않아도 허용됩니다. 심볼이 유효하지 않다고 주장하기 전에 릴리스 노트를 확인하십시오.
스크립트 구조
//@version=6
indicator("Title", overlay=true) // 또는 strategy(...)
// imports -> types -> constants -> inputs -> functions
// -> calculations -> orders -> plots -> alerts
일반적인 컴파일 오류
| 메시지 | 원인 |
|---|---|
end of line without line continuation | 연산자 뒤의 후행 공백, 또는 깨진 줄바꿈 표현식 |
Undeclared identifier | if 내부에서만 할당된 변수; var 또는 기본값으로 미리 선언 |
Cannot call 'ta.sma' with 'series' where simple required | length 인수는 simple int여야 함 — 입력값은 simple, 시리즈 값은 아님 |
Mismatched input ... expecting | :=가 필요한 곳에 =를 사용한 재할당 |