Q

PRIVATE NAVIGATION MODE

ML4T_S 탭 잠금 해제

패스워드를 확인하면 이 브라우저에서 ML4T_S 탭과 검색 결과를 표시합니다.

STUDY SEARCH

학습 자료 검색

제목과 설명, 키워드, 학습 본문에서 찾습니다.

검색 범위

검색어를 입력해 주세요.

SEARCH THE NOTEBOOK

찾고 싶은 금융·통계·전략 개념을 입력해 보세요.

CHAPTER 17 / SECTION 05

17.5 일부 체결과 취소를 주문 장부에 기록하기

상태 기계로 비동기 통보를 처리하고 마감과 재시작 때 장부를 대사합니다.

17장. Live Trading Systems(실거래 시스템)초급 학습 노트

목표 비중을 브로커에 보낼 수량으로 바꾼다

계좌 평가액이 20만 원이고, 주가 100원인 종목의 목표 비중이 5%라고 하자. 목표 평가액 1만 원을 주당 100원으로 나누면 목표는 100주다. 기존에 20주가 있으면 80주 매수 의도가 생긴다. 같은 종목의 미결 매수 주문이 10주라면 이를 고려해 70주만 추가하거나, 기존 주문을 정리한 뒤 다시 계산한다. 브로커에 제출할 때는 거래 단위, 지정가와 주문 유효기간을 함께 지정한다.

들어온 이벤트마다 가능한 상태 변화를 정한다

State Machine(상태 기계)은 주문이 현재 어디에 있는지, 어떤 통보가 들어오면 다음 상태로 옮길지를 정의한다. 제출 직후에는 네트워크가 끊길 수 있어 브로커 접수가 확인되기 전까지 별도 상태로 기록한다. 체결이나 취소가 접수 응답보다 먼저 들어오는 경우에는 주문 식별자로 연결하고 브로커가 알려 준 사실을 반영한다.

매수 주문이 제출돼 보유량으로 바뀌는 기본 경로
  1. 생성 → 제출
    주문 의도를 저장하고 접수를 기다린다.
  2. 접수 → 일부 체결
    브로커 주문 ID를 연결한다. 첫 체결부터 보유량에 반영한다.
  3. 완료 또는 종료
    전량 체결, 잔량 취소, 거부 또는 만료를 기록한다.
취소·정정 요청을 보낸 뒤에도 브로커가 확정할 때까지 체결이 도착할 수 있다.

진행 중 상태에는 Created(생성), Submitted(제출), Acknowledged(접수), Partially Filled(일부 체결), Pending Cancel(취소 확인 대기), Pending Replace(정정 확인 대기)가 있다. Filled(전량 체결), Canceled(취소), Rejected(거부), Expired(만료)는 종료 상태다. 과거 재생에서는 체결과 취소 통보를 짧은 간격으로 모의할 수 있다. 운영에서는 통보가 다른 순서로 도착하므로 상태 규칙과 이벤트의 고유 식별자를 함께 사용한다.

80주 중 30주가 체결된 시점에 취소를 요청했다고 하자. 브로커가 요청을 처리하기 전에 50주가 더 체결되면 결과는 80주 전량 체결이다. 취소 요청은 거래를 멈추려는 의도였다는 기록으로 남긴다. 취소가 먼저 확정되면 이미 체결된 30주는 보유량에 남고 미결 잔량이 사라진다. 종료 메시지 이후 뒤늦게 도착한 체결은 거래 발생 시각과 체결 ID를 확인해 회계 장부에 한 번만 반영한다.

80주 주문의 취소와 체결이 겹치는 시점
  1. 30주 체결
    잔량 50주가 주문장에 남는다.
  2. 취소 확인 대기
    취소를 요청했어도 잔량은 체결될 수 있다.
  3. 먼저 확정된 결과
    50주 체결이 먼저면 80주 보유가 늘고, 취소가 먼저면 30주만 늘어난다.
마지막 단계는 취소 버튼을 누른 시각보다 브로커가 기록한 체결·취소 순서로 판단한다.

여러 체결을 한 주문으로 합산한다

80주 주문에서 100원에 30주, 102원에 20주가 체결됐다고 하자. 누적 체결은 50주다. 주문이 진행 중이면 잔량은 30주다. 체결 단가의 단순 평균 대신 각 가격에 해당하는 체결 수량을 곱해 합한 뒤 전체 체결 수량으로 나누면 Volume-Weighted Average Fill Price(수량 가중 평균 체결가)를 구할 수 있다.

30 주×100 원/주=3,000 원20 주×102 원/주=2,040 원3,000 원+2,040 원50 주=100.8 원/주\begin{aligned} 30\,\text{주}\times100\,\text{원/주} &= 3{,}000\,\text{원}\\ 20\,\text{주}\times102\,\text{원/주} &= 2{,}040\,\text{원}\\ \frac{3{,}000\,\text{원}+2{,}040\,\text{원}}{50\,\text{주}} &= 100.8\,\text{원/주} \end{aligned}

현금 장부에는 5,040원과 별도 수수료를 반영한다. 기존 20주를 합하면 현재 70주다. 거부가 발생했다면 구매력 부족, 상품 오류, 거래 시간 중 어떤 조건 때문인지 확인한다. 구매력이 회복됐거나 장이 열리는 등 조건이 바뀐 뒤 다시 판단한다. 당일 주문의 장 마감 만료와 장중 브로커 취소는 원인을 구분해 기록한다.

마감과 재시작 때 브로커 기록과 대조한다

Reconciliation(대사)은 같은 시점의 브로커 기록과 내부 장부를 맞추는 절차다. 종목별 보유량 차이는 미반영 체결이나 수동 거래를 찾는 출발점이다. 브로커에만 남은 미결 주문은 나중에 체결될 수 있다. 현금 차이는 수수료, 입출금 또는 빠진 체결에서 올 수 있다. 차이가 설명될 때까지 자동 주문을 중단하고 운영자가 기록을 확인한다.

제출 전에 주문 의도와 Client Order ID(클라이언트 주문 식별자)를 영속 저장한다. 재시작하면 내부 대기 기록을 읽고 동일한 ID로 브로커의 미결 주문·완료 주문·체결을 조회한다. 주문이 존재하면 로컬 상태를 복원하고, 부재가 확인되고 재전송 조건이 충족될 때만 같은 식별자로 제출한다. 타임아웃이나 아직 반영되지 않은 조회 결과만 보고 새 주문을 보내면 중복 체결이 생길 수 있다.