feat: 해외주식 미체결 SELL 시 이중 매수 방지 (#195) #200

Merged
jihoson merged 1 commits from feature/issue-195-overseas-double-buy-prevention into main 2026-02-23 05:53:25 +09:00
Collaborator

Summary

  • trading_cycle(): DB가 포지션 종료로 기록했더라도 해외 브로커 라이브 잔고(output1)를 추가로 확인해 BUY를 억제
  • run_daily_session(): 동일 패턴의 BUY 중복 방지 로직 신규 추가 (기존엔 없었음)
  • 두 함수 모두 이미 fetch된 balance_data 재사용 → 추가 API 호출 없음

Root Cause

KIS VTS SELL 지정가 주문은 접수 즉시 rt_cd=0 반환 → log_trade(SELL) 기록 → DB 포지션 "종료".
다음 사이클에서 get_open_position() = None → BUY 통과 → 이중 매수 발생.

Changes

파일 변경 내용
src/main.py trading_cycle() BUY 게이팅에 브로커 잔고 fallback 추가
src/main.py run_daily_session() BUY 중복 방지 로직 신규 삽입
tests/test_main.py TestOverseasBrokerIntegration 클래스 + 테스트 2개

Test plan

  • test_overseas_buy_suppressed_by_broker_balance_when_db_shows_closed — DB 종료 + 브로커 보유 → BUY 억제
  • test_overseas_buy_proceeds_when_broker_shows_no_holding — DB/브로커 모두 없음 → BUY 진행 (회귀)
  • 전체 742개 테스트 통과
  • 커버리지 77% 유지

Closes #195

🤖 Generated with Claude Code

## Summary - `trading_cycle()`: DB가 포지션 종료로 기록했더라도 해외 브로커 라이브 잔고(`output1`)를 추가로 확인해 BUY를 억제 - `run_daily_session()`: 동일 패턴의 BUY 중복 방지 로직 신규 추가 (기존엔 없었음) - 두 함수 모두 이미 fetch된 `balance_data` 재사용 → 추가 API 호출 없음 ## Root Cause KIS VTS SELL 지정가 주문은 접수 즉시 `rt_cd=0` 반환 → `log_trade(SELL)` 기록 → DB 포지션 "종료". 다음 사이클에서 `get_open_position()` = None → BUY 통과 → **이중 매수 발생**. ## Changes | 파일 | 변경 내용 | |------|-----------| | `src/main.py` | `trading_cycle()` BUY 게이팅에 브로커 잔고 fallback 추가 | | `src/main.py` | `run_daily_session()` BUY 중복 방지 로직 신규 삽입 | | `tests/test_main.py` | `TestOverseasBrokerIntegration` 클래스 + 테스트 2개 | ## Test plan - [x] `test_overseas_buy_suppressed_by_broker_balance_when_db_shows_closed` — DB 종료 + 브로커 보유 → BUY 억제 - [x] `test_overseas_buy_proceeds_when_broker_shows_no_holding` — DB/브로커 모두 없음 → BUY 진행 (회귀) - [x] 전체 742개 테스트 통과 - [x] 커버리지 77% 유지 Closes #195 🤖 Generated with [Claude Code](https://claude.com/claude-code)
agentson added 1 commit 2026-02-23 05:52:51 +09:00
feat: 해외주식 미체결 SELL 시 이중 매수 방지 (#195)
Some checks failed
CI / test (pull_request) Has been cancelled
1242794fc4
KIS VTS는 SELL 지정가 주문을 접수 즉시 rt_cd=0으로 반환하지만
실제 체결은 시장가 도달 시까지 지연된다. 이 기간 동안 DB는 포지션을
"종료"로 기록해 다음 사이클에서 이중 매수가 발생할 수 있었다.

- trading_cycle(): BUY 게이팅에 브로커 잔고 추가 확인 로직 삽입
- run_daily_session(): 동일 패턴의 BUY 중복 방지 로직 추가
- 두 함수 모두 이미 fetch된 balance_data 재사용 (추가 API 호출 없음)
- TestOverseasBrokerIntegration 클래스에 테스트 2개 추가

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
jihoson merged commit cd36d53a47 into main 2026-02-23 05:53:25 +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#200