feat: 해외주식 실제 체결 잔고 동기화 — KIS 잔고 조회 API 연동 #195

Closed
opened 2026-02-21 21:07:35 +09:00 by agentson · 0 comments
Collaborator

배경

PR #194 코드 리뷰에서 발견된 구조적 한계.

현재 trades 테이블은 주문 접수 성공(rt_cd=0) 시점에 기록되며, 실제 체결 여부와 무관하다.

문제

해외주식은 KIS VTS가 시장가 주문을 거부하므로 지정가(ORD_DVSN=00)를 사용한다 (src/main.py:719-723):

  • SELL 지정가 주문 접수됨 → trades에 SELL 기록
  • 시장이 움직여 미체결 → 실제로는 포지션이 남아있음
  • /api/positionsget_open_position()이 포지션 없음으로 잘못 판단
  • 다음 사이클에서 동일 종목 BUY 가능해져 실제 잔고 초과 매수 위험

국내주식은 시장가(price=0)이므로 즉시 전량 체결 보장 → 이 문제 없음.

해결 방향

KIS 잔고 조회 API를 주기적으로 폴링하여 실제 체결 잔고와 DB를 동기화한다.

  • 국내: TTTC8434R (주식잔고조회)
  • 해외: TTTS3012R (해외주식 잔고조회)

동기화 주기: 매 트레이딩 사이클 시작 시 또는 SELL 주문 후 N분 이내

영향 범위

  • src/broker/kis_api.py — 국내 잔고 조회 메서드 추가
  • src/broker/overseas.py — 해외 잔고 조회 메서드 추가
  • src/db.py — 잔고 동기화 함수 추가
  • src/main.py — 사이클 시작 시 잔고 동기화 호출
  • /api/positions — 동기화된 잔고 기반으로 포지션 반환 (또는 실시간 KIS API 조회)

우선순위

Medium — 현재는 모의투자(VTS) 환경이며 실전 전환 전 반드시 해결 필요

## 배경 PR #194 코드 리뷰에서 발견된 구조적 한계. 현재 `trades` 테이블은 **주문 접수 성공(rt_cd=0)** 시점에 기록되며, 실제 체결 여부와 무관하다. ## 문제 해외주식은 KIS VTS가 시장가 주문을 거부하므로 지정가(ORD_DVSN=00)를 사용한다 (`src/main.py:719-723`): - SELL 지정가 주문 접수됨 → `trades`에 SELL 기록 - 시장이 움직여 미체결 → 실제로는 포지션이 남아있음 - `/api/positions` 및 `get_open_position()`이 포지션 없음으로 잘못 판단 - 다음 사이클에서 동일 종목 BUY 가능해져 실제 잔고 초과 매수 위험 국내주식은 시장가(price=0)이므로 즉시 전량 체결 보장 → 이 문제 없음. ## 해결 방향 KIS 잔고 조회 API를 주기적으로 폴링하여 실제 체결 잔고와 DB를 동기화한다. - 국내: `TTTC8434R` (주식잔고조회) - 해외: `TTTS3012R` (해외주식 잔고조회) 동기화 주기: 매 트레이딩 사이클 시작 시 또는 SELL 주문 후 N분 이내 ## 영향 범위 - `src/broker/kis_api.py` — 국내 잔고 조회 메서드 추가 - `src/broker/overseas.py` — 해외 잔고 조회 메서드 추가 - `src/db.py` — 잔고 동기화 함수 추가 - `src/main.py` — 사이클 시작 시 잔고 동기화 호출 - `/api/positions` — 동기화된 잔고 기반으로 포지션 반환 (또는 실시간 KIS API 조회) ## 우선순위 Medium — 현재는 모의투자(VTS) 환경이며 실전 전환 전 반드시 해결 필요
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: jihoson/The-Ouroboros#195