candidate 없는 해외 홀딩 종목(NVDA 등)에 대해 이미 호출된
get_overseas_price 응답의 high/low를 활용하여 scanner와 동일한 방식으로
volume_ratio 계산:
intraday_range_pct = (high - low) / price * 100
volume_ratio = max(1.0, volatility_pct / 2.0)
high/low 미제공 시(국내 종목, API 미응답) 기존 기본값 1.0 유지.
implied_rsi는 이미 실API price_change_pct(rate 필드) 기반.
tests/test_main.py: 해외 홀딩 종목 volume_ratio 계산 검증 테스트 추가
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1. WARNING → DEBUG: fallback_stocks 없어도 overseas ranking API로 scanner
정상 동작하므로 오해를 주는 WARNING 레벨을 DEBUG로 낮춤 (2곳)
2. 홀딩 종목 market_data 보강: scanner를 통하지 않은 종목(NVDA 등)에
price_change_pct 기반 implied_rsi와 volume_ratio=1.0 기본값 설정,
scenario_engine 조건 평가 완전화
3. test_main.py: 새로운 동작에 맞게 관련 테스트 2개 업데이트
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
## 변경사항
### #264 — 해외 매수가능금액 조회 API 교체 (frcr_dncl_amt_2 → inquire-psamount)
- TTTS3012R (해외주식 잔고) output2에 frcr_dncl_amt_2 필드가 존재하지 않아
총 가용 현금이 항상 0.00으로 산출되는 문제 수정
- OverseasBroker에 get_overseas_buying_power() 메서드 추가
(TR_ID: 실전 TTTS3007R / 모의 VTTS3007R, ord_psbl_frcr_amt 반환)
- main.py trading_cycle() 및 daily cycle 모두 수정
- 출처: 한국투자증권 오픈API 전체문서 (20260221) — 해외주식 매수가능금액조회 시트
### #265 — get_open_position() HOLD 레코드 필터링 추가
- HOLD 결정도 trades 테이블에 저장되어 BUY 이후 HOLD 기록 시
최신 레코드가 HOLD → get_open_position이 None 반환하는 문제 수정
- 쿼리에 AND action IN ('BUY', 'SELL') 필터 추가
- HOLD 레코드를 제외하고 마지막 BUY/SELL 기록만 확인
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
trading_cycle()의 market_data에 보유 포지션 정보가 없어
Condition requires 'unrealized_pnl_pct' but key missing from market_data 경고 발생.
보유 종목(NVDA 등)의 take-profit/stop-loss 시나리오가 평가 불가하여 HOLD(confidence=0) 고착.
- get_open_position()에 timestamp 컬럼 추가
- market_data 구성 시 open_position 조회 후 아래 키 추가:
- unrealized_pnl_pct: (current_price - entry_price) / entry_price * 100
- holding_days: 매수일로부터 경과 일수
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
mock_settings fixture에 MODE 미지정 시 .env의 MODE=live가 적용되어
paper TR_ID를 검증하는 테스트 3개가 실패.
- test_buy_market_order: VTTT1002U 기대 → TTTT1002U 실제
- test_sell_limit_order: VTTT1001U 기대 → TTTT1006U 실제
- test_us_paper_uses_vttt1004u: VTTT1004U 기대 → TTTT1004U 실제
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
mock_settings fixture에 MODE 미지정 시 .env의 MODE=live가 적용되어
paper TR_ID를 검증하는 테스트 3개가 실패.
- test_buy_market_order: VTTT1002U 기대 → TTTT1002U 실제
- test_sell_limit_order: VTTT1001U 기대 → TTTT1006U 실제
- test_us_paper_uses_vttt1004u: VTTT1004U 기대 → TTTT1004U 실제
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
KIS 공식 문서(20260221) 기준 KEYB(NEXT KEY BUFF)는 Required=Y이나
누락되어 있어 항상 rt_cd=2 오류 발생, fallback 경로로만 실행됨.
- fluctuation/volume 양쪽 params에 KEYB: '' 추가
- GUBN 주석 수정: 0=하락율, 1=상승율 (문서 기준)
- GUBN 값 0→1 수정: 상승율 기준으로 변동성 급등 종목 스캔
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
실전투자 API 설정(.env: 실전 BASE_URL, 계좌번호)을 사용하면서
--mode=paper로 실행하여 TR_ID 불일치 발생.
실전투자 서버에 모의투자 TR_ID(VTTS3012R)를 날려
EGW02004: 실전투자 TR 이 아닙니다. 오류로 해외 거래 전부 실패.
APP_CMD 기본값을 --mode=live로 변경하여 실전투자 TR_ID(TTTS3012R) 사용.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1. stop-loss/take-profit 가드에 current_price > 0 조건 추가 (#251)
- 현재가 API 실패(0.0 반환) 시 loss_pct=-100% 계산으로 오발동되던 문제 수정
- if entry_price > 0 → if entry_price > 0 and current_price > 0
- LLY '주문구분 입력오류'는 이 오발동의 연쇄 결과(overseas_price=0 → ORD_DVSN='01')
2. 해외 주문 가격 소수점을 $1 이상은 2자리로 제한 (#252)
- round(x, 4) → $1+ 종목은 round(x, 2), 페니스탁은 round(x, 4) 유지
- KIS '1$이상 소수점 2자리까지만 가능' 오류(TQQQ) 수정
테스트:
- test_stop_loss_not_triggered_when_current_price_is_zero 추가
- test_overseas_buy_price_rounded_to_2_decimals_for_dollar_plus_stock 추가
- test_overseas_penny_stock_price_keeps_4_decimals 추가
- 기존 overseas limit price 테스트 expected_price 2자리로 갱신
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>