Files
kis_bot/kis_trader/utils/position_sizing.py
Hwang 61c72a8a4c feat(tests): 신규 키움 웹소켓 조건검색 및 실시간 조건검색 테스트 추가
변경 사항
----
- _test_kiwoom_condition_list.py: 키움 웹소켓 조건검색 '목록조회' 기능을 단독으로 테스트하는 스크립트 추가
- _test_kiwoom_condition_realtime.py: 'momentum' 조건식을 실시간으로 등록하고 초기 매칭 종목 리스트 및 실시간 편입/이탈을 수신하는 테스트 스크립트 추가
- _verify_columnar_bitid.py, _verify_shared_e2e_breakout.py, _verify_shared_e2e.py: 공유 메모리 및 dict 간의 데이터 일관성을 검증하는 테스트 추가

영향
----
- 신규 테스트 스크립트 추가로 키움 웹소켓 API의 기능 검증 및 안정성을 높임
- 기존 기능에 대한 영향 없음

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-06 01:27:00 +09:00

42 lines
1.4 KiB
Python

"""
kis_trader.utils.position_sizing — 전략 공통 1회 매수 금액(원)
============================================================
``SLOT_MONEY_DEFAULT``(및 전략별 *_SLOT_MONEY) 를 그대로 쓰고,
과거 ``max_loss / sl_pct`` 로 포지션을 줄이던 방식은 폐기한다.
(금액 손실컷 ``MAX_LOSS_PER_TRADE_KRW`` 는 청산 엔진에서만 사용.)
"""
from __future__ import annotations
from ..utils.env import get_env_int
def invest_qty_for_price(entry_price: float, invest_krw: float) -> int:
"""
1회 투자금으로 살 수 있는 정수 주수.
주가가 투자금보다 비싸면 0 (최소 1주 강제 매수 없음).
"""
if entry_price <= 0 or invest_krw <= 0:
return 0
qty = int(float(invest_krw) / entry_price)
return qty if qty >= 1 else 0
def resolve_invest_amount_krw(
slot_money: int,
*,
max_loss_krw: int = 0,
sl_pct: float = 0.0,
extra_cap: int = 0,
) -> int:
"""
1회 매수에 쓸 금액(원). 기본 = ``slot_money``.
``extra_cap`` > 0 이면 min(slot, extra_cap) — UPDOW 총한도 잔여 등.
``max_loss_krw`` / ``sl_pct`` 는 하위 호환용으로만 받고 투자금 산출에는 미사용.
"""
base = int(slot_money or 0)
if base <= 0:
base = get_env_int("SLOT_MONEY_DEFAULT", 3_000_000)
if extra_cap > 0:
return int(min(base, extra_cap))
return base