지표를 전략으로 바꾸기
트레이딩뷰에 공개된 지표(indicator)를 백테스트와 자동매매가 가능한 전략(strategy)으로 바꾸는 방법을 슈퍼트렌드 예제와 전체 코드(Pine Script v6)로 설명합니다.
트레이딩뷰에 공개된 지표(indicator)는 차트에 신호를 보여줄 뿐, 백테스트나 자동매매에 바로 쓸 수는 없습니다.
이 글에서는 슈퍼트렌드 지표를 예로 들어 지표를 전략(strategy)으로 바꾸는 방법과, 바꾼 전략을 TVExtBot으로 자동매매하는 방법까지 순서대로 설명합니다.
이 글에서 배우는 것
- 지표(indicator)와 전략(strategy)의 차이
- 지표를 전략으로 바꾸는 4단계
- 전략 테스터로 백테스트 결과 확인하기
- 전략의 매수·매도 신호로 TVExtBot 자동매매하기
※ 예제 코드는 파인스크립트 최신 버전인 v6 기준입니다. 파인스크립트가 처음이라면 먼저 파인스크립트 기초를 참고해 주세요.
코드를 직접 고치지 않아도 됩니다
지표에 얼러트 조건(alertcondition)이 있으면, 확장프로그램의 전략 변환이 이 글의 과정을 대신해 줍니다. 지표 코드를 붙여넣고 신호마다 롱 진입·청산을 고르면, 전략 코드와 주문메시지 연결까지 한 번에 만들어 줍니다.
원리를 알고 싶거나 직접 다듬고 싶다면 이 글을 끝까지 보세요. 바로 자동매매를 하고 싶다면 → 전략 변환으로 바로 하기 (영상 포함)
1. 지표와 전략의 차이
| 구분 | 지표 (indicator) | 전략 (strategy) |
|---|---|---|
| 선언 | indicator() | strategy() |
| 역할 | 차트에 선·신호 표시 | 가상 주문을 내고 손익 계산 |
| 백테스트 | 불가 | 전략 테스터에서 수익률·승률·최대 낙폭 확인 |
| 얼러트 | alertcondition() 으로 조건마다 따로 설정 | 주문이 실행될 때마다 얼러트 발생 (하나의 얼러트로 매수·매도 모두 처리) |
자동매매에서 전략을 쓰면 좋은 점은 두 가지입니다.
- 실제 돈을 넣기 전에 과거 데이터로 성과를 검증할 수 있습니다.
- 매수·매도·청산을 얼러트 하나로 처리할 수 있어 설정이 간단합니다.
2. 예제 지표: 슈퍼트렌드
먼저 바꿀 지표입니다. 추세가 상승으로 바뀌면 매수 신호, 하락으로 바뀌면 매도 신호를 표시합니다.
지표 스크립트
//@version=6
indicator("슈퍼트렌드 지표", overlay = true)
atrPeriod = input.int(10, "ATR 기간", minval = 1)
factor = input.float(3.0, "ATR 배수", minval = 0.1, step = 0.1)
[st, dir] = ta.supertrend(factor, atrPeriod) // dir < 0 : 상승 추세, dir > 0 : 하락 추세
plot(dir < 0 ? st : na, "상승 추세", color.green, style = plot.style_linebr)
plot(dir > 0 ? st : na, "하락 추세", color.red, style = plot.style_linebr)
buySignal = ta.change(dir) < 0 // 하락 → 상승으로 바뀐 봉
sellSignal = ta.change(dir) > 0 // 상승 → 하락으로 바뀐 봉
plotshape(buySignal, "매수", shape.triangleup, location.belowbar, color.green, size = size.small)
plotshape(sellSignal, "매도", shape.triangledown, location.abovebar, color.red, size = size.small)
alertcondition(buySignal, "매수 신호", "슈퍼트렌드 매수")
alertcondition(sellSignal, "매도 신호", "슈퍼트렌드 매도")마지막 두 줄의 alertcondition이 이 지표의 매수·매도 신호입니다. 아래 4단계는 이 신호를 주문으로 바꾸는 과정입니다.
3. 전략으로 바꾸는 4단계
① indicator() 를 strategy() 로 바꾸고 백테스트 조건 넣기
strategy("슈퍼트렌드 전략", overlay = true,
initial_capital = 10000, // 초기 자본
default_qty_type = strategy.percent_of_equity, // 주문 수량 방식: 자산 대비 %
default_qty_value = 10, // 한 번에 자산의 10%
commission_type = strategy.commission.percent,
commission_value = 0.05, // 수수료 0.05%
slippage = 1) // 슬리피지 1틱※ 수수료와 슬리피지를 넣지 않으면 백테스트 수익률이 실제보다 좋게 나옵니다. 사용하는 거래소의 수수료로 꼭 맞춰 주세요.
② 매수·매도 신호는 그대로 둡니다
buySignal, sellSignal 처럼 지표에서 만든 신호 변수는 그대로 사용합니다. 공개 지표를 바꿀 때도 신호가 되는 조건(plotshape, alertcondition 에 쓰인 조건)을 찾아 변수로 만들어 두면 됩니다.
전략 변환도 같은 방식으로 동작합니다. 지표의 alertcondition 조건을 신호로 쓰고, 원래 지표의 계산·차트 표시는 바꾸지 않습니다.
③ 신호에 맞춰 주문 함수 호출하기
if buySignal
strategy.entry("Long", strategy.long) // 롱 진입
if sellSignal
strategy.close("Long") // 롱 청산strategy.entry(): 포지션 진입. 반대 방향 포지션이 있으면 자동으로 청산하고 진입합니다.strategy.close(): 해당 이름의 포지션 청산.
④ 주문마다 TVExtBot 주문메시지 연결하기
주문 함수에 alert_message 를 넣으면, 그 주문이 실행될 때 얼러트로 이 메시지가 전송됩니다. 메시지는 코드에 직접 쓰지 않고 설정 화면(input)에서 붙여넣을 수 있게 만들어 두면 편합니다.
전략 변환을 쓰면 이 부분을 단축 주문메시지(주문ID)로 자동 연결해 줍니다. 주문 내용을 바꿔도 코드나 얼러트를 다시 만들 필요가 없습니다.
buyMsg = input.text_area("", "매수 주문메시지", group = "TVExtBot")
sellMsg = input.text_area("", "매도(청산) 주문메시지", group = "TVExtBot")
if buySignal
strategy.entry("Long", strategy.long, alert_message = buyMsg)
if sellSignal
strategy.close("Long", alert_message = sellMsg)4. 완성된 전략 전체 코드
롱 전용으로 동작하고, 설정에서 숏 포지션 사용을 켜면 매도 신호에 숏으로 진입합니다.
전략 스크립트 (Pine Script v6)
//@version=6
strategy("슈퍼트렌드 전략", overlay = true,
initial_capital = 10000,
default_qty_type = strategy.percent_of_equity,
default_qty_value = 10,
commission_type = strategy.commission.percent,
commission_value = 0.05,
slippage = 1)
// ── 설정 ─────────────────────────────
atrPeriod = input.int(10, "ATR 기간", minval = 1)
factor = input.float(3.0, "ATR 배수", minval = 0.1, step = 0.1)
allowShort = input.bool(false, "숏 포지션 사용")
buyMsg = input.text_area("", "롱 진입 주문메시지", group = "TVExtBot")
closeLongMsg = input.text_area("", "롱 청산 주문메시지", group = "TVExtBot")
sellMsg = input.text_area("", "숏 진입 주문메시지", group = "TVExtBot")
closeShortMsg= input.text_area("", "숏 청산 주문메시지", group = "TVExtBot")
// ── 지표 계산 (지표 스크립트와 동일) ──────
[st, dir] = ta.supertrend(factor, atrPeriod)
plot(dir < 0 ? st : na, "상승 추세", color.green, style = plot.style_linebr)
plot(dir > 0 ? st : na, "하락 추세", color.red, style = plot.style_linebr)
buySignal = ta.change(dir) < 0
sellSignal = ta.change(dir) > 0
// ── 주문 ─────────────────────────────
if buySignal
if strategy.position_size < 0
strategy.close("Short", alert_message = closeShortMsg)
strategy.entry("Long", strategy.long, alert_message = buyMsg)
if sellSignal
if strategy.position_size > 0
strategy.close("Long", alert_message = closeLongMsg)
if allowShort
strategy.entry("Short", strategy.short, alert_message = sellMsg)반대 포지션을 strategy.close() 로 먼저 청산하는 이유는, 청산과 진입 주문메시지를 각각 따로 TVExtBot으로 보내기 위해서입니다.
5. 백테스트 결과 확인하기
- Pine 에디터에 전체 코드를 붙여넣고 저장 → 차트에 추가를 누릅니다.
- 차트 아래 전략 테스터 탭에서 순이익, 승률, 최대 낙폭(MDD), 거래 횟수를 확인합니다.
- 설정(⚙)에서 ATR 기간·배수를 바꿔 가며 결과를 비교해 봅니다.
백테스트를 볼 때 주의할 점
- 백테스트는 과거 성과일 뿐, 앞으로의 수익을 보장하지 않습니다.
- 거래 횟수가 너무 적으면(수십 회 이하) 결과를 믿기 어렵습니다. 기간을 늘려 확인해 주세요.
- 여러 값을 손으로 바꿔 보기 번거롭다면 TVExtBot 옵티마이저로 설정값 조합을 자동으로 백테스트할 수 있습니다.
6. TVExtBot으로 자동매매 연결하기
- TVExtBot 확장프로그램의 메시지 작성 화면에서 롱 진입·청산(숏을 쓰면 숏 진입·청산) 주문메시지를 작성합니다.
- 전략 설정 → TVExtBot 항목에 각 주문메시지를 붙여넣습니다.
- 트레이딩뷰에서 얼러트 추가 → 조건에서 슈퍼트렌드 전략을 선택합니다.
- 메시지 칸에 아래 내용만 입력합니다. 주문이 실행될 때마다 해당 주문메시지로 바뀌어 전송됩니다.
{{strategy.order.alert_message}}- 알림 → 웹훅 URL에 확장프로그램 메시지 작성 화면에 있는 본인의 웹훅 URL을 입력하고 저장합니다.
얼러트 설정 화면과 웹훅 URL 입력 방법은 파인스크립트 전략을 사용하여 자동매매하는 방법과 웹훅URL에 의한 자동매매에 그림과 함께 자세히 나와 있습니다.
코드 없이: 전략 변환으로 바로 하기
위 과정을 확장프로그램이 대신하게 할 수도 있습니다. 이 글의 슈퍼트렌드 지표 코드를 그대로 붙여넣어도 됩니다.
지표 코드를 붙여넣어 전략으로 바꾸고, 백테스트부터 웹훅 자동매매까지 하는 과정을 영상(약 3분)으로 볼 수 있습니다.
주문메시지 저장
「메시지 작성」에서 롱 진입·청산(숏을 쓰면 숏 진입·청산) 주문메시지를 만들어 리스트에 저장합니다.
지표 코드 붙여넣기
전략 변환 화면에 지표 코드를 붙여넣고 [코드 확인]을 누릅니다. 신호 표에서 「매수 신호」는 롱 진입, 「매도 신호」는 롱 청산(또는 숏 진입)으로 고릅니다.
변환한 코드로 얼러트 만들기
변환된 코드를 Pine 에디터에 붙여넣고 차트에 추가합니다. 전략 테스터로 백테스트를 확인한 뒤, 얼러트를 하나만 만듭니다.
전략 변환이 안 되는 지표
- 얼러트 조건(alertcondition)이 없는 지표 — 차트에 화살표만 그리는 지표
indicator()에timeframe인수를 쓰는 지표
이런 지표는 이 글의 방법으로 직접 전략을 만드세요. 자세한 조건은 전략 변환 – 지표 변환에 있습니다.
7. 자주 하는 실수
- 얼러트 조건에서 전략 대신 지표를 선택: 지표 스크립트를 선택하면
{{strategy.order.alert_message}}가 동작하지 않습니다. 반드시 전략 스크립트를 선택해 주세요. - 전략 설정을 바꾼 뒤 얼러트를 그대로 둠: 얼러트는 만들 때의 설정으로 동작합니다. 설정값이나 주문메시지를 바꿨다면 얼러트를 다시 만들어 주세요. (단축 주문메시지를 쓰면 주문 내용은 얼러트를 다시 만들지 않고 바꿀 수 있습니다 → 단축 주문메시지 사용법)
- 테스트 없이 실거래 시작: 처음에는 테스트넷이나 소액으로 주문이 제대로 들어가는지 확인해 주세요. → 바이빗 테스트넷 사용법