
제가 어제 새벽까지 꼬박 두 시간을 헤매게 만들었던 'Undeclared identifier' 오류의
실체와 해결법을 생생한 경험담과 함께 전해드립니다.
트레이딩뷰에서 자동 매매 전략을 짤 때 가장 기운 빠지는 순간이 언제일까요?
밤늦게 서재에 앉아 야심 차게 코드를 수정하고 [저장] 버튼을 눌렀는데,
하단 콘솔 창에 빨간색 에러 메시지가 뜰 때입니다.
특히 저처럼 50대에 새로운 도전을 시작하며 파인 스크립트(Pine Script)를 독학하는 분들이라면,
그 당혹감은 더 클 수밖에 없습니다.
1. 버전 차이에서 오는 비극: @version=5를 확인하라
어제 제가 겪은 일입니다.
몇 년 전 기록된 어느 유명 블로그의 예제 코드를 보고 그대로 복사해 붙여넣었는데,
도무지 실행이 안 되더군요. 원인은 바로 파인 스크립트의 버전 업그레이드 때문이었습니다.
v4까지는 아무 문제 없던 코드가 v5에서는 '모르는 단어' 취급을 받게 된 것이죠.
- 나의 시행착오: "왜 sma 함수를 인식 못 하지?" 한참을 고민했는데,
알고 보니 v5에서는 모든 지표 함수 앞에 ta.(Technical Analysis)라는 성을 붙여줘야 했습니다. - 해결 방법: 스크립트 맨 윗줄이 //@version=5라면, 예전 방식인 sma(close, 14)가 아니라
ta.sma(close, 14)라고 써야 합니다. 이 짧은 ta. 하나를 몰라 눈이 침침해질 때까지
모니터를 뚫어지게 쳐다봤던 생각을 하니 허탈하면서도 웃음이 나더군요.
2. 콜론 하나에 무너진 한 시간: '='와 ':='의 차이
코딩을 처음 접하면 가장 헷갈리는 게 '같다'는 의미의 기호들입니다.
파인 스크립트에서는 처음에 변수를 선언할 때는 =를 쓰고,
이미 만든 변수의 값을 나중에 업데이트할 때는 반드시 :=를 써야 합니다.
저는 전략의 조건을 수정하면서 기존에 선언했던 target_price 변수를 다시 계산하려고 했는데,
계속해서 "Undeclared identifier" 오류가 떴습니다.
- 직접 깨달은 팁: "이미 정해진 값을 바꿀 때는 **콜론(:)**을 꼭 붙여라!"
- 수정 전: target_price = high * 1.05 (에러 발생)
- 수정 후: target_price := high * 1.05 (해결!) 이 콜론 하나를 빼먹었다고 한 시간 넘게
코드를 다 갈아엎을 뻔했으니, 여러분은 저와 같은 실수를 반복하지 마시길 바랍니다.
3. 변수 스코프(Scope): 갇힌 변수를 구출하라
파인 스크립트도 나름의 논리가 엄격합니다.
if 문이나 for 문 같은 울타리 안에서 태어난 변수는 그 울타리 밖으로 나오면 존재하지 않는 것이 됩니다.
저는 골든크로스가 발생했을 때의 가격을 기억해 두었다가 나중에 쓰려고 if 문 안에 변수를 만들었는데,
정작 매도 신호를 보낼 때 그 변수를 못 찾더군요.
- 해결 방법: 울타리 밖에서 미리 변수를 만들어 두세요.
- var float buy_price = 0.0 처럼 미리 신고를 해두고,
- if 문 안에서는 buy_price := close 처럼 값만 업데이트해주면 됩니다.
이렇게 하니 마법처럼 에러가 사라지고 차트에 파란색 매수 화살표가 예쁘게 찍히기 시작했습니다.
4. 대소문자와 오타, 가장 단순하지만 치명적인 원인
때로는 가장 복잡한 곳이 아니라 가장 단순한 곳에 정답이 있더군요.
Close라고 대문자로 썼는지, close라고 소문자로 썼는지에 따라
컴퓨터는 아예 다른 세상의 언어로 받아들입니다.
특히 돋보기를 쓰고 코드를 보다 보면 쉼표(,)와 마침표(.)가 헷갈려 오타를 내기도 합니다.
저는 이제 트레이딩뷰 에디터의 자동 완성 기능을 전적으로 믿기로 했습니다.
직접 치기보다 에디터가 추천해 주는 단어를 클릭하는 습관을 들이니 오타로 인한 오류가 눈에 띄게 줄었습니다.
마치며: 정답 농장(Answer Farm)은 멈추지 않습니다
에러 메시지의 빨간 글씨는 우리를 괴롭히려고 나타나는 것이 아닙니다.
"여기가 조금 어색하니 수정해 줘"라고 보내는 친절한(?) 신호일 뿐이죠.
저 같은 50대 초보도 하나하나 해결해 나가고 있으니, 여러분도 절대 포기하지 마세요.
앤스워팜은 단순히 이론만 나열하는 곳이 아니라, 제가 직접 부딪히고 깨지며 얻어낸
'진짜 정답'을 나누는 농장이 되겠습니다. 코딩하다 막히는 부분이 있다면
언제든 댓글로 코드를 남겨주세요. 제가 아는 선에서 함께 고민하고 답변해 드리겠습니다.