+ TradingView 웹훅
TradingView 차트 전략은 손대지 않고 미국주식 실거래로 자동 연결하되, 여러 계좌를 각각 다른 규칙으로 독립 운용하고 싶다 — 이 요청을 한국투자증권 KIS Open API로 구현한 사례입니다. 웹훅 신호가 뜨는 즉시 3개 계좌가 각자 정해진 비율로 매매하고, 손절·장마감 청산까지 24시간 클라우드에서 자동으로 돌아갑니다.
TradingView Pine Script 전략은 그대로 두고, 알림 웹훅을 받는 서버가
한국투자증권 KIS Open API 해외주식 주문(미국 매수 TTTT1002U · 매도 TTTT1006U)으로
변환해 3개 계좌에 각각 다른 비율로 주문을 넣는 구조입니다.
미국 매수는 시장가가 없어 매도호가 + 틱 버퍼 지정가로 즉시 체결을 유도하고,
미체결이면 최신 호가로 자동 재주문합니다. 손절·장마감 청산까지 24시간 클라우드에서 무인 운영됩니다.
고객은 이미 TradingView에서 Pine Script로 미국주식 ETF 매매 전략을 만들어 차트에서 알림을 받고 있었습니다. 문제는 그 신호를 사람이 직접 보고 주문해야 했다는 것. 미국장은 우리 시간으로 밤~새벽에 열려, 신호가 떠도 잠들어 있으면 놓치기 일쑤였습니다.
요청은 명확했습니다. ① TradingView 전략은 그대로 두고, ② 신호가 뜨는 즉시 자동으로 실거래 주문이 나가고, ③ 별도 해외 브로커를 새로 트지 않고 국내 증권사(한국투자증권) 계좌로 운영하는 것. 여기에 더해 여러 계좌를 각각 다른 자금·비율로 독립 운용하고 싶다는 요구가 있었습니다.
실제로는 3개 계좌를 분리해, 계좌마다 예수금·매수 비율·손절 기준을 따로 두고 운용했습니다. 대상은 미국 ETF 몇 종목(예: TQQQ·SOXL 등)으로 한정한 화이트리스트 방식이라, "밤사이 신호가 떠도 사람이 대응하지 않아도 되는 완전 자동화"와 "계좌별 독립 운용" 두 가지가 이 프로젝트의 핵심이었습니다.
TradingView 알림을 받아 실거래로 연결하는 웹훅(Webhook) 브릿지 구조로 설계했습니다. 흐름은 이렇습니다:
TradingView 쪽 전략은 한 줄도 고치지 않고, 알림 메시지 형식만 표준화해 그대로 재사용했습니다. 비전공자인 고객이 직접 입력하는 알림이라, 파서는 플레인 텍스트와 JSON 본문 양쪽을 모두 수용하도록 만들었습니다.
구체적으로는 — 1 TQQQ 매수 같은 텍스트 또는 { "account":1, "ticker":"TQQQ", "side":"buy" }
형태의 JSON을 받아 ① 시크릿 토큰으로 위조 여부 검증 → ② 동일 신호 5초 내 재수신 폐기 →
③ 계좌·종목·방향으로 파싱해 해당 계좌 주문으로 변환하는 순서로 처리합니다.
계좌마다 인증과 주문 큐를 분리한 덕분에, 한 계좌에서 일어난 일이 다른 계좌에 영향을 주지 않습니다.
하나의 웹훅 수신 서버가 신호를 계좌·종목·방향으로 파싱해 3개 계좌로 정확히 갈래를 나누고(다계좌 라우팅), 한 계좌 인증이 실패해도 나머지 계좌는 그대로 돌아가도록 격리했습니다. KIS 접근 토큰은 24시간이면 만료되므로 만료 전 선제 재발급하고, 해외주식 시세는 세션 충돌이 잦은 WebSocket 대신 REST 폴링으로 일원화해 장시간 무중단 운영의 안정성을 확보했습니다.
실제로 오가는 데이터가 어떻게 생겼는지가 이 구조에서 가장 궁금한 지점이라, 형식만 공개합니다 (계좌번호·키 값은 전부 플레이스홀더입니다).
① TradingView 알림 본문 — 비전공자도 직접 고칠 수 있도록 텍스트·JSON 양쪽을 받습니다.
// JSON 형태
{ "secret": "<사전 공유 토큰>",
"account": 1, // 1~3 : 어느 계좌로 보낼지
"ticker": "TQQQ",
"side": "buy" }
// 플레인 텍스트 형태 (같은 의미)
1 TQQQ 매수
② 수신 서버가 만드는 KIS 해외주식 주문 — 계좌별 설정에서 수량·틱 버퍼를 계산해 채웁니다.
POST /uapi/overseas-stock/v1/trading/order
tr_id: TTTT1002U # 미국 매수 (매도는 TTTT1006U)
# 모의투자: 매수 VTTT1002U / 매도 VTTT1001U
{
"CANO": "<계좌 8자리>",
"ACNT_PRDT_CD": "<상품코드 2자리>",
"OVRS_EXCG_CD": "NASD", // NASD · NYSE · AMEX
"PDNO": "TQQQ",
"ORD_QTY": "12",
"OVRS_ORD_UNPR": "78.42", // 매도호가 + 틱 버퍼
"ORD_SVR_DVSN_CD": "0",
"ORD_DVSN": "00" // 00 지정가
}
한국투자증권 공개 예제 기준으로 미국 매수(TTTT1002U)의 ORD_DVSN은
00 지정가 · 32 LOO(장개시지정가) · 34 LOC(장마감지정가)뿐입니다.
매도(TTTT1006U)에만 31 MOO(장개시시장가) · 33 MOC(장마감시장가)가 추가로 있고,
모의투자 계좌는 양쪽 다 00 지정가만 가능합니다.
그래서 "신호 뜨면 시장가로 던진다"가 성립하지 않고, 공격적 지정가 + 재주문이 필요합니다.
이 코드값은 변경될 수 있으니 KIS Developers 포털의 현재 명세로 확인하십시오
(확인 시점 2026-08-16).
③ 계좌별 설정 — 계좌마다 자금·비율·손절이 독립입니다.
accounts:
- id: 1
cano: "<계좌 8자리>"
buy_ratio: 0.30 # 예수금의 30%
stop_loss_pct: -4.0
tick_buffer: 0.02
sessions: [regular]
- id: 2
cano: "<계좌 8자리>"
buy_amount: 2000 # 고정 금액(USD)
stop_loss_pct: -2.5
tick_buffer: 0.03
sessions: [pre, regular, after]
됩니다. 다만 두 가지가 반드시 붙어야 합니다 — 중복 방지(TradingView가 같은 알림을 재전송하는 경우가 있습니다)와 시크릿 검증(웹훅 주소는 공개 엔드포인트라 아무나 호출할 수 있습니다). 이 사례에서는 동일 신호 5초 내 재수신을 폐기하고 사전 공유 토큰으로 위조 호출을 차단했습니다. 웹훅 연동 자체의 원리는 트레이딩뷰 웹훅 자동매매 가이드에 정리돼 있습니다.
인증과 호출량이 계좌 수만큼 늘어납니다. 토큰 캐시를 계좌별로 분리해야 하고 (KIS access_token 재발급 규칙), 같은 시각에 나가는 호출이 배수가 되어 초당 거래건수 초과(EGW00201)에 먼저 닿습니다. 계좌번호 파라미터를 잘못 채워 나는 오류도 흔한데, 그건 CANO·ACNT_PRDT_CD 정리를 보시면 됩니다.
됩니다. 다만 국내는 장중에 개별 종목이 멈추는 구간이 있어 주문 게이트가 하나 더 필요합니다 — VI(변동성완화장치) 발동 구간에서는 시장가라도 즉시 체결되지 않기 때문입니다. 증권사 선택 자체를 고민 중이라면 증권사 API 비교부터 보시는 편이 빠릅니다.
이 사례에서 쓰인 KIS 해외주식 주문 API의 tr_id·거래소코드·ORD_DVSN 명세는
KIS API 미국주식 주문 — TTTT1002U와 ORD_DVSN에 따로 정리해 뒀습니다.
TradingView 전략이 이미 있으셔도, 아직 아이디어 단계여도 괜찮습니다.
알고랩이 24시간 빠르게 답변드립니다.