주문 거절 4건이 왜 중요했나: Market closed 뒤 상태가 잠긴 버그
94번 정상 진입한 테스트에서 주문 실패는 고작 4번이었습니다. 숫자만 보면 무시해도 될 것처럼 보였습니다. 그런데 그 네 번이 단순히 '체결 안 됨'으로 끝난 게 아니라 이후 신호를 막는 Lock까지 켜버리고 있었습니다. 작은 오류가 상태머신에서는 작은 오류가 아니었습니다.

2026-08-09 BTC MT5 D1→H1 실행 로그 감사에서 확인한 Market closed reject 사례를 바탕으로 작성했습니다.
로그 자체는 처음에 나쁘지 않아 보였다
해당 테스트는 94번 진입했고 Long 49건, Short 45건이었습니다. 종료 결과는 TP 50건, SL 44건으로 집계됐습니다. 문제는 거래 통계 바깥의 주문 실패 로그에 있었습니다.
Market closed로 주문이 거절된 사례가 4건 있었는데, EA는 주문이 실제로 체결되지 않았는데도 해당 setup을 사용한 것처럼 Lock을 설정했습니다.
포지션이 없는데도 다음 신호가 막혔다
주문 요청을 보냈다는 사실과 포지션이 생겼다는 사실을 같은 것으로 처리하면 이런 문제가 생깁니다. 브로커가 reject했는데 내부 상태는 FILLED 쪽으로 이동해버리면 차트에는 아무 포지션도 없지만 전략은 이미 거래했다고 생각합니다.
결국 성과표에는 단순히 네 번의 미체결만 빠지는 것이 아니라 그 뒤에 이어질 수 있었던 신호까지 달라질 수 있습니다.
그래서 주문 lifecycle을 별도로 기록하기 시작했다
이후 로그에는 signal time, order request, broker response, fill time, reject reason을 분리해서 남겼습니다. 상태 전이는 broker response가 성공인지 확인한 뒤에만 진행하도록 보는 편이 안전했습니다.
실전 자동매매에서는 market closed 외에도 invalid stops, off quotes, insufficient margin처럼 실패 이유가 다양합니다. 각 실패가 신호를 소비하는지 재시도 가능한지 전략 수준에서 정해야 합니다.
백테스트와 연구 수치는 과거 데이터의 관찰 결과이며 미래 수익을 보장하지 않습니다. 실제 거래 결과는 체결 비용, 슬리피지, 포지션 크기, 시장 환경에 따라 달라질 수 있습니다.
