bug: KR 세션별 거래소 미분리 — 스크리닝/주문/이중상장 우선순위 미처리 #409

Open
opened 2026-03-04 09:45:26 +09:00 by agentson · 1 comment
Collaborator

현상

2026-03-04 08:20 KST, NXT_PRE 세션에서 0001A0 BUY 텔레그램 알림 수신.
실제 계좌 확인 시 주문 자체가 없었음.

원인 분석

로그 및 KIS 공식 문서(docs/한국투자증권_오픈API_전체문서_20260221_030000.xlsx) 검토 결과,
세션별 거래소 분리가 전혀 되어 있지 않아 3가지 버그가 연쇄 발생.


Bug 1: 스크리닝 — 세션과 무관하게 KRX만 조회

fetch_market_rankings에서 FID_COND_MRKT_DIV_CODE가 항상 "J" (KRX) 하드코딩.
NXT_PRE / NXT_AFTER 세션에서도 KRX 랭킹을 가져옴.

# src/broker/kis_api.py:402, 419
"FID_COND_MRKT_DIV_CODE": "J",  # 항상 KRX

KIS 공식 문서 기준:

  • "J" = KRX
  • "NX" = NXT
  • FHPST01710000, FHPST01700000 모두 NX 지원

필요 동작: NXT_PRE / NXT_AFTER → "NX", KRX_REG → "J"


Bug 2: 주문 — EXCG_ID_DVSN_CD 미지정으로 KRX 기본값 전송

send_order 바디에 EXCG_ID_DVSN_CD 없음 → KIS 기본값 KRX으로 라우팅.

# src/broker/kis_api.py:344
body = {
    "PDNO": stock_code,
    "ORD_DVSN": ord_dvsn,
    # EXCG_ID_DVSN_CD 없음 → KRX 기본
}

NXT_PRE 세션에서 NXT 종목에 주문을 넣어도 KRX로 전송됨.
KRX 프리마켓 수신 시작(08:20) 후 rt_cd=0 반환되나, 거래소 매칭에서 드롭.
봇은 성공으로 판단 → 텔레그램 알림 오발송 + 유령 포지션 DB 기록.

필요 동작: 세션 기준으로 "KRX" 또는 "NXT" 명시


Bug 3: 이중 상장 종목 — 거래소 우선순위 미고려

KRX + NXT 동시 상장 종목의 경우, 어느 거래소로 주문할지 판단 로직 없음.
스프레드·유동성 비교 또는 SOR(Smart Order Routing) 활용 필요.


재현 조건

  • 세션: NXT_PRE (08:00 ~ 08:50 KST)
  • 종목: NXT 상장 종목 (예: 0001A0)
  • 결과: 주문 오발송 + 텔레그램 오알림

수정 방향

항목 현재 변경
랭킹 스크리닝 항상 "J" 세션별 "J" / "NX" 분기
주문 전송 EXCG_ID_DVSN_CD 없음 세션별 거래소 명시
이중 상장 처리 없음 호가 스프레드 비교 또는 SOR

관련 파일

  • src/broker/kis_api.pyfetch_market_rankings, send_order
  • src/core/order_policy.pyclassify_session_id
  • src/analysis/smart_scanner.py_scan_domestic
## 현상 2026-03-04 08:20 KST, NXT_PRE 세션에서 0001A0 BUY 텔레그램 알림 수신. 실제 계좌 확인 시 주문 자체가 없었음. ## 원인 분석 로그 및 KIS 공식 문서(`docs/한국투자증권_오픈API_전체문서_20260221_030000.xlsx`) 검토 결과, 세션별 거래소 분리가 전혀 되어 있지 않아 3가지 버그가 연쇄 발생. --- ### Bug 1: 스크리닝 — 세션과 무관하게 KRX만 조회 `fetch_market_rankings`에서 `FID_COND_MRKT_DIV_CODE`가 항상 `"J"` (KRX) 하드코딩. NXT_PRE / NXT_AFTER 세션에서도 KRX 랭킹을 가져옴. ```python # src/broker/kis_api.py:402, 419 "FID_COND_MRKT_DIV_CODE": "J", # 항상 KRX ``` KIS 공식 문서 기준: - `"J"` = KRX - `"NX"` = NXT - `FHPST01710000`, `FHPST01700000` 모두 `NX` 지원 **필요 동작:** NXT_PRE / NXT_AFTER → `"NX"`, KRX_REG → `"J"` --- ### Bug 2: 주문 — EXCG_ID_DVSN_CD 미지정으로 KRX 기본값 전송 `send_order` 바디에 `EXCG_ID_DVSN_CD` 없음 → KIS 기본값 KRX으로 라우팅. ```python # src/broker/kis_api.py:344 body = { "PDNO": stock_code, "ORD_DVSN": ord_dvsn, # EXCG_ID_DVSN_CD 없음 → KRX 기본 } ``` NXT_PRE 세션에서 NXT 종목에 주문을 넣어도 KRX로 전송됨. KRX 프리마켓 수신 시작(08:20) 후 `rt_cd=0` 반환되나, 거래소 매칭에서 드롭. 봇은 성공으로 판단 → 텔레그램 알림 오발송 + 유령 포지션 DB 기록. **필요 동작:** 세션 기준으로 `"KRX"` 또는 `"NXT"` 명시 --- ### Bug 3: 이중 상장 종목 — 거래소 우선순위 미고려 KRX + NXT 동시 상장 종목의 경우, 어느 거래소로 주문할지 판단 로직 없음. 스프레드·유동성 비교 또는 SOR(Smart Order Routing) 활용 필요. --- ## 재현 조건 - 세션: `NXT_PRE` (08:00 ~ 08:50 KST) - 종목: NXT 상장 종목 (예: 0001A0) - 결과: 주문 오발송 + 텔레그램 오알림 ## 수정 방향 | 항목 | 현재 | 변경 | |---|---|---| | 랭킹 스크리닝 | 항상 `"J"` | 세션별 `"J"` / `"NX"` 분기 | | 주문 전송 | EXCG_ID_DVSN_CD 없음 | 세션별 거래소 명시 | | 이중 상장 | 처리 없음 | 호가 스프레드 비교 또는 SOR | ## 관련 파일 - `src/broker/kis_api.py` — `fetch_market_rankings`, `send_order` - `src/core/order_policy.py` — `classify_session_id` - `src/analysis/smart_scanner.py` — `_scan_domestic`
Author
Collaborator

Status: OBSERVING (blocked by runtime anomalies)
Observed At: 2026-03-04 10:22 KST, 2026-03-04 01:22 UTC
Environment: live

What was done:

  • feature branch feature/issue-409-kr-session-exchange-routing 기준으로 런타임 재시작 시도
  • scripts/run_overnight.sh 재시작 후 live process 생존 확인 시도
  • fallback으로 직접 실행(.venv/bin/python -m src.main --mode=live --dashboard) 후 관측 루프 시작

Observed:

  • KR 세션 경로는 관측됨 (session=KRX_REG)
  • 프로세스가 startup/sync 직후 종료되어 장시간 관측이 유지되지 않음
  • runtime_verify_monitor.sh도 no-match 경로에서 조기 종료되어 24h unattended 관측이 실패

Evidence:

  • app log: data/overnight/run_manual_issue409_20260304_102209.log
  • monitor log: data/overnight/manual_issue409_monitor_20260304_102231.log
  • runtime verify log: data/overnight/runtime_verify_20260304_101940.log

Linked anomaly tickets:

  • #412 (live runtime exits shortly after startup)
  • #413 (runtime_verify_monitor early exit)

Next:

  • #412/#413 안정화 후 24h monitor 재시도
  • #409/#318/#325 acceptance evidence 재수집
Status: OBSERVING (blocked by runtime anomalies) Observed At: 2026-03-04 10:22 KST, 2026-03-04 01:22 UTC Environment: live What was done: - feature branch `feature/issue-409-kr-session-exchange-routing` 기준으로 런타임 재시작 시도 - `scripts/run_overnight.sh` 재시작 후 live process 생존 확인 시도 - fallback으로 직접 실행(`.venv/bin/python -m src.main --mode=live --dashboard`) 후 관측 루프 시작 Observed: - KR 세션 경로는 관측됨 (`session=KRX_REG`) - 프로세스가 startup/sync 직후 종료되어 장시간 관측이 유지되지 않음 - `runtime_verify_monitor.sh`도 no-match 경로에서 조기 종료되어 24h unattended 관측이 실패 Evidence: - app log: `data/overnight/run_manual_issue409_20260304_102209.log` - monitor log: `data/overnight/manual_issue409_monitor_20260304_102231.log` - runtime verify log: `data/overnight/runtime_verify_20260304_101940.log` Linked anomaly tickets: - #412 (live runtime exits shortly after startup) - #413 (runtime_verify_monitor early exit) Next: - #412/#413 안정화 후 24h monitor 재시도 - #409/#318/#325 acceptance evidence 재수집
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: jihoson/The-Ouroboros#409