안녕하세요, 파인스크립트 무작정 따라하기 수업에 오신 것을 환영합니다! Pine Script는 TradingView에서 개발한 프로그래밍 언어로, 파이낸셜 차트에 사용할 수 있는 커스텀 기술적 지표와 거래 전략을 만들 때 사용됩니다. 이는 트레이더가 데이터를 새로운 방식으로 분석하고 시각화할 수 있는 강력한 도구입니다.
이 시리즈에서는 파인 스크립트의 기초부터 지표와 전략을 만드는 과정까지 알아볼 것입니다. 이 포스팅을 찾으신 분들이라면 아마도 자신만의 지표나 전략을 만들기 위해 찾아주신 분들일 텐데요. 아주 기초적이면서도 필수적인 부분을 위주로 파인 스크립트를 알아보도록 하겠습니다.
얼마 전 파인 스크립트 v5가 릴리즈되었습니다. 이 포스팅은 가장 최신 버전인 v5를 기준으로 설명드립니다. 이 게시물을 모두 읽으면 파인 스크립트를 이해하게 되실 겁니다. 파인 스크립트의 지식이 필요하다면 모두 읽어주세요. 이제 아래에서 전부 알려드리겠습니다.
Contents
파인 스크립트란 무엇인가?
파인 스크립트는 트레이딩뷰에서 지표를 제작하고 트레이딩 전략을 만들어 백테스팅하기 위해 만들어진 프로그래밍 언어입니다. 파인 스크립트는 굉장히 가볍게 설계되었으며 다른 프로그래밍 언어와 비교하여 같은 기능의 지표 제작 시 코드 라인 수가 적어진다는 장점이 있습니다.
파인 스크립트는 어떤 특정한 언어에 기반한 것은 아니지만 대중적인 프로그래밍 언어 중 하나인 파이썬을 사용 중이거나 공부하신 적이 있다면 파인 스크립트도 금방 습득하실 수 있습니다. 파인 스크립트는 트레이딩뷰 내의 Pine 에디터에서 만들 수 있습니다.
파인 스크립트를 사용해야 하는 이유는?
- 맞춤형 설정: 파인 스크립트를 사용하면 트레이더가 특정 거래 요구에 맞는 사용자 정의 기술 지표 및 자동화된 거래 전략을 만들 수 있습니다. 이는 시장에 대한 독특한 접근 방식을 가지고 있거나 새로운 아이디어를 시험하고자 하는 트레이더에게 유용할 수 있습니다.
- 사전 내장 데이터: 트레이딩뷰에서는 한 줄의 코드만으로도 바로 액세스할 수 있는 수많은 데이터를 바로 쉽게 이용이 가능합니다.
- 커뮤니티 지원: 파인 스크립트를 사용하고 자신의 코드와 아이디어를 다른 사람들과 공유하는 크고 활발한 거래자 커뮤니티가 있습니다. 이것은 파인 스크립트를 막 시작하는 트레이더에게 좋은 자원이 될 수 있습니다.
- 쉬운 구문: 파인 스크립트 구문은 다른 프로그래밍 언어보다 읽기 쉽고 간단합니다.
- 다양한 소스 및 라이브러리: 트레이딩뷰에서는 자신만의 지표와 전략을 라이브러리에 게시할 수 있습니다. 따라서 다른 사용자들이 게시한 10만 개 이상의 소스에 접근할 수 있고, 여러분이 개발하려는 지표가 있다면 먼저 검색을 해 보세요. 이미 다른 누군가가 유사한 코드를 작성해 공개해 두었을 가능성이 있습니다.
파인 스크립트 시작하기
파인 스크립트를 시작하는 방법은 간단합니다. 어떠한 애플리케이션을 다운로드하거나 설치할 필요 없이 트레이딩뷰 사이트에서 바로 작성이 가능합니다.

먼저 트레이딩뷰 웹사이트로 이동하세요. 계정이 없는 경우 회원 가입을 눌러 무료로 회원 가입을 마친 후 하단의 Pine 에디터를 클릭합니다.
Pine 에디터 둘러보기
Pine 에디터가 바로 우리가 코드를 작성할 공간입니다. 시작하려면 화면 맨 아래에 있는 Pine 에디터를 클릭합니다.

클릭하면 아래와 같은 화면이 표시됩니다.

파인 스크립트에서는 지표 또는 전략을 작성하게 됩니다. 이 둘의 차이점에 대해서는 뒤에서 다시 설명하겠습니다.
위 화면에 보이는 것이 지표를 작성하는 기본 시작 스크립트입니다.
그럼 한 줄씩 살펴보겠습니다.
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
첫 번째 줄은 단순한 주석입니다. 파인 스크립트의 주석은 두 개의 슬래시로 시작합니다.
// © romanticnostalgia
두 번째 줄도 주석이며, 여러분의 트레이딩뷰 사용자 이름이 자동으로 입력됩니다.
//@version=5
네 번째 줄은 컴파일러에게 우리가 어떤 버전의 파인 스크립트를 사용할지 알려주는 것입니다. 첫 번째와 두 번째 줄은 생략이 가능하나 네 번째 줄은 꼭 들어가야 합니다.
indicator("내 스크립트")
다섯 번째 줄은 선언입니다. 여기에서 지표를 만들지 전략을 만들지 여부를 지정할 수 있습니다. indicator는 지표를 만들겠다는 선언입니다. 괄호 안의 따옴표는 지표의 이름을 지정해 줍니다.
plot(close)
여섯 번째 줄은 출력 명령입니다. plot이란 이름에서 알 수 있듯이 트레이딩뷰에서 특정 변수를 출력(plot)하도록 지시합니다.
이 경우 변수 close
를 출력합니다. 이는 가장 최근 캔들의 종가를 포함하는 내장 변수입니다.
Pine 에디터 오른쪽 상단에서 차트에 넣기를 클릭합니다.

차트에 넣기를 하면 기본 차트의 종가를 표시하는 라인이 포함된 새 창이 차트 아래에 뜨게 됩니다.

이 창을 데이터 창이라고 합니다. 위의 이미지에서는 파란색으로 그려진 라인 차트입니다.
이더리움 가격 가져오기
위의 첫 번째 예는 단순히 종가를 표시합니다. 어떤 차트를 열든 자동으로 해당 차트의 종가를 표시합니다.
이 경우 이더리움 1날 봉 차트를 열어서 그에 해당하는 종가가 라인으로 표시되었습니다.
그러면 열려 있는 차트가 아닌 다른 주식이나 코인의 데이터를 가져오려면 어떻게 해야 할까요? 이더리움 차트를 열지 않고도 이더리움 가격을 가져오는 예를 들어보겠습니다.
모든 스크립트는 컴파일러 지시문을 설정하는 라인과 해당 스크립트가 지표인지 전략인지 지정하는 것에서 시작합니다.
//@version=5
indicator("이더리움 가격")
이 경우, 우리는 지표를 지정합니다. 지표의 이름은 “이더리움 가격”입니다.
다음으로, 우리는 파인 스크립트에게 현재 차트에 표시된 것이 아닌 다른 코인의 가격을 알고 싶다고 알려줘야 합니다.
이를 위해 request.security() 함수를 사용합니다.
request.security()
파인 스크립트의 좋은 점은 잘 모르는 구문을 사용할 경우 항상 도움말을 쉽게 참고할 수 있다는 것입니다.
예를 들어, 위의 함수 위로 마우스 커서를 갖다 대면 아래처럼 간단한 설명이 표시됩니다.

자세한 내용을 보려면 도움말 창을 실행합니다. PC에서는 Ctrl + 클릭, Mac에서는 cmd + 클릭을 하면 도움말 창이 실행됩니다.

도움말 기능은 구문에 대한 자세한 내용과 함께 예시를 함께 표시합니다.
request.security("ETHKRW", "D", close)
함수의 첫 번째 값은 이더리움(원화) 티커 기호입니다. 그리고 시간은 일봉으로 정했습니다. 그리고 마지막으로 종가를 보여달라고 지정했습니다.
그리고 함수의 반환값을 변수에 저장할 수 있습니다.
eth_price = request.security("ETHKRW", "D", close)
이제 eth_price
변수에는 이더리움(원화)의 일봉 종가가 포함됩니다.
파인 스크립트에서 생성된 지표는 적어도 하나의 출력이 있어야 하며 그렇지 않으면 스크립트에서 컴파일러 오류가 생성됩니다.
다음과 같이 플롯 명령을 이용해 차트에 출력하도록 합니다.
plot(eth_price)
차트에 넣기를 누르면 아래와 같이 화면에 표시됩니다.

메인 창에는 비트코인 1날 봉이 표시되면서 데이터 창에는 이더리움 일일 종가가 표시되고 있습니다.
전체 코드:
//@version=5
indicator("이더리움 가격")
// 이더리움 가격 가져오기
eth_price = request.security("ETHKRW", "D", close)
plot(eth_price)
이더리움의 20 EMA 가져오기
이제 이더리움의 가격을 가져오는 방법을 배웠으니 지수이동평균선을 가져오는 방법을 알아보겠습니다.
이와 동일한 프로세스를 이용하여 어떠한 지표에도 적용할 수 있습니다.
기본 선언부터 시작해서 마지막 예에서 만들었던 request.security 함수를 활용하겠습니다.
//@version=5
indicator("이더리움 20 EMA 가져오기")
// 이더리움 가격 가져오기
eth_price = request.security("ETHKRW", "D", close) // 일일
꼭 이더리움의 20 EMA를 가져오려는 것이 아닌 경우 eth_price
대신 내장 변수인 close
를 사용하면 현재 메인 차트 창에 표시된 종목의 종가가 표시됩니다.
파인 스크립트에서는 내장된 EMA 지표 함수를 불러올 수 있습니다. 다음과 같이 입력합니다.
ta.ema(eth_price, 20)
지표의 첫 번째 매개변수는 가격입니다. 우리는 eth_price
에 저장된 이더리움 가격을 사용합니다.
두 번째 매개변수는 EMA의 길이입니다. 여기서는 20주기 EMA를 지정합니다.
마지막으로 EMA 데이터를 별도의 변수에 할당하고 출력합니다.
eth_ema = ta.ema(eth_price, 20)
이제 이더리움의 지수이동평균선이 데이터 창에 표시됩니다.

이동평균선은 일반적으로 메인 차트에 표시됩니다. 코드를 아래와 같이 수정해 줍시다.
indicator("이더리움 20 EMA 가져오기", overlay=true)
지표 선언문에 overlay=true
를 추가해 줌으로써 메인 차트 창에 직접 데이터를 출력할 수 있습니다.

전체 코드:
//@version=5
indicator("이더리움 20 EMA 가져오기", overlay=true)
// 이더리움 가격 가져오기
eth_price = request.security("ETHKRW", "D", close) // 일일
// 이더리움 20 EMA 계산
eth_ema = ta.ema(eth_price, 20)
plot(eth_ema)
이동평균선 교차 전략을 백테스팅하는 방법
지금까지 지표에 대해 알아보았습니다. 이제부터는 파인 스크립트의 전략을 살펴보겠습니다.
지표와 전략의 가장 큰 차이점 중 하나는 지표와는 다르게 전략에서는 백테스팅이 가능하다는 것입니다.
다음 예에서는 몇 가지 추가 매개변수를 사용하여 이동평균선 크로스 전략을 만들 것입니다. 그리고 나서 트레이딩뷰에서 해당 전략을 백테스팅해 보겠습니다.
//@version=5
strategy("EMA 교차 전략", overlay=true)
전략을 만들기 위해 indicator 선언문을 strategy 선언문으로 바꿨습니다.
// 지표 생성
shortEMA = ta.ema(close, 50)
longEMA = ta.ema(close,200)
먼저 빠른 이평선과 느린 이평선을 만들어 변수에 각각 데이터를 할당해 줍니다.
rsi = ta.rsi(close, 14)
또한 RSI 지표를 만들어 포지션 진입과 청산 시점을 확인할 것입니다.
이 전략은 메인 차트에서 바로 실행할 것이므로 request.security() 함수는 필요하지 않습니다.
다음으로 교차 조건을 명시해야 합니다. 다행히 트레이딩뷰에는 이미 이 기능이 내장되어 있어 수동으로 코딩할 필요가 없습니다.
// 교차 조건 설정
longCondition = ta.crossover(shortEMA, longEMA)
shortCondition = ta.crossunder(shortEMA, longEMA)
여기에 두 가지 교차 조건을 설정했습니다.
첫 번째 조건은 빠른 EMA(50주기)가 느린 EMA(200주기)를 상향 돌파할 때 입니다(ta.crossover 함수 사용).
두 번째 조건은 빠른 EMA(50주기)가 느린 EMA(200주기)를 하향 돌파할 때 입니다(ta.crossunder 함수 사용).
위 두 조건 모두 변수에 저장합니다. 따라서 상향 돌파 또는 하향 돌파가 발생할 때 해당하는 변수에 부울 값으로 True가 반환됩니다.
if 문을 사용하여 조건의 반환값이 True로 변경되었는지 확인한 후, True인 경우 트레이드를 실행하게 됩니다.
if (longCondition)
strategy.entry("Long", strategy.long, 10, when = rsi > 50)
내장 함수인 strategy.entry
는 포지션 진입에 사용됩니다. 이 함수에 전달되는 매개변수는 다음과 같습니다.
- “long” – 트레이드 주문 ID입니다. 이 주문 ID로 주문을 취소하거나 수정할 수 있습니다. 우리 예제에서는 주문 ID를 특별히 지정할 필요가 없어서 long으로만 지정했습니다.
- strategy.long – 롱(매수) 포지션에 진입하겠다는 것을 파인 스크립트에 알려주는 내장 함수입니다.
- 10 – 거래할 종목 수량입니다.
- when = rsi > 50 – 파인 스크립트에 RSI가 50보다 높을 경우에만 트레이드를 실행하라고 지시하는 추가 매개변수입니다.
숏(매도) 포지션 진입의 경우의 구문은 위의 구문을 반대로 해주면 됩니다.
if (shortCondition)
strategy.entry("Short", strategy.short, 10, when = rsi < 50)
이번 예제는 전략이기 때문에 지표와 다르게 아무 것도 출력할 필요가 없습니다.
그러나 EMA를 표시하면 포지션 진입과 청산 시점을 더욱더 확실하게 확인할 수 있으므로 표시하도록 하겠습니다.
// 이평선 차트에 표시
plot(shortEMA)
plot(longEMA, color=color.white)
스크립트를 저장하고 차트에 넣기를 누르면 전략이 실행되고 전략테스터 창이 자동으로 열리며, 이곳에서 전략의 통계값을 확인할 수 있습니다.
화면은 아래와 같이 표시됩니다.

기본적으로 전략의 통계치 개요를 보여주는 새 탭이 열립니다. 성과요약 또는 거래목록을 클릭하여 다른 결과값을 확인할 수 있습니다.
전략은 현재 차트에 표시되는 타임 프레임에 따라 조정됩니다.
화면 상단의 메뉴에 있는 타임 프레임 옵션을 사용하여 다양한 시간대를 확인할 수 있습니다. 새 시간대를 선택할 때마다 전략은 해당 시간대를 기준으로 자동 업데이트됩니다.
전체 코드:
//@version=5
strategy("EMA 교차 전략", overlay=true)
// 지표 생성
shortEMA = ta.ema(close, 50)
longEMA = ta.ema(close,200)
rsi = ta.rsi(close, 14)
// 교차 조건 설정
longCondition = ta.crossover(shortEMA, longEMA)
shortCondition = ta.crossunder(shortEMA, longEMA)
if (longCondition)
strategy.entry("long", strategy.long, 10, when = rsi > 50)
if (shortCondition)
strategy.entry("short", strategy.short, 10, when = rsi < 50)
// 이평선 차트에 표시
plot(shortEMA)
plot(longEMA, color=color.white)
익절가 및 손절가 설정 방법
위의 마지막 예제에서 트레이드 실행은 이평선 상향돌파와 하향돌파에 의해 결정되었습니다.
이제 이 스크립트를 기반으로 익절 지점과 손절 지점을 설정하겠습니다. 익절가/손절가를 설정하는 방법은 여러가지가 있지만 대중적으로 쓰이는 방법 중 하나인 ATR(Average True Range)을 이용해서 설정해 보겠습니다.
ATR 지표는 가장 최근의 캔들로부터 우리가 지정한 수 만큼의 과거 캔들에 대한 평균 이동을 계산합니다. 쉽게 말해 가격의 변동성을 나타낸다고 보시면 됩니다.
위의 예제에서 이미 선언한 지표들에 더해 ATR 지표를 리스트에 추가하겠습니다.
// 지표 생성
shortEMA = ta.ema(close, 50)
longEMA = ta.ema(close,200)
rsi = ta.rsi(close, 14)
atr = ta.atr(14)
트레이드 조건에서 이익 실현과 손절매 지점에 필요한 계산을 할 수 있습니다.
if (longCondition)
stopLoss = low - atr * 2
takeProfit = high + atr * 2
strategy.entry("long", strategy.long, 10, when = rsi > 50)
strategy.exit("exit", stop=stopLoss, limit=takeProfit)
위의 코드에서는 포지션 진입 시점의 캔들 저점에서 ATR의 2배수를 뺀 지점을 손절가로 계산했습니다.
따라서 종목이 캔들 당 평균 1만원씩 움직인다고 했을 때 진입 시의 저점에서 가격이 2만원 하락하면 손절하고 나오게 됩니다.
익절가의 경우 위와 반대입니다. 진입 시의 고점에서 가격이 2만원 상승하면 이익을 실현하고 나오게 됩니다.
마지막으로 strategy.exit() 함수를 사용하여 청산 조건을 지정합니다. 함수에 전달되는 매개변수는 아래와 같습니다.
- “exit” – 트레이드 청산을 위한 트레이드 ID입니다.
- “long” – 이전에 트레이드 진입 시 설정했던 ID입니다. 이를 통해 파인 스크립트는 우리가 청산하려는 포지션이 어떤 포지션인지 알 수 있게 됩니다.
- stop=stopLoss – stopLoss 변수에 지정된 가격을 트레이드 종료를 위한 손절 지점으로 사용할 것임을 지정합니다.
- limit=takeProfit – takeProfit 변수에 지정된 가격을 트레이드 종료를 위한 익절 지점으로 사용할 것임을 지정합니다.
숏(매도) 조건의 구문은 롱(매수) 조건의 반대로 계산됩니다.
if (shortCondition)
stopLoss = high + atr * 2
takeProfit = low - atr * 2
strategy.entry("short", strategy.short, 10, when = rsi < 50)
strategy.exit("exit", "short", stop=stopLoss, limit=takeProfit)
나머지 스크립트는 위의 예제와 같습니다. 업데이트된 전략을 실행해서 결과값이 어떻게 바뀌는지 확인해봅시다.

포지션 종료(청산) 지점이 롱/숏 진입 시점과 함께 메인 차트에 표시되는 것을 확인할 수 있습니다.
전체 코드:
//@version=5
strategy("EMA 교차 전략 + ATR 손익절", overlay=true)
// 지표 생성
shortEMA = ta.ema(close, 50)
longEMA = ta.ema(close,200)
rsi = ta.rsi(close, 14)
atr = ta.atr(14)
// 교차 조건 설정
longCondition = ta.crossover(shortEMA, longEMA)
shortCondition = ta.crossunder(shortEMA, longEMA)
if (longCondition)
stopLoss = low - atr * 2
takeProfit = high + atr * 2
strategy.entry("long", strategy.long, 10, when = rsi > 50)
strategy.exit("exit", "long", stop=stopLoss, limit=takeProfit)
if (shortCondition)
stopLoss = high + atr * 2
takeProfit = low - atr * 2
strategy.entry("short", strategy.short, 10, when = rsi < 50)
strategy.exit("exit", "short", stop=stopLoss, limit=takeProfit)
// 이평선 차트에 표시
plot(shortEMA)
plot(longEMA, color=color.white)
지금까지 파인 스크립트를 궁금해 하시는 분들을 위해 아주 기본적인 내용을 살펴보았습니다. 자신만의 지표나 전략을 구축하기 위해 추가적인 정보가 필요하시면 다음 웹사이트를 방문해 리소스를 확인해 보세요.
- 파인 스크립트 v5 사용자 매뉴얼 – 파인 스크립트를 위한 자세한 매뉴얼
- 파인 스크립트 언어 레퍼런스 매뉴얼 – 랭귀지 오퍼레이터와 빌트인(내장) 변수 및 함수 등을 찾아볼 수 있는 레퍼런스 매뉴얼
- 트레이딩뷰 블로그 – 파인 스크립트의 새로운 업데이트 내용이 발표되며 종종 샘플 코드가 포함됨
- 트레이딩뷰 스크립트 라이브러리 – 오픈 소스 파인 스크립트 지표 및 전략 라이브러리
끝까지 읽어주셔서 감사합니다. 다른 것도 궁금하시다면 블로그의 다른 글들을 참고하시면 도움이 될 것입니다.