TradingView 웹훅
TradingView 차트 전략은 손대지 않고 미국주식 실거래에 연결하되, 계좌 여러 개를 각각 다른 규칙으로 따로 굴리고 싶다는 요청이었습니다. 한국투자증권 KIS Open API로 만들었습니다. 웹훅 신호가 오면 3개 계좌가 각자 정해진 비율로 매매하고, 손절과 장마감 청산까지 클라우드에서 24시간 돌아갑니다.
TradingView Pine Script 전략은 그대로 둡니다. 알림 웹훅을 받은 서버가 이를 한국투자증권 KIS Open API의 해외주식 주문으로 바꿔 3개 계좌에 각각 다른 비율로 넣습니다. 미국주식 매수에는 시장가가 없어서 매도호가에 틱 버퍼를 더한 지정가로 주문하고, 체결되지 않으면 최신 호가로 다시 주문합니다.
고객은 이미 TradingView에서 Pine Script로 미국주식 ETF 매매 전략을 만들어 차트 알림을 받고 있었습니다. 다만 신호를 보고 주문은 직접 넣어야 했습니다. 미국장은 우리 시간으로 밤부터 새벽까지 열리니, 자는 동안 뜬 신호는 놓치기 일쑤였습니다.
요청은 이랬습니다. TradingView 전략은 그대로 두고, 신호가 뜨면 바로 실거래 주문이 나갈 것. 해외 브로커를 새로 트지 않고 한국투자증권 계좌로 운영할 것. 여기에 계좌 여러 개를 각각 다른 자금과 비율로 따로 운용하고 싶다는 요구가 더해졌습니다.
실제로는 3개 계좌로 나눠, 계좌마다 예수금, 매수 비율, 손절 기준을 따로 두었습니다. 대상은 미국 ETF 몇 종목(예: TQQQ, SOXL)으로 한정했고 목록에 없는 종목은 주문하지 않습니다. 밤사이 신호에 사람이 대응하지 않아도 되는 것, 그리고 계좌마다 따로 운용되는 것이 이 작업에서 가장 중요했습니다.
TradingView 알림을 받아 실거래로 넘기는 웹훅 서버를 가운데에 두었습니다.
TradingView 쪽 전략은 한 줄도 고치지 않았습니다. 알림 메시지 형식만 정해서 그대로 썼습니다. 고객이 직접 입력하는 알림이라 일반 텍스트와 JSON을 둘 다 받게 했습니다.
1 TQQQ 매수 같은 텍스트나 같은 내용의 JSON이 오면, 먼저 시크릿 토큰으로 위조 여부를 확인합니다.
같은 신호가 5초 안에 다시 오면 버립니다. 그다음 계좌, 종목, 방향을 읽어 해당 계좌의 주문으로 바꿉니다.
계좌마다 인증과 주문 대기열을 분리해서, 한 계좌에서 생긴 일이 다른 계좌에 영향을 주지 않습니다.
웹훅 수신 서버 하나가 신호를 계좌, 종목, 방향으로 읽어 3개 계좌로 나눠 보냅니다. 한 계좌의 인증이 실패해도 나머지 계좌는 그대로 돌아갑니다. KIS 접근 토큰은 24시간이면 만료되므로 만료 전에 미리 다시 발급받습니다. 해외주식 시세는 세션 충돌이 잦은 WebSocket을 쓰지 않고 REST 조회로 통일했습니다.
실제로 오가는 데이터의 형식만 공개합니다. 계좌번호와 키 값은 전부 자리 표시입니다.
TradingView 알림 본문은 고객이 직접 고칠 수 있게 텍스트와 JSON을 둘 다 받습니다.
텍스트라면 1 TQQQ 매수처럼 계좌 번호(1~3), 종목, 방향을 적습니다. JSON에는 미리 정한 토큰이 함께 들어갑니다.
수신 서버는 이 메시지를 아래와 같은 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 지정가
}
한국투자증권 공개 예제 기준으로 미국 매수 주문의 주문 구분(ORD_DVSN)은
00 지정가, 32 LOO(장개시지정가), 34 LOC(장마감지정가)뿐입니다.
매도에만 31 MOO(장개시시장가)와 33 MOC(장마감시장가)가 더 있고,
모의투자 계좌는 양쪽 다 00 지정가만 됩니다.
그래서 신호가 뜨면 시장가로 던지는 방식은 쓸 수 없고, 호가에 바짝 붙인 지정가와 재주문이 필요합니다.
이 코드값은 바뀔 수 있으니 KIS Developers 포털의 현재 명세로 확인하십시오
(확인 시점 2026-08-16).
계좌별 설정은 서로 독립입니다. 예를 들어 1번 계좌는 예수금의 30%를 매수하고 -4.0%에 손절하며 정규장에만 거래합니다. 2번 계좌는 고정 금액 2,000달러, 손절 -2.5%에 프리마켓부터 애프터마켓까지 거래하도록 둘 수 있습니다.
됩니다. 다만 두 가지가 꼭 있어야 합니다. TradingView가 같은 알림을 다시 보내는 경우가 있어서 중복 방지가 필요하고, 웹훅 주소는 누구나 호출할 수 있어서 시크릿 검증이 필요합니다. 이 사례에서는 같은 신호가 5초 안에 다시 오면 버리고, 미리 정한 토큰으로 위조 호출을 막았습니다. 웹훅 연동의 원리는 트레이딩뷰 웹훅 자동매매 가이드에 적어 두었습니다.
인증과 호출량이 계좌 수만큼 늘어납니다. 토큰을 계좌별로 따로 관리해야 하고 (KIS access_token 재발급 규칙), 같은 시각에 나가는 호출이 몇 배가 되어 초당 거래건수 초과(EGW00201)에 먼저 걸립니다. 계좌번호 항목을 잘못 채워서 나는 오류도 흔합니다. 그건 CANO와 ACNT_PRDT_CD 정리를 보시면 됩니다.
됩니다. 다만 국내는 장중에 개별 종목 거래가 잠깐 멈추는 구간이 있어서 주문 전에 확인할 것이 하나 더 있습니다. VI(변동성완화장치) 발동 구간에서는 시장가 주문도 바로 체결되지 않습니다. 증권사를 아직 고르는 중이라면 증권사 API 비교부터 보시기를 권합니다.
이 사례에서 쓴 KIS 해외주식 주문 API의 tr_id, 거래소 코드, ORD_DVSN 명세는
KIS API 미국주식 주문: TTTT1002U와 ORD_DVSN에 따로 적어 두었습니다.
전략이 이미 있으면 알림 형식만 맞추면 됩니다. 아직 구상 단계여도 괜찮습니다.
쓰시는 증권사와 계좌 수를 상담에서 알려 주세요.