fix: 데이트레이딩 보유 종목이 화면에 안 보이던 문제 — 엔진 포지션 직접 표시

Portfolio 테이블은 stock_code가 unique라 같은 종목을 스윙+데이트레이딩으로 동시 보유하면
한 행에 합쳐지고 strategy_type도 하나만 남는다(LG씨엔에스 스윙 8 + DT 4 = 12주 'swing').
- 프론트: /daytrading/positions(엔진 인메모리)를 직접 조회해 '데이트레이딩' 그룹으로 표시하고,
  스윙 행에서는 그 수량을 차감
- 백엔드 동기화: 전량이 DT 포지션일 때만 'daytrading' 태깅 (부분 혼재 시 스윙 청산 대상 유지)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-23 09:33:14 +09:00
parent 9fd02932fa
commit fd8a0f1188
3 changed files with 76 additions and 7 deletions

View File

@@ -46,3 +46,21 @@ async def test_reflect_sell_unknown_holding_does_not_zero_db():
with patch("app.services.db_worker.enqueue_portfolio_upsert", q):
await bridge.reflect_sell("000660", 5, 100000.0)
q.assert_not_awaited()
@pytest.mark.asyncio
async def test_dt_and_swing_same_stock_quantities_are_separable():
"""같은 종목을 스윙+DT로 보유해도 화면상 수량이 분리 가능해야 한다.
Portfolio는 종목당 1행(stock_code unique)이므로 합계만 남는다 →
프론트는 엔진 포지션 수량을 빼서 스윙 수량을 계산한다. 여기서는 그 계산식을 검증.
"""
q = AsyncMock()
with patch("app.services.db_worker.enqueue_portfolio_upsert", q):
await bridge.reflect_buy("064400", "LG씨엔에스", 8, 70148.0, strategy_type="swing")
await bridge.reflect_buy("064400", "LG씨엔에스", 4, 70800.0, strategy_type="daytrading")
row = portfolio_cache.holdings[0]
assert row.quantity == 12
dt_qty = 4
assert row.quantity - dt_qty == 8 # 스윙 잔량