TradingView Pine Script 웹훅을 실거래로 연결하는 3가지 방법
TradingView 의 Pine Script 에서 alert() 로 웹훅 URL 에 POST 요청을 쏘는 건 10분이면 배웁니다.
문제는 "그 웹훅을 어디서 받아서 실제 증권사/거래소 주문으로 변환할 것인가" 입니다.
이 글에서는 실전에서 자주 쓰는 3가지 방법을 비교하고, 각 방법의 장단점과 실패 패턴을 알려드립니다.
전제 — TradingView 웹훅이 요구하는 것
TradingView alert() 가 웹훅 POST 를 보낼 때 요구사항은 3가지입니다.
- 공개 접근 가능한 URL — TradingView 서버가 직접 POST. 내 로컬 PC IP는 접근 불가
- HTTPS 필수 — HTTP는 거부
- 응답 1초 이내 반환 — 길면 타임아웃으로 신호 누락. 실 주문 처리는 비동기로
이 3조건을 만족하는 "웹훅 수신기" 가 있어야 하고, 수신기에서 받은 JSON 을 파싱해 증권사 API 로 주문을 넣는 구조가 필요합니다.
방법 1. ngrok — 가장 쉬운 시작, 가격 이슈 있음
ngrok 은 로컬 서버(예: Flask on localhost:5000) 를 공개 HTTPS URL 로 노출해주는 터널 서비스입니다. 본인 PC 에서 Python Flask 돌리고 ngrok 한 줄이면 TradingView 웹훅 수신 가능.
# 1. 로컬 Flask 서버 (Python)
from flask import Flask, request
app = Flask(__name__)
@app.post("/webhook")
def webhook():
data = request.json
# → 키움/바이낸스 API 호출
return {"ok": True}
app.run(port=5000)
# 2. ngrok 실행 (다른 터미널)
ngrok http 5000
# → https://abc123.ngrok-free.app 같은 공개 URL 생성
장점
- 10분이면 셋업 완료. 튜토리얼 넘침.
- 로컬에서 개발·디버깅 편함.
단점 (실전에서 만나는 문제)
- 무료 플랜 URL 은 매번 바뀜. 재시작마다 TradingView alert 설정을 새 URL로 교체해야 함
- 고정 URL 원하면 월 $8+ 유료 플랜
- 무료 플랜은 동시 접속 1개·시간당 요청 한도 있음
- 로컬 PC 꺼지면 자동매매 중단
방법 2. Cloudflare Quick Tunnel — 무료·무계정·고정 필요 없으면 최고
Cloudflare 의 cloudflared 바이너리로 만드는 "Quick Tunnel". 계정·토큰·가입 전부 불필요.
실행하면 https://xxx.trycloudflare.com 공개 URL 이 나옵니다.
# 1. cloudflared 다운로드 (Windows)
# https://github.com/cloudflare/cloudflared/releases
# 2. 실행 (tcp 5000 로컬 → 공개 URL 매핑)
cloudflared tunnel --url http://localhost:5000
# stdout에 https://abc-xyz.trycloudflare.com 출력
알고랩에서 제작한 키움 자동매매 프로젝트들은 대부분 이 방식을 기본으로 탑재합니다.
프로그램 시작 시 cloudflared 를 subprocess 로 실행하고 stdout 을 파싱해서 URL 추출 → 고객이 TradingView alert 에 복붙.
장점
- 완전 무료·무계정. 가입 절차 없음
- cloudflared 바이너리 하나로 끝. 설정 파일 불필요
- Cloudflare 인프라라 안정적
단점
- URL 이 실행 때마다 바뀜. 매번 TradingView alert 에 URL 재입력 필요
- 장시간 실행 시 간헐적 재연결 발생 (재시작 로직 필요)
- 고정 URL 원하면 Cloudflare 무료 계정 + Named Tunnel 설정 필요 (복잡도 상승)
방법 3. 중개 서버 (Cloudflare Worker / VPS) — 가장 안정적
터널 없이 처음부터 공개 서버에 웹훅 수신기를 올리는 방식. 이 구조가 가장 안정적이고 URL 도 영구적입니다.
가장 가성비 좋은 조합: Cloudflare Workers
- 무료 플랜 월 10만 requests, 충분
- HTTPS 자동, 커스텀 도메인 무료
- 코드 20줄로 webhook 수신기 구성
- 수신한 웹훅을 큐에 쌓아두면 로컬 자동매매 프로그램이 폴링해서 주문 실행
// Cloudflare Worker 예시 (간소화)
export default {
async fetch(request, env) {
if (request.method !== "POST") return new Response("OK");
const data = await request.json();
// 1. 웹훅 저장 (D1·KV·R2 아무거나)
await env.WEBHOOK_KV.put(`sig:${Date.now()}`, JSON.stringify(data));
return new Response(JSON.stringify({ ok: true }));
}
}
로컬 자동매매 프로그램은 Worker 의 다른 엔드포인트를 2~5초마다 폴링해서 새 웹훅을 받아 주문 실행.
장점
- URL 영구 고정 (한 번 설정하면 끝)
- 고객 PC 가 꺼져도 웹훅은 큐에 누적 — PC 재시작 시 밀린 것부터 처리
- 감사 로그·재전송 로직 등 확장 용이
- 무료 플랜으로 월 10만 웹훅까지
단점
- 셋업 난이도 중간 (Worker 배포·커스텀 도메인 연결)
- 폴링 구조라 1~5초 latency 추가 (스캘핑엔 부적합, 분봉 이상은 무관)
결론 — 어떤 걸 써야 하나
| 상황 | 추천 |
|---|---|
| 1회성 테스트·개발 | ngrok (무료 플랜) |
| 본인이 매번 재실행 OK · 단독 사용 | Cloudflare Quick Tunnel |
| 장기 운영 · 고객 납품 | Cloudflare Workers 중개 서버 |
| 대규모 · 다중 사용자 | VPS + Nginx + Worker 혼합 |
실전 참고: 알고랩에서 제작하는 TradingView 연동 자동매매는 기본적으로 Cloudflare Quick Tunnel 을 자동 실행하는 구조로 제작합니다. 개인 사용자에겐 이 정도로 충분하고, 상업 운영용이면 Workers 중개 서버로 업그레이드합니다. 자세한 견적은 상담에서.