fix: overseas order rt_cd check + limit price premium + paper cash fallback (#151) #152
Reference in New Issue
Block a user
Delete Branch "feature/issue-151-overseas-order-fixes"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
문제 요약 (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% 프리미엄
current_price * 1.005current_price(프리미엄 없음)4. PAPER_OVERSEAS_CASH 폴백
PAPER_OVERSEAS_CASH = 50000.0(USD) 설정 추가trading_cycle(),run_daily_session()모두 적용5. 후보 종목 가격 폴백
변경 파일
src/broker/overseas.py_PRICE_EXCHANGE_MAP추가, 가격 API에 적용, rt_cd 로깅 개선src/config.pyPAPER_OVERSEAS_CASH설정 추가src/main.pytests/test_overseas_broker.pyTestPriceExchangeMap,TestOrderRtCdCheck,TestPaperOverseasCash추가tests/test_main.pytest_overseas_buy_order_uses_limit_price기대값 업데이트 (182.5 → 183.4125, BUY 프리미엄 반영)테스트 결과
리베이스 충돌 해결 내역
#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
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>dfb418c7b2to24fa22e77b