[BE-01] autotrading 도메인 계약 정의

작업 내용 (설계 의도)

변경 사항

후행 티켓 전부가 참조하는 공통 계약을 한 티켓에 모은다. 근거: TDD “인터페이스 시그니처”.

쪼개면 후행이 서로를 기다려 직렬 사슬이 되므로 연관 병목을 하나로 묶는다. 구현체는 만들지 않는다 — 계약만 확정해 wave 2의 8개 티켓이 동시에 열리게 하는 것이 목적이다.

  • enum: ExecutionMode(PAPER/LIVE), RiskTier(T1/T2/T3 — 단계별 종목당 비율·보유 상한·일일 손실 한도율을 enum 자체가 보유), OrderProposalStatus, TradingHaltReason, SellReason
  • 값 객체: TradeCandidate(신호 후보 — 다른 도메인 타입을 담지 않는다), RiskDecision, OcoOrderSpec
  • Gateway interface: ConditionalOrderGateway + OcoOrderSpec (order 도메인 신규 파일 — 기존 OrderGateway.kt는 수정하지 않는다)

분해 정정 (2026-08-27, 구현 중 발견): 최초 분해는 Repository interface 5종·AutoTradingAlertGateway·TradeExecutor를 이 티켓에 넣었으나, 셋 다 시그니처가 Entity를 참조한다 (load(): AutoTradingPolicy, notifyExecuted(fill: TradingFill), buy(proposal: OrderProposal)). Entity는 wave 2(BE-0205) 산출물이므로 BE-01만으로는 컴파일되지 않는다. 따라서 Entity를 참조하는 계약은 각 애그리게이트 티켓으로 이관한다 — Repository interface는 BE-0205가 자기 Entity와 함께, AutoTradingAlertGateway는 BE-09가, TradeExecutor는 BE-10이 정의한다. BE-01은 Entity 의존이 없는 계약만 소유한다. Wave 구조와 Single Writer 검증에는 영향이 없다 (파일 교집합 여전히 ∅).

공용 테스트 헬퍼 선점 소유

이 티켓이 아래를 소유한다. 후행 wave는 소비만 하고 새로 만들지 않는다. 필요한 헬퍼가 생기면 직접 만들지 말고 이 티켓으로 되돌려 보고한다.

헬퍼판정 기준·근거
TradeCandidateFixture등급 경계값(0.5 매수유망 / 0.15 상승주목)을 그대로 쓴다 — ml/app/signal.py#classify가 기준
AutoTradingPolicyFixture모드×단계×킬스위치 조합. 기본값은 PAPER·T1·off — Entity 의존이라 BE-02 가 생성(소유는 계약 티켓 규칙에 따라 여기에 기록)
CostModelParityFixtureml/app/cost_model.py와 교차 검증할 공통 입력·기대값 표. 수수료 0.015%·매도세 0.18%·슬리피지 0.1% 기준 — 타입 의존이라 BE-06 이 생성

의존

  • 없음 (선행 wave)

다이어그램

처리 흐름

해당 없음 — interface·enum·값 객체 정의만 하며 실행 흐름이 없다.

클래스 의존

flowchart LR
    Tier[RiskTier] --> Decision[RiskDecision]
    Candidate[TradeCandidate] --> Decision
    Executor[TradeExecutor interface]
    Repos[Repository interface 5종]
    Alert[AutoTradingAlertGateway]
    Oco[ConditionalOrderGateway] --> Spec[OcoOrderSpec]

테스트 케이스

  • RiskTier.T1이 종목당 10%·보유 5종목·일일 한도 2%를 반환한다.
  • RiskTier.T3가 종목당 20%·보유 4종목·일일 한도 3%를 반환한다.
  • RiskTier.T1.previous()가 최하 단계이므로 T1을 그대로 반환한다(경계값).
  • RiskTier.T3.next()가 최상 단계이므로 T3을 그대로 반환한다(경계값).
  • TradeCandidate가 다른 도메인 패키지 타입을 필드로 갖지 않는다(순수성 검증).