웹훅 연결하다 3번 막혔다 — 트레이딩뷰 알림을 자동 주문으로 바꾸는 법

트레이딩뷰 웹훅 알림 자동매매 신호 연결 파인스크립트
🔗 3편 바로가기 — 서버에 봇 코드를 아직 안 올렸다면 3편부터 하고 오세요.
⚠️ 투자 위험 고지: 선물 거래는 넣은 돈 전부를 잃을 수 있는 고위험 투자입니다. 모든 판단과 결과의 책임은 본인에게 있습니다.

알림이 울리면, 봇이 대신 주문합니다.

💡 30초 요약

  • 트레이딩뷰 알림이 울리면 → 내 서버로 쪽지가 날아가고 → 봇이 바이비트에 대신 주문을 넣어요.
  • 서버 주소에 :5000 같은 숫자를 붙이면 안 돼요. 트레이딩뷰는 80번·443번 문으로만 보냅니다.
  • 쪽지에는 나만 아는 암호를 꼭 넣어요. 암호 없는 쪽지는 봇이 무시합니다.
  • 트레이딩뷰 유료 요금제 + 2단계 인증이 켜져 있어야 이 기능이 보여요.

🔌 사람 대신 봇이 주문 넣는 구조

차트 보다가 "지금이다!" 싶어서 주문 버튼 누르려는데, 손이 떨려서 놓친 적 있으시죠? 밤새 차트 지키다 잠들어서 놓친 적도요.

오늘 하는 일은 딱 하나예요. 그 버튼을 봇이 대신 누르게 만드는 겁니다.

식당 호출벨을 떠올려 보세요. 손님이 벨을 누르면 주방에 주문이 들어가죠. 직원이 테이블을 계속 쳐다볼 필요가 없어요.

[트레이딩뷰]  조건이 맞으면 벨을 누름 (알림 + 쪽지)
     │
     ▼
[내 서버의 봇]  쪽지를 읽고, 암호가 맞는지 확인
     │
     ▼
[바이비트]  봇이 대신 주문을 넣음

여기서 벨 누르는 장치를 '웹훅'이라고 불러요. 이름만 어렵지, 알림이 울릴 때 정해진 주소로 쪽지를 보내주는 기능일 뿐이에요.


🧯 처음 이 글에서 틀렸던 것 (정정)

솔직하게 말씀드릴게요. 6월에 처음 올린 이 글에는 그대로 따라 하면 주문이 안 나가는 부분이 있었어요.

처음엔 서버 주소를 http://내서버IP:5000/webhook으로 안내했어요. 그런데 트레이딩뷰는 80번·443번 문으로만 쪽지를 보냅니다. 5000번 같은 다른 문 번호가 붙으면 아예 안 보내요.

그래서 제가 실제로 봇을 돌릴 때는 문 번호를 빼고 http://내서버IP/order 같은 주소를 썼어요. 쪽지에 암호(token)를 넣어서, 암호가 틀리면 봇이 주문을 거부하게 했고요. 그 과정은 업데이트편에 적어 뒀어요.

또 하나, 전략 코드 안의 쪽지와 알림 메시지 칸이 서로 엇갈리게 적혀 있었어요. 이번에 한 가지 방식으로 맞췄습니다.

📌 이 글은 위 내용을 반영해서 2026년 10월에 처음부터 다시 쓴 버전이에요. 예전 글을 보고 막히셨던 분이라면 아래 순서대로 다시 해보세요.

① 봇에 암호 걸고 문 번호 바꾸기

3편에서 만든 webhook_bot.py를 조금 고쳐요. 바뀌는 건 두 가지예요. 암호 검사가 생기고, 문 번호가 5000 → 80으로 바뀝니다.

서버 까만 창에서 파일을 엽니다.

nano webhook_bot.py

안에 있던 내용을 전부 지우고 아래로 바꿔 붙여넣으세요.

from flask import Flask, request
from pybit.unified_trading import HTTP

app = Flask(__name__)

# 🔐 나만 아는 암호 (아무 글자나 길게. 트레이딩뷰 쪽지의 token과 똑같아야 해요)
SECRET = "여기에_나만아는_암호_길게"

# 🔑 1편에서 받은 키
session = HTTP(
    testnet=True,                  # ⚠️ 처음엔 무조건 True (연습용 가짜 돈)
    api_key="여기에_API_KEY",
    api_secret="여기에_API_SECRET",
)

@app.route('/webhook', methods=['POST'])
def webhook():
    data = request.get_json(force=True, silent=True) or {}

    # 암호가 틀린 쪽지는 무시
    if data.get('token') != SECRET:
        return "no", 403

    order = session.place_order(
        category="linear",         # USDT 무기한 선물
        symbol=data['symbol'],     # 예: BTCUSDT
        side=data['side'],         # Buy 또는 Sell
        orderType="Market",
        qty=data['qty'],
    )
    print("✅ 주문 전송 완료:", order)
    return "ok", 200

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=80)   # 트레이딩뷰가 보내주는 80번 문

저장은 Ctrl + X → Y → Enter. 그리고 80번 문은 관리자 권한이 필요해서 이렇게 켭니다.

sudo python3 webhook_bot.py
💡 Running on http://0.0.0.0:80 문구가 보이면 성공이에요. 서버에 방화벽을 켜 두셨다면 sudo ufw allow 80으로 80번 문도 열어 주세요.

② 트레이딩뷰 전략에 쪽지 심기

트레이딩뷰 아래쪽 파인 에디터를 열고, 전략에 "주문할 때 이 쪽지를 같이 보내라"고 적어 둡니다.

아래는 연습용 예시예요. 짧은 평균선이 긴 평균선을 뚫고 올라가면 사고, 다시 내려가면 파는 단순한 전략입니다. 수익 내라고 드리는 전략이 아니라, 연결이 되는지 보는 용도예요.

//@version=6
strategy("내 첫 자동매매 연습", overlay=true)

fast = ta.sma(close, 14)   // 짧은 평균선
slow = ta.sma(close, 28)   // 긴 평균선

// 봇에게 보낼 쪽지 (token은 ①에서 정한 암호와 똑같이)
buyMsg  = '{"token":"여기에_나만아는_암호_길게","symbol":"BTCUSDT","side":"Buy","qty":"0.001"}'
sellMsg = '{"token":"여기에_나만아는_암호_길게","symbol":"BTCUSDT","side":"Sell","qty":"0.001"}'

if ta.crossover(fast, slow)
    strategy.entry("오름", strategy.long, alert_message = buyMsg)

if ta.crossunder(fast, slow)
    strategy.close("오름", alert_message = sellMsg)

쪽지에 들어가는 칸은 네 개뿐이에요.

칸 뜻 예시
token나만 아는 암호①에서 정한 글자
symbol무슨 코인BTCUSDT
side사기 / 팔기Buy / Sell
qty얼마나0.001
🔒 이 전략 코드에는 암호가 들어 있어요. 트레이딩뷰에 공개(게시)하지 마시고, 캡처할 때도 암호가 안 보이게 가려 주세요.

다 붙였으면 [저장] → [차트에 추가]를 누릅니다.


③ 알림 만들고 서버 주소 넣기

이제 벨을 답니다. 오른쪽 알림(🔔) → 알림 만들기로 들어가세요.

설정 칸 넣을 값
조건②에서 추가한 내 전략 이름
메시지{{strategy.order.alert_message}} 한 줄만
알림 → 웹훅 URL ✅http://내서버IP/webhook (:5000 붙이지 않기!)
💡 {{strategy.order.alert_message}}는 "전략에 심어 둔 쪽지를 그대로 보내라"는 뜻이에요. 사는 신호면 buyMsg가, 파는 신호면 sellMsg가 알아서 골라져서 날아갑니다.

웹훅 칸이 아예 안 보이면 두 가지를 확인하세요. 트레이딩뷰가 무료 요금제이거나, 계정에 2단계 인증이 안 켜져 있는 경우예요. 2단계 인증은 프로필 → 설정 → 보안에서 켤 수 있어요.


④ 진짜 돈 쓰기 전에 시험 쏘기

알림을 기다리지 말고, 내 컴퓨터에서 먼저 쪽지를 한 번 쏴 봅니다.

맥은 '터미널', 윈도우는 '명령 프롬프트'를 열고 아래를 붙여넣으세요. 일부러 틀린 암호를 넣었어요.

curl -X POST http://내서버IP/webhook -H "Content-Type: application/json" -d "{\"token\":\"틀린암호\"}"

화면에 no가 뜨면 정상이에요. 서버까지 쪽지가 도착했고, 봇이 가짜 쪽지를 잘 걸러냈다는 뜻입니다. 주문은 안 나가요.

아무 반응이 없으면 서버가 꺼져 있거나, 80번 문이 막혀 있는 거예요. 이 상태로는 트레이딩뷰 쪽지도 못 받습니다.

📌 진짜 주문 시험은 5편에서 해요. 한국 계정은 바이비트 연습 서버(테스트넷) 주문이 막혀 있는 경우가 있어서, 저는 아주 작은 수량으로 시험했어요.

🧯 자주 막히는 곳

증상 원인 / 해결
알림은 울리는데 주문이 안 나감주소에 :5000 같은 문 번호가 붙어 있는지 확인. 80·443만 됩니다
서버 창에 403만 찍힘전략 쪽지의 token과 봇의 SECRET 글자가 다름. 띄어쓰기까지 똑같이
웹훅 URL 칸이 안 보임유료 요금제 + 2단계 인증 둘 다 필요
Permission denied (서버 켤 때)80번 문은 sudo를 붙여서 켜야 해요
메시지 칸 내용이 그대로 날아감메시지 칸에 {{strategy.order.alert_message}} 한 줄만 있어야 해요

👨‍👦 아빠가 아들에게

벨(알림)은 트레이딩뷰가 누르고, 주문은 봇이 대신 넣어.
쪽지에는 꼭 너만 아는 암호를 넣어. 암호 없는 쪽지는 봇이 버려.
진짜 돈 넣기 전에, 틀린 암호로 한 번 쏴 보고 "no"가 오는지부터 봐.


🙋 자주 묻는 질문

Q. 트레이딩뷰 무료로는 안 되나요?
웹훅은 유료 요금제에서만 쓸 수 있어요. 그리고 계정에 2단계 인증이 켜져 있어야 칸이 보여요.


Q. 주소를 https로 해야 하나요?
http(80번 문)도 됩니다. 다만 쪽지가 암호화 없이 오가니까 암호를 꼭 넣으세요. 더 안전하게 하려면 도메인을 연결해 https(443번 문)로 바꾸면 돼요.


Q. 봇이 3초 안에 답을 안 하면 어떻게 되나요?
트레이딩뷰는 3초 넘게 답이 없으면 쪽지 보내기를 취소해요. 그래서 봇 코드에는 주문 넣기 말고 무거운 일을 넣지 않는 게 좋아요.


Q. 암호 말고 더 막는 방법은 없나요?
트레이딩뷰가 쪽지를 보내는 주소(IP)는 4개로 정해져 있어요. 52.89.214.238, 34.212.75.30, 54.218.53.128, 52.32.178.7. 서버 방화벽에서 이 4곳만 80번 문에 들어오게 하면 한 겹 더 막을 수 있어요. 이 주소는 바뀔 수 있으니 트레이딩뷰 공식 안내를 한 번 확인하세요.


Q. 창을 닫으면 봇도 꺼지나요?
네, 지금 방식은 그래요. 창을 닫아도 계속 돌게 하는 방법은 5편에서 다뤄요.


✅ 이번 편 체크포인트

  • ☑️ 봇에 SECRET 암호를 넣고 80번 문으로 켰나?
  • ☑️ 전략 쪽지의 token이 봇 암호와 똑같나?
  • ☑️ 메시지 칸에 {{strategy.order.alert_message}} 한 줄만 넣었나?
  • ☑️ 웹훅 주소에 :5000이 없나?
  • ☑️ 틀린 암호로 쏴서 no가 돌아왔나?

여기까지 됐으면 신호선 연결은 끝이에요. 이제 벨이 울리면 봇이 알아서 움직입니다.


📚 함께 보면 좋은 글

🎁 "여기서 막혔어요" 하는 분께

어디서 멈췄는지 화면만 보여주시면 같이 봐 드릴게요. 상담 비용도, 수수료도 없어요.

👉 거북이 트레이더 카카오톡 오픈채팅 바로가기

🗂️ 웹훅 자동매매 봇 시리즈 전체

편 글
원문바이비트 웹훅 연결 왕초보 가이드
1편바이비트 API 키 발급 방법 — 자동매매 준비물 3가지
2편코인 봇용 VPS 빌리고 SSH 접속하기
3편VPS에 파이썬 매매 봇 올리고 실행하기
4편 👈지금 보는 글 — 트레이딩뷰 알림을 자동 주문으로 바꾸는 법
5편매매 봇 테스트넷 검증과 손절 세팅
업데이트한국 IP로 바이비트 API 안 될 때 — VPS 릴레이 해결법
※ 본 콘텐츠는 정보 제공 목적이며 투자 권유가 아닙니다. 선물·레버리지 거래는 넣은 돈을 모두 잃을 위험이 큽니다. 투자의 최종 책임은 투자자 본인에게 있습니다.

댓글

이 블로그의 인기 게시물

눌림목 신호 921건 — 상승장 롱 59%, 하락장 숏 79%

눌림목 신호 260건 실기록 — 닿았다와 먹었다는 다르다

눌림목 신호 2,211건 채점 — 국면 판단 4가지 전부 실패