fix: 해외잔고 ord_psbl_qty 우선 적용 및 ghost position SELL 반복 방지 (#235) #236

Merged
jihoson merged 2 commits from feature/issue-235-overseas-balance-ord-psbl-qty into main 2026-02-24 06:08:31 +09:00
Collaborator

Summary

Closes #235

근본 원인

모의투자 잔고내역이 없습니다 오류가 반복된 두 가지 원인:

  1. 필드 오류 (주요 원인)

    • _extract_held_codes_from_balance / _extract_held_qty_from_balance가 해외 잔고에서 ovrs_cblc_qty (총 보유수량)를 사용
    • KIS 공식 문서 확인: 실제 매도 가능 수량은 ord_psbl_qty (주문가능수량)
    • MLECW(Warrant 만기물) 등은 ovrs_cblc_qty=289456이지만 ord_psbl_qty=0 → 실제 매도 불가한데 startup sync가 포지션으로 기록하고 SELL 반복 시도
  2. Ghost position 무한 반복

    • SELL 실패 시 DB 포지션이 닫히지 않아 다음 사이클에서 재시도
    • exchange code 불일치(예: KNRX가 NASD로 sync됐지만 AMEX로 SELL 시도) 등 예외 상황에서도 동일

변경 내용

파일 변경
src/main.py 해외 잔고 필드 ovrs_cblc_qtyord_psbl_qty 우선 (fallback 유지), ghost-close 처리 추가
tests/test_main.py ord_psbl_qty=0인 종목 제외 확인 4개 테스트, ghost-close 2개 테스트 추가

효과

  • MLECW, KNRX, NBY, SNSE 등 만료/정지된 종목이 startup sync / SELL 루프에서 자동 제외
  • "잔고없음" 오류 발생 시 DB 포지션 자동 종료로 무한 반복 차단

Test plan

  • TestExtractHeldQtyFromBalanceord_psbl_qty=0 시 qty=0 반환
  • TestExtractHeldCodesFromBalanceord_psbl_qty=0인 종목 제외
  • TestOverseasGhostPositionClose — ghost-close 로그 확인 / 일반 오류는 ghost-close 미실행
  • 전체 865개 테스트 통과

🤖 Generated with Claude Code

## Summary Closes #235 ### 근본 원인 `모의투자 잔고내역이 없습니다` 오류가 반복된 두 가지 원인: 1. **필드 오류 (주요 원인)** - `_extract_held_codes_from_balance` / `_extract_held_qty_from_balance`가 해외 잔고에서 `ovrs_cblc_qty` (총 보유수량)를 사용 - KIS 공식 문서 확인: 실제 매도 가능 수량은 `ord_psbl_qty` (주문가능수량) - MLECW(Warrant 만기물) 등은 `ovrs_cblc_qty=289456`이지만 `ord_psbl_qty=0` → 실제 매도 불가한데 startup sync가 포지션으로 기록하고 SELL 반복 시도 2. **Ghost position 무한 반복** - SELL 실패 시 DB 포지션이 닫히지 않아 다음 사이클에서 재시도 - exchange code 불일치(예: KNRX가 NASD로 sync됐지만 AMEX로 SELL 시도) 등 예외 상황에서도 동일 ### 변경 내용 | 파일 | 변경 | |------|------| | `src/main.py` | 해외 잔고 필드 `ovrs_cblc_qty` → `ord_psbl_qty` 우선 (fallback 유지), ghost-close 처리 추가 | | `tests/test_main.py` | `ord_psbl_qty=0`인 종목 제외 확인 4개 테스트, ghost-close 2개 테스트 추가 | ### 효과 - MLECW, KNRX, NBY, SNSE 등 만료/정지된 종목이 startup sync / SELL 루프에서 자동 제외 - "잔고없음" 오류 발생 시 DB 포지션 자동 종료로 무한 반복 차단 ## Test plan - [x] `TestExtractHeldQtyFromBalance` — `ord_psbl_qty=0` 시 qty=0 반환 - [x] `TestExtractHeldCodesFromBalance` — `ord_psbl_qty=0`인 종목 제외 - [x] `TestOverseasGhostPositionClose` — ghost-close 로그 확인 / 일반 오류는 ghost-close 미실행 - [x] 전체 865개 테스트 통과 🤖 Generated with [Claude Code](https://claude.com/claude-code)
agentson added 1 commit 2026-02-24 05:59:26 +09:00
- _extract_held_codes_from_balance / _extract_held_qty_from_balance:
  해외 잔고 수량 필드를 ovrs_cblc_qty(총 보유수량) → ord_psbl_qty(주문가능수량)
  우선으로 변경. KIS 공식 문서(VTTS3012R) 확인 결과 ord_psbl_qty가 실제
  매도 가능 수량이며, ovrs_cblc_qty는 만료/결제 미완료 포지션을 포함함.
  MLECW 등 만료된 Warrant는 ovrs_cblc_qty=289456이지만 ord_psbl_qty=0이라
  startup sync 대상에서 제외되고 SELL 수량도 0이 됨.

- trading_cycle: 해외 SELL이 '잔고내역이 없습니다'로 실패할 때 DB 포지션을
  ghost-close SELL 로그로 닫아 무한 재시도 방지. exchange code 불일치 등
  예외 상황에서 DB가 계속 open 상태로 남는 문제 해소.

- docstring: _extract_held_qty_from_balance 해외 필드 설명 업데이트

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
agentson added 1 commit 2026-02-24 06:00:01 +09:00
docs: requirements-log에 #235 ghost position 수정 기록 추가
Some checks failed
CI / test (pull_request) Has been cancelled
a3a9fd1f24
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
jihoson merged commit 847456e0af into main 2026-02-24 06:08:31 +09:00
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: jihoson/The-Ouroboros#236