트레이딩뷰 얼러트 메시지와 플레이스홀더 정리 (alert, alertcondition)
트레이딩뷰 자동매매는 얼러트 메시지로 시작합니다. 그런데 파인스크립트에서 얼러트를 보내는 방법은 세 가지나 되고, 메시지에 쓸 수 있는 변수도 방법마다 다릅니다.
이 글에서는 세 가지 방법의 차이와 플레이스홀더({{close}}같은 메시지 변수), 그리고 TVExtBot 주문메시지를 보낼 때 어떤 방법이 좋은지 정리합니다.
이 글에서 배우는 것
alertcondition(),alert(), 전략alert_message의 차이- 얼러트 메시지에 쓸 수 있는 플레이스홀더 목록
- 얼러트 하나로 매수·매도 주문을 모두 보내는 방법
- 자주 하는 실수
※ 예제 코드는 파인스크립트 v6 기준입니다.
1. 한눈에 비교
| 구분 | alertcondition() | alert() | 전략 alert_message |
|---|---|---|---|
| 사용 가능한 스크립트 | 지표 | 지표, 전략 | 전략 |
| 얼러트 개수 | 조건마다 하나씩 만들어야 함 | 스크립트당 하나 | 스크립트당 하나 |
| 메시지 | 고정 문자열 (플레이스홀더 사용 가능) | 코드에서 자유롭게 조합 (플레이스홀더 사용 불가) | 주문마다 다른 메시지 |
| 얼러트 조건 선택 | 조건 이름 선택 | “alert() 함수 호출만” | “주문 체결” |
| 추천 용도 | 간단한 신호 한두 개 | 지표로 자동매매 | 전략으로 자동매매 (가장 추천) |
2. alertcondition() : 조건마다 얼러트 만들기
1//@version=6
2indicator("이동평균 교차 신호", overlay = true)
3
4fast = ta.sma(close, 10)
5slow = ta.sma(close, 30)
6
7alertcondition(ta.crossover(fast, slow), "매수 신호", "{{ticker}} 골든크로스, 가격 {{close}}")
8alertcondition(ta.crossunder(fast, slow), "매도 신호", "{{ticker}} 데드크로스, 가격 {{close}}")- 얼러트 추가 화면의 조건에서 “매수 신호”, “매도 신호” 를 골라 얼러트를 각각 만듭니다.
- 메시지는 고정 문자열만 쓸 수 있습니다. 대신
{{close}},{{ticker}}같은 플레이스홀더가 얼러트 발생 시점의 값으로 바뀝니다. - 조건이 많아지면 얼러트도 그만큼 많아지고, 트레이딩뷰 요금제의 얼러트 개수 제한에 걸리기 쉽습니다.
3. alert() : 코드에서 메시지를 만들어 보내기
1//@version=6
2indicator("이동평균 교차 알림", overlay = true)
3
4buyMsg = input.text_area("", "매수 주문메시지", group = "TVExtBot")
5sellMsg = input.text_area("", "매도 주문메시지", group = "TVExtBot")
6
7fast = ta.sma(close, 10)
8slow = ta.sma(close, 30)
9
10if ta.crossover(fast, slow)
11 alert(buyMsg, alert.freq_once_per_bar_close)
12if ta.crossunder(fast, slow)
13 alert(sellMsg, alert.freq_once_per_bar_close)- 얼러트 추가 화면의 조건에서 스크립트를 고르고 “alert() 함수 호출만(Any alert() function call)” 을 선택하면, 얼러트 하나로 매수·매도를 모두 처리합니다.
- 메시지 칸에 입력한 내용은 무시되고,
alert()에 넘긴 문자열이 그대로 전송됩니다. - 두 번째 인자는 얼러트 빈도입니다.
| 빈도 | 의미 |
|---|---|
alert.freq_once_per_bar | 봉이 진행 중이어도 조건이 처음 맞는 순간 한 번 (기본값) |
alert.freq_once_per_bar_close | 봉이 마감될 때 한 번 (자동매매에 추천) |
alert.freq_all | 조건이 맞을 때마다 매번 |
※ alert() 메시지에서는 {{close}} 같은 플레이스홀더가 바뀌지 않습니다. 값을 넣으려면 str.tostring() 으로 직접 문자열을 만들어야 합니다.
alert(syminfo.ticker + " 매수, 가격 " + str.tostring(close), alert.freq_once_per_bar_close)4. 전략 alert_message : 주문마다 다른 메시지 보내기
전략에서는 strategy.entry(), strategy.close(), strategy.exit() 같은 주문 함수의 alert_message 에 메시지를 넣습니다.
1//@version=6
2strategy("이동평균 교차 전략", overlay = true)
3
4buyMsg = input.text_area("", "롱 진입 주문메시지", group = "TVExtBot")
5exitMsg = input.text_area("", "롱 청산 주문메시지", group = "TVExtBot")
6
7fast = ta.sma(close, 10)
8slow = ta.sma(close, 30)
9
10if ta.crossover(fast, slow)
11 strategy.entry("Long", strategy.long, alert_message = buyMsg)
12if ta.crossunder(fast, slow)
13 strategy.close("Long", alert_message = exitMsg)얼러트 추가 화면의 메시지 칸에는 아래 한 줄만 입력합니다. 주문이 체결될 때마다 해당 주문의 alert_message 로 바뀌어 전송됩니다.
{{strategy.order.alert_message}} 스크립트 첫 줄에 //@strategy_alert_message {{strategy.order.alert_message}} 를 넣어 두면, 얼러트를 만들 때 메시지 칸에 이 내용이 자동으로 들어갑니다.
전략 얼러트의 장점은 백테스트한 매매와 실제 얼러트가 똑같이 움직인다는 점입니다. 지표를 전략으로 바꾸는 방법은 지표를 전략으로 바꾸는 방법에서 설명합니다.
5. 플레이스홀더 목록
얼러트 메시지 칸(과 alertcondition() 메시지)에 쓰면 얼러트가 발생할 때 실제 값으로 바뀝니다.
공통
| 플레이스홀더 | 내용 | 예 |
|---|---|---|
{{ticker}} | 심볼 | BTCUSDT |
{{exchange}} | 거래소 | BINANCE |
{{interval}} | 차트 시간봉 | 15 |
{{open}} {{high}} {{low}} {{close}} | 해당 봉의 시가·고가·저가·종가 | 65000.5 |
{{volume}} | 거래량 | 123.4 |
{{time}} | 봉 시작 시각 (UTC) | 2026-09-26T03:00:00Z |
{{timenow}} | 얼러트 발생 시각 (UTC) | 2026-09-26T03:14:05Z |
{{plot_0}}, {{plot("이름")}} | 스크립트가 그린 plot 값 | 64210.3 |
전략 전용
| 플레이스홀더 | 내용 |
|---|---|
{{strategy.order.alert_message}} | 주문 함수의 alert_message |
{{strategy.order.action}} | buy 또는 sell |
{{strategy.order.contracts}} | 체결 수량 |
{{strategy.order.price}} | 체결 가격 |
{{strategy.order.id}} | 주문 이름 (예: Long) |
{{strategy.order.comment}} | 주문 함수의 comment |
{{strategy.market_position}} | 주문 후 포지션: long, flat, short |
{{strategy.market_position_size}} | 주문 후 포지션 수량 |
{{strategy.prev_market_position}} | 주문 전 포지션 |
6. TVExtBot 주문메시지는 어떤 방법이 좋을까?
| 상황 | 추천 방법 |
|---|---|
| 직접 만든 전략이나 전략으로 바꿀 수 있는 지표 | 전략 alert_message + {{strategy.order.alert_message}} |
| 전략으로 바꾸기 어려운 지표 (신호가 여러 종류 등) | alert() + “alert() 함수 호출만” |
| 코드를 고칠 수 없는 공개 지표 | 지표의 alertcondition() 조건마다 얼러트를 만들고 메시지 칸에 주문메시지를 직접 입력 |
- TVExtBot 주문메시지(
TVM:{...}:MVT)는 메시지 칸 또는alert_message에 그대로 붙여넣으면 됩니다. - 주문메시지를 여러 개 이어 붙이면 순서대로 주문이 실행됩니다. (예: 청산 후 반대 방향 진입)
- 주문메시지는 확장프로그램에서 만들고, 단축 주문메시지를 쓰면 주문 내용을 바꿔도 얼러트를 다시 만들 필요가 없습니다. → 단축 주문메시지 사용법
- 웹훅 URL 설정은 웹훅URL에 의한 자동매매를 참고해 주세요.
7. 자주 하는 실수
alert()를 넣었는데 얼러트가 안 옴: 얼러트 조건에서 “alert() 함수 호출만”(전략은 “주문 체결과 alert() 함수 호출”)을 선택했는지 확인해 주세요.alert()메시지에{{close}}를 씀: 바뀌지 않고 글자 그대로 전송됩니다.str.tostring(close)를 사용합니다.- 봉 마감 전에 신호가 나갔다가 사라짐: 빈도를
alert.freq_once_per_bar_close로 하거나, 얼러트 설정의 빈도를 “봉 마감 시 한 번"으로 선택합니다. 자세한 내용은 백테스트와 실전이 다른 이유에서 다룹니다. - 스크립트나 설정을 바꾼 뒤 얼러트를 그대로 둠: 얼러트는 만든 시점의 스크립트와 설정으로 동작합니다. 수정했다면 얼러트를 다시 만들어 주세요.
- 메시지를 JSON으로 보낼 때 따옴표 오류: 큰따옴표(
")가 짝이 맞지 않거나 스마트 따옴표(“ ”)가 섞이면 받는 쪽에서 해석하지 못합니다. TVExtBot 주문메시지는 확장프로그램에서 복사한 그대로 붙여넣어 주세요.
얼러트를 자동매매로 연결하려면 코인 주식 자동매매 시작하기부터 따라 해 보세요.
