fix: overseas order rt_cd check + limit price premium + paper cash fallback (#151) #152

Merged
jihoson merged 1 commits from feature/issue-151-overseas-order-fixes into main 2026-02-19 06:01:54 +09:00
Collaborator

문제 요약 (Issue #151)

해외주식 주문이 KIS VTS에서 실제로 체결되지 않는 세 가지 원인 수정.

수정 내용

1. 가격 API 거래소 코드 매핑

get_overseas_price()_PRICE_EXCHANGE_MAP 적용 (NASD→NAS, NYSE→NYS, AMEX→AMS).
가격 API HHDFS00000300은 랭킹 API와 동일한 짧은 코드 형식 요구.

2. rt_cd 체크 + log_trade() 실패 시 건너뜀

send_overseas_order(): rt_cd != "0" 시 INFO 대신 WARNING 로그.
main.py: rt_cd == "0" 확인 후에만 log_trade() 호출.
→ 잔고 부족("주문가능금액이 부족합니다") 등 실패 주문이 DB에 BUY로 기록되는 문제 해결.

3. BUY 지정가 0.5% 프리미엄

  • BUY: current_price * 1.005
  • SELL: current_price (프리미엄 없음)
  • KIS VTS는 지정가만 허용, last 가격이 ask보다 낮으면 미체결 → 0.5% 프리미엄으로 체결 확률 향상

4. PAPER_OVERSEAS_CASH 폴백

  • PAPER_OVERSEAS_CASH = 50000.0 (USD) 설정 추가
  • VTS 해외 잔고 API 실패 시 이 값으로 시뮬레이션 잔고 대체
  • trading_cycle(), run_daily_session() 모두 적용

5. 후보 종목 가격 폴백

  • 가격 API가 0 반환 시 스캐너 candidate.price로 대체

변경 파일

파일 변경 내용
src/broker/overseas.py _PRICE_EXCHANGE_MAP 추가, 가격 API에 적용, rt_cd 로깅 개선
src/config.py PAPER_OVERSEAS_CASH 설정 추가
src/main.py paper cash 폴백, 가격 폴백, BUY 프리미엄, rt_cd 체크, log_trade 실패 시 skip
tests/test_overseas_broker.py TestPriceExchangeMap, TestOrderRtCdCheck, TestPaperOverseasCash 추가
tests/test_main.py test_overseas_buy_order_uses_limit_price 기대값 업데이트 (182.5 → 183.4125, BUY 프리미엄 반영)

테스트 결과

618 passed in 16.2s (coverage: 76%)
TestPriceExchangeMap: 5 tests ✓
TestOrderRtCdCheck: 2 tests ✓
TestPaperOverseasCash: 3 tests ✓

리베이스 충돌 해결 내역

#148, #150 머지 후 main 기준으로 리베이스.

  • src/main.py: paper cash fallback 로그 (market.exchange_code 사용), 주문 가격 (order_price 유지)
  • tests/test_overseas_broker.py: 중복 클래스 제거, TestOrderRtCdCheck 신규 추가
  • tests/test_main.py: BUY 프리미엄 도입으로 기대값 182.5 → 183.4125 수정

Closes #151

## 문제 요약 (Issue #151) 해외주식 주문이 KIS VTS에서 실제로 체결되지 않는 세 가지 원인 수정. ## 수정 내용 ### 1. 가격 API 거래소 코드 매핑 `get_overseas_price()`에 `_PRICE_EXCHANGE_MAP` 적용 (NASD→NAS, NYSE→NYS, AMEX→AMS). 가격 API HHDFS00000300은 랭킹 API와 동일한 짧은 코드 형식 요구. ### 2. rt_cd 체크 + log_trade() 실패 시 건너뜀 `send_overseas_order()`: `rt_cd != "0"` 시 INFO 대신 WARNING 로그. `main.py`: `rt_cd == "0"` 확인 후에만 `log_trade()` 호출. → 잔고 부족("주문가능금액이 부족합니다") 등 실패 주문이 DB에 BUY로 기록되는 문제 해결. ### 3. BUY 지정가 0.5% 프리미엄 - BUY: `current_price * 1.005` - SELL: `current_price` (프리미엄 없음) - KIS VTS는 지정가만 허용, last 가격이 ask보다 낮으면 미체결 → 0.5% 프리미엄으로 체결 확률 향상 ### 4. PAPER_OVERSEAS_CASH 폴백 - `PAPER_OVERSEAS_CASH = 50000.0` (USD) 설정 추가 - VTS 해외 잔고 API 실패 시 이 값으로 시뮬레이션 잔고 대체 - `trading_cycle()`, `run_daily_session()` 모두 적용 ### 5. 후보 종목 가격 폴백 - 가격 API가 0 반환 시 스캐너 candidate.price로 대체 ## 변경 파일 | 파일 | 변경 내용 | |------|----------| | `src/broker/overseas.py` | `_PRICE_EXCHANGE_MAP` 추가, 가격 API에 적용, rt_cd 로깅 개선 | | `src/config.py` | `PAPER_OVERSEAS_CASH` 설정 추가 | | `src/main.py` | paper cash 폴백, 가격 폴백, BUY 프리미엄, rt_cd 체크, log_trade 실패 시 skip | | `tests/test_overseas_broker.py` | `TestPriceExchangeMap`, `TestOrderRtCdCheck`, `TestPaperOverseasCash` 추가 | | `tests/test_main.py` | `test_overseas_buy_order_uses_limit_price` 기대값 업데이트 (182.5 → 183.4125, BUY 프리미엄 반영) | ## 테스트 결과 ``` 618 passed in 16.2s (coverage: 76%) TestPriceExchangeMap: 5 tests ✓ TestOrderRtCdCheck: 2 tests ✓ TestPaperOverseasCash: 3 tests ✓ ``` ## 리베이스 충돌 해결 내역 #148, #150 머지 후 main 기준으로 리베이스. - `src/main.py`: paper cash fallback 로그 (`market.exchange_code` 사용), 주문 가격 (`order_price` 유지) - `tests/test_overseas_broker.py`: 중복 클래스 제거, `TestOrderRtCdCheck` 신규 추가 - `tests/test_main.py`: BUY 프리미엄 도입으로 기대값 182.5 → 183.4125 수정 Closes #151
agentson added 1 commit 2026-02-19 05:44:41 +09:00
fix: overseas order rt_cd check, limit price premium, paper cash fallback (#151)
Some checks failed
CI / test (pull_request) Has been cancelled
dfb418c7b2
Three fixes for overseas stock trading failures:

1. Price API exchange code mapping:
   - get_overseas_price() now applies _PRICE_EXCHANGE_MAP (NASD→NAS, NYSE→NYS, AMEX→AMS)
   - Price API HHDFS00000300 requires short exchange codes same as ranking API

2. rt_cd check in send_overseas_order():
   - Log WARNING (not INFO) when rt_cd != "0" (e.g., "주문가능금액이 부족합니다")
   - Caller (main.py) checks rt_cd == "0" before calling log_trade()
   - Prevents DB from recording failed orders as successful trades

3. Limit order price premium for BUY:
   - BUY limit price = current_price * 1.005 (0.5% premium)
   - SELL limit price = current_price (no premium)
   - Improves fill probability: KIS VTS only accepts limit orders,
     and last price is typically at or below ask

4. PAPER_OVERSEAS_CASH fallback (config + main.py):
   - New setting: PAPER_OVERSEAS_CASH = 50000.0 (USD)
   - When VTS overseas balance API fails/returns 0, use this as simulated cash
   - Applied in both trading_cycle() and run_daily_session()

5. Candidate price fallback:
   - If price API returns 0, use scanner candidate price as fallback

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
agentson force-pushed feature/issue-151-overseas-order-fixes from dfb418c7b2 to 24fa22e77b 2026-02-19 05:58:20 +09:00 Compare
jihoson merged commit c76e2dfed5 into main 2026-02-19 06:01:54 +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#152