[BE-13] RunAutoTradingCycleUseCase

작업 내용 (설계 의도)

변경 사항

자동매매 사이클의 진입 UseCase를 만든다. 크로스 컨텍스트 조합이 이 티켓의 핵심 책임이다 — signal·stock·account 도메인의 데이터를 autotrading이 직접 읽지 않고, application이 소유 도메인 DomainService를 호출해 받은 뒤 매퍼가 TradeCandidate로 변환한다(no-crosscontext-raw-read).

  • 신호: signal DomainService에서 최신 스냅샷 조회
  • 현재가: stock DomainService (stock_price_cache)
  • 계좌: account DomainService (LIVE 모드에서만)
  • 유니버스 필터: KRX 6자리 숫자 심볼만 통과시킨다(PRD FR-16 — 미국 82종목 배제)
  • 장 운영일·시간 확인: 휴장·시간 외에는 주문을 만들지 않고, 장 마감 5분 전부터 신규 진입을 중단한다

execute()는 10줄 이내로 유지하고 비즈니스 로직을 담지 않는다. 사이클 중복 실행은 trading_days 행 비관적 락으로 막는다.

의존

  • BE-11 (AutoTradingDomainService)

다이어그램

처리 흐름

sequenceDiagram
    participant UC as RunAutoTradingCycleUseCase
    participant Sig as signal DomainService
    participant Stk as stock DomainService
    participant Map as TradeCandidateMapper
    participant Svc as AutoTradingDomainService
    UC->>Sig: 최신 시그널 스냅샷
    UC->>Stk: 현재가 조회
    UC->>Map: 매핑 (KRX 필터)
    Map-->>UC: List of TradeCandidate
    UC->>Svc: runCycle(candidates)

클래스 의존

flowchart LR
    UC[RunAutoTradingCycleUseCase] --> Sig[signal DomainService]
    UC --> Stk[stock DomainService]
    UC --> Map[TradeCandidateMapper]
    UC --> Svc[AutoTradingDomainService]
    Map --> Cand[TradeCandidate]

테스트 케이스

  • 신호 스냅샷이 TradeCandidate로 변환돼 도메인 서비스에 전달된다.
  • 미국 종목(6자리 숫자가 아닌 심볼)이 후보에서 제외된다.
  • 휴장일에는 후보를 만들지 않는다.
  • 장 마감 5분 전 이후에는 신규 진입 후보를 만들지 않는다(경계값).
  • 이전 사이클이 진행 중이면 즉시 반환한다(중복 실행 방지).
  • execute()가 다른 도메인의 Repository를 직접 참조하지 않는다(레이어 검증).