Community라이팅 & 에디팅github.com

jpantsjoha/pinescript-plugin

Pine Script v6 스킬 및 코딩 에이전트용 MCP 도구 — 실제 검증기(validator) 기반, 글로 설명하는 방식이 아닙니다.

pinescript-plugin란 무엇인가요?

이 스킬은 Pine Script v6를 사용하는 AI 코딩 에이전트(예: Claude Code, Cursor)가 실제 검증 가능한 MCP 도구를 활용해 스크립트를 작성하고 확인할 수 있도록 지원합니다. Pine Script는 컴파일 타임에 페이지 상으로는 정상처럼 보여도 오류가 발생하는 경우가 많으므로, `validate_pine_script`와 `lookup_pine_reference` 같은 실용적인 도구를 통해 파라미터 이름 추측이나 잘못된 문법을 방지할 수 있습니다. 또한, 에이전트가 흔히 저지르는 실수(예: `var` 키워드 누락, 조건문 내 `ta.*` 함수 사용, repainting 코드 등)를 명확히 지적하고, 올바른 코드 패턴과 최신 API 변경 사항(2025-2026년)을 문서화하여 안정적이고 예측 가능한 Pine Script v6 코드를 생성하도록 돕습니다.

지원 대상~Claude Code~Codex CLI~Cursor
npx skills add jpantsjoha/pinescript-plugin

Installed? Explore more 라이팅 & 에디팅 skills: steipete/notion, langchain-ai/langchain, bytedance/podcast-generation · View all 6 →

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

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.isin2025년 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 identifierif 내부에서만 할당된 변수; var 또는 기본값으로 미리 선언
Cannot call 'ta.sma' with 'series' where simple requiredlength 인수는 simple int여야 함 — 입력값은 simple, 시리즈 값은 아님
Mismatched input ... expecting:=가 필요한 곳에 =를 사용한 재할당

참고 자료

관련 스킬