EP03 — 2026-04-21 첫 LIVE 체결, 그리고 토큰 한 줄 때문에 멈춘 하루

RyanLAB AI Diary

EP03 — 2026-04-21 첫 LIVE 체결, 그리고 토큰 한 줄 때문에 멈춘 하루

2026-04-21 · 거래일 2026-04-21 (화) KST · Ryan LAB

오늘의 전략 요약

Rick(자동매매 에이전트)의 TORB 전략(장초 레인지 돌파 매수) 첫 LIVE 투입. 단일 종목 003530 한화투자증권을 대상으로 Range=140, 설정 돌파가 기준, 슬롯 예산 상한 내. 오전 프로브에서 조건이 통과되었고 15:12에 실제로 15주가 체결되었습니다. 이어 1분 뒤 토큰 invalid(키움 8005) 구조 결함이 드러났고, Rick이 15:14에 수동 시장가 매도로 방어 후 runner를 강제 종료했습니다.

손익 (P&L)

  • 매수: 003530 15주 체결 (15:12:40), 슬롯 진입 완료
  • 매도: 003530 15주 시장가 — 체결 확인 15:14:33, 상세 체결가 로그 미기재
  • 증거금 현금: 매수 직후 슬롯 진입 규모 확보 → 매도 후 키움 `kt00005` 잔고 0주 + 증거금 현금 정상 일치
  • 추정 실현 손익: ±0% 수준 (수수료 포함 소액 이내) 🔮 정확 체결가는 `ka10072` 체결내역 재조회 시 확정
  • MTS 잔고 기준 예수금 변동 없음 → 자본 침식 없음

※ 정확한 손익 숫자를 밝히지 않고 "추정"으로 처리하는 이유 — `trade_executor.execute_trade`의 SELL 반환값이 ORDER_SENT만 남기고 체결가·수수료·거래세를 자동으로 찍지 않는 구조적 로그 부재 때문입니다. 이 부분은 미화하지 않고 결함으로 기록합니다.

거래 로그

시각 (KST) 이벤트
09:04EOD exit cron 실행 — 보유 0종목 확인, 정상 종결
09:24TORB runner 기동 (PID 2009344, 단일 종목 003530, Range=140, breakout=설정가)
11:00TORB probe 조건 통과 확인 (돌파 대기)
14:49EOD entry cron 실행 — 0종목 체결, 누적 투입 자본 반영
15:12:40TORB 첫 LIVE 체결 — 003530 15주 매수 (슬롯 진입 완료)
15:13:43P0 토큰 invalid 사고 — `TradeExecutor`·`AccountManager`·`MarketDataFeed` 3 싱글톤이 각자 토큰 발급 → 키움 동일 APP_KEY 정책에 따라 최신 토큰만 유효, 이전 MarketDataFeed 토큰이 8005 Token 유효하지 않음 반환
15:14:33Rick 수동 시장가 매도 15주 → ORDER_SENT. 15:14:35 `holdings=[]` 확인
15:14:45TORB runner PID 2063449 강제 종료 (15:20 market_close 자동 청산 실패 시 오버나이트 홀드 위험 차단)
15:15Rick → Ryan 직접 P0 incident 보고 발행 (`incident_rick_to_ryan_torb_token_invalid_20260421_1515.md`)
15:41거래일지 `Rick_매매일지_20260421.md` 자동 생성

오늘의 교훈

1. 첫 LIVE는 전략이 아니라 "하부 구조"에서 무너진다.
Rick의 TORB 전략 자체는 오전부터 조건을 기다리다가 정확히 돌파 시점에 매수를 넣었습니다. 전략 레벨에서는 실패가 없었습니다. 무너진 것은 토큰 관리 계층이었습니다. 세 개의 싱글톤이 각자 토큰을 발급하는 구조는 단일 사용자 모드에서는 문제가 없지만, 키움 REST가 "같은 APP_KEY에서는 최신 토큰만 유효"하게 만드는 순간부터 서로를 무효화시키는 시한폭탄이 됩니다. 백테스트로는 절대 드러나지 않는 결함입니다.

2. 수동 개입은 "실패"가 아니라 "설계된 우회로"로 남겨둔다.
Rick은 토큰 invalid 메시지를 본 1분 안에 MTS로 직접 매도를 넣고, 잔고 0주를 눈으로 확인한 뒤 runner를 강제 종료했습니다. 이 순서는 우연이 아니라 사전에 정해둔 절차입니다 — "자동 청산이 깨지면 사람이 수동으로 닫고, runner가 다시 주문을 밀어넣지 않도록 프로세스부터 죽인다." 완전 자동화를 추구하면서도 수동 탈출구를 잠그지 않은 결과로, 오버나이트 홀드를 피했습니다.

3. "체결가 미확인"을 미화하지 않는다.
`execute_trade` 반환이 ORDER_SENT만 남긴다는 사실은 숨기고 싶은 종류의 결함입니다. 그렇지만 이 일지는 사고 르포 정책(실패 그대로 노출, 미화 금지)에 따라 작성합니다. "손익 확정 대기 중"이라고 얼버무리지 않고, "`ka10072` 체결내역 수동 재조회 전까지는 정확 숫자를 모른다"고 그대로 적습니다. 이 로그 부재 자체가 04-22의 TokenManager 통합 패치와 함께 해결해야 할 다음 작업입니다.

4. 첫 체결은 "자본을 크게 안 넣어서 다행"이었다.
소액 슬롯 진입. 만약 오늘 runner가 강제 종료되지 않고 오버나이트로 흘러 다음날 갭 하락을 맞았다면, 슬롯 예산 안에서도 큰 폭의 손실이 가능했습니다. 첫 LIVE에서 "자본을 크게 태우지 않는" 원칙이 구조 결함을 손실로 바꾸지 않게 지켜준 방어선이었습니다.


RyanLAB 자동매매 시스템(Rick)의 실제 체결 데이터를 기반으로 작성된 학습용 일지입니다.

본 글은 투자 권유가 아닙니다. 모든 투자 판단과 결과의 책임은 투자자 본인에게 있습니다.

© 2026 Ryan LAB

댓글