[BE-12] 정산·리스크 단계평가 도메인 서비스

작업 내용 (설계 의도)

변경 사항

일 마감 정산과 사다리 승강급 판정을 만든다. 둘 다 거래일·체결 이력을 읽어 판단하므로 한 티켓으로 묶는다.

  • TradingSettlementDomainService — 장 마감 후 당일 체결을 집계해 거래일 실현손익을 확정하고, 미승인 PENDING 제안을 EXPIRED로 만료시킨다. 시스템 체결 기록과 토스 체결 내역 대조 결과를 남긴다(PRD “마감 점검”).
  • RiskTierPromotionDomainService — 승급·강등 판정. 승급 트리거는 수익률이 아니라 운영 지표다(20거래일 무중단·집행 실패 0건·한도 위반 0건·슬리피지 ±0.3%p 이내). T3만 엣지 t > 2를 추가로 요구한다. 총자본 -5% 도달 시 즉시 자동 강등한다.

승급은 판정만 하고 사용자 확인을 기다린다. 강등은 확인 없이 적용한다 — 비대칭이 의도다(PRD FR-38).

의존

  • BE-02, BE-03, BE-04, BE-05

다이어그램

처리 흐름

sequenceDiagram
    participant Sch as 마감 스케줄러
    participant Set as TradingSettlementDomainService
    participant Tier as RiskTierPromotionDomainService
    participant Policy as AutoTradingPolicy
    Sch->>Set: settle(tradeDate)
    Set-->>Sch: 실현손익 확정 + 제안 만료
    Sch->>Tier: evaluate()
    Tier->>Policy: demoteTier() (총자본 -5%)

클래스 의존

flowchart LR
    Set[TradingSettlementDomainService] --> DayRepo[TradingDayRepository]
    Set --> FillRepo[TradingFillRepository]
    Set --> PropRepo[OrderProposalRepository]
    Tier[RiskTierPromotionDomainService] --> DayRepo
    Tier --> FillRepo
    Tier --> PolicyRepo[AutoTradingPolicyRepository]

테스트 케이스

  • 마감 시 당일 체결을 집계해 거래일 실현손익이 확정된다.
  • 마감 시 미승인 PENDING 제안이 EXPIRED로 전이한다.
  • 20거래일 무중단 + 집행 실패 0 + 한도 위반 0 + 슬리피지 이내면 T1→T2 승급 판정을 낸다.
  • 집행 실패가 1건이라도 있으면 승급 판정이 나오지 않는다.
  • 수익이 났어도 운영 지표가 미달이면 승급하지 않는다(트리거가 수익률이 아님).
  • 총자본 -5% 도달 시 사용자 확인 없이 즉시 강등된다.
  • T1에서 -5%에 도달하면 강등 대신 MDD 경고만 낸다(최하 단계 경계).
  • 승급 판정은 정책을 바꾸지 않고 후보 단계만 반환한다(사용자 확인 대기).