feat: 세션 전환 시 리스크 파라미터 동적 재로딩 (#327) #344
Reference in New Issue
Block a user
Delete Branch "feature/issue-327-session-risk-reload"
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?
Summary
_session_risk_overrides)SESSION_RISK_RELOAD_ENABLEDSESSION_RISK_PROFILES_JSONCONFIDENCE_THRESHOLD,US_MIN_PRICE,USD_BUFFER_MINSTOPLOSS_REENTRY_COOLDOWN_MINUTES,OVERNIGHT_EXCEPTION_ENABLEDKR_ATR_STOP_*,STAGED_EXIT_BE_ARM_PCT,STAGED_EXIT_ARM_PCTTest
pytest -q tests/test_main.py -k "resolve_market_setting_uses_session_profile_override or stoploss_cooldown_minutes_uses_session_override or should_force_exit_for_overnight or compute_kr_dynamic_stop_loss_pct or apply_staged_exit_uses_independent_arm_threshold_settings or run_daily_session_applies_staged_exit_override_on_hold"python3 -m py_compile src/main.py src/config.py tests/test_main.pyRefs: #327
Review: PR #344 — feat: 세션 전환 시 리스크 파라미터 동적 재로딩 (#327)
플랜 일치: ✅ ACT-10 정확히 일치
아키텍처: ✅ 잘 설계됨
_resolve_market_setting()— 핵심 추상화. 모든 설정값 조회를 이 함수로 통일하여 세션 오버라이드를 투명하게 적용. 기존 코드 수정이 기계적으로 가능한 구조.default프로파일 + 세션별 프로파일 병합 (세션 우선) — 공통 설정과 세션별 설정을 분리할 수 있어 유연함._SESSION_RISK_LAST_BY_MARKET비교로 변경 시에만 재계산 — 불필요한 반복 계산 방지.코드 품질: ✅ 양호
_coerce_setting_value(): bool/int/float/str 타입별 안전한 변환. bool이 int의 서브클래스인 Python 특성을 고려한 순서(isinstance(default, bool)먼저 체크) — 올바름._session_risk_overrides()호출 — 세션 전환 감지 올바름.테스트: ⚠️ 핵심 경로는 커버되나, 엣지 케이스 부족
test_resolve_market_setting_uses_session_profile_override: US_PRE에서 US_MIN_PRICE=7.5 오버라이드 확인test_stoploss_cooldown_minutes_uses_session_override: NXT_AFTER에서 cooldown=45분 오버라이드 확인_SESSION_RISK_LAST_BY_MARKET,_SESSION_RISK_OVERRIDES_BY_MARKETclearSESSION_RISK_RELOAD_ENABLED=False→ 오버라이드 비활성화 테스트_coerce_setting_value타입 변환 엣지 케이스 (bool 문자열 "true"/"false", 잘못된 int 등)우려사항 (minor)
_SESSION_RISK_PROFILES_RAW/_SESSION_RISK_PROFILES_MAP글로벌 변수가 fixture에서 초기화되지 않음. 현재 테스트에서는 각각 다른 JSON을 사용하므로 캐시 미스가 발생하여 문제없으나, 동일 JSON을 사용하는 테스트가 추가되면 상태 누출 가능. 방어적으로 fixture에 추가 권장.결론: LGTM ✅ — 누락 테스트는 nit 수준, 핵심 기능 동작은 검증됨. 머지 후 엣지 케이스 테스트 보강 권장.
리뷰 확인했고 권장 테스트 항목 반영했습니다.
추가 반영:
SESSION_RISK_RELOAD_ENABLED=False시 오버라이드 미적용 테스트SESSION_RISK_PROFILES_JSON파싱 실패 시 기본값 폴백 테스트_SESSION_RISK_PROFILES_MAP,_SESSION_RISK_PROFILES_RAW) 초기화 추가검증:
pytest -q tests/test_main.py -k "resolve_market_setting_uses_session_profile_override or stoploss_cooldown_minutes_uses_session_override or ignores_profile_when_reload_disabled or falls_back_on_invalid_profile_json or coerces_bool_string_override"(5 passed)python3 -m py_compile tests/test_main.py src/main.py src/config.py반영 커밋:
42c0692Re-review: PR #344 — feat: 세션 전환 시 리스크 파라미터 동적 재로딩 (#327)
이전 리뷰 지적사항 반영 확인
SESSION_RISK_RELOAD_ENABLED=False 테스트: ✅ 추가됨
test_resolve_market_setting_ignores_profile_when_reload_disabled: 프로파일 JSON에 오버라이드가 있어도 RELOAD_ENABLED=False면 기본값(5.0) 반환 확인잘못된 JSON 폴백 테스트: ✅ 추가됨
test_resolve_market_setting_falls_back_on_invalid_profile_json:{invalid-json파싱 실패 시 기본값(5.0) 반환 확인_coerce_setting_value 타입 변환 엣지 케이스 테스트: ✅ 추가됨
test_resolve_market_setting_coerces_bool_string_override: JSON에서"false"문자열이 boolFalse로 변환 확인글로벌 캐시 상태 누출 방지: ✅ 해결
_SESSION_RISK_PROFILES_MAP.clear()+_SESSION_RISK_PROFILES_RAW = "__reset__"추가 — 캐시 무효화로 테스트 간 격리 보장결론: LGTM ✅ — 모든 지적사항 반영 완료