재배포로 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>
41 lines
1.3 KiB
Python
41 lines
1.3 KiB
Python
"""시간 손절이 시각 기준 불일치로 조기 발동하지 않는지 검증.
|
|
|
|
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
|