fix: 시각 기준 불일치로 시간손절이 즉시 발동해 포지션이 조기 청산되던 문제

재배포로 DB 복원된 데이트레이딩 포지션의 entry_time 이 UTC(구 기본값)라 KST now 와의
차이가 +540분이 되어, 진입 25분 만에 '시간 손절: 565분 경과'로 청산됐다
(2026-09-23 산일전기 -0.5%, 미스토홀딩스 -0.4% — 익절 조건까지 가보지도 못함).
_elapsed_minutes(): 경과가 음수이거나 정규장 길이(390분)를 넘으면 기준 불일치로 보고 무시.
시간손절·트레일링 최소보유 판정 모두 이 헬퍼를 사용.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-23 12:54:22 +09:00
parent ec2fa2b423
commit 5706a8971c
2 changed files with 77 additions and 21 deletions

View File

@@ -0,0 +1,40 @@
"""시간 손절이 시각 기준 불일치로 조기 발동하지 않는지 검증.
2026-09-23: 재배포로 DB 복원된 포지션의 entry_time 이 UTC 라 KST now 와의 차이가 +540분이 되어
진입 25분 만에 '시간 손절: 565분 경과'로 청산됐다(익절까지 가지 못함).
"""
from datetime import datetime, timedelta
import pytz
from app.services.day_trading_strategy import _elapsed_minutes
KST = pytz.timezone("Asia/Seoul")
def _kst_now():
return datetime.now(KST).replace(tzinfo=None)
def test_normal_elapsed_is_returned():
v = _elapsed_minutes(_kst_now() - timedelta(minutes=40))
assert v is not None and 39 < v < 41
def test_utc_entry_time_is_rejected():
"""UTC 로 저장된 진입시각(=KST-9h) → 경과 +540분 → 무시해야 한다."""
utc_entry = _kst_now() - timedelta(hours=9) + timedelta(minutes=25) # 실제 25분 전
assert _elapsed_minutes(utc_entry) is None
def test_future_entry_time_is_rejected():
assert _elapsed_minutes(_kst_now() + timedelta(minutes=5)) is None
def test_none_entry_time():
assert _elapsed_minutes(None) is None
def test_boundary_is_market_day_length():
assert _elapsed_minutes(_kst_now() - timedelta(minutes=389)) is not None
assert _elapsed_minutes(_kst_now() - timedelta(minutes=391)) is None