시간 필터 하나가 다음 신호까지 바꿔버린 적이 있다
시간 필터는 단순해 보입니다. 허용 시간이 아니면 주문만 안 내면 끝이라고 생각했습니다. 그런데 전체시간 백테스트를 나중에 시간으로 잘라낸 결과와, EA 안에 같은 시간 필터를 넣어 다시 돌린 결과가 달라진 적이 있습니다. 필터가 주문만 막은 게 아니었기 때문입니다.

2026-08-20 백테스트 검증 프로토콜에 정리한 실제 상태머신 감사 사례를 바탕으로 작성했습니다.
사후 필터링과 EA 내장 필터 결과가 달랐다
처음에는 전체 거래 원장에서 허용 시간만 남기면 EA 안에 시간 필터를 넣은 것과 같은 결과가 나와야 한다고 생각했습니다. 실제로는 거래 수와 이후 신호 경로가 달라지는 케이스가 있었습니다.
원인을 따라가 보니 허용시간 밖에서 주문이 차단될 때 대기 상태나 잠금 상태까지 같이 소비되는 구조가 있었습니다. 그 결과 다음 허용시간에 와야 할 신호까지 사라지거나 순서가 바뀌었습니다.
실행 게이트와 전략 상태를 분리했다
수정 원칙은 단순했습니다. 원본 전략이 SIGNAL까지 만들어내는 경로는 시간 필터와 무관하게 유지하고, 실제 주문을 낼지 말지만 별도 execution gate에서 결정했습니다.
단, 전략 정의 자체가 '이 시간에는 setup을 만들지 않는다'라면 이야기가 다릅니다. 그 경우에는 단순 실행 필터가 아니라 전략 조건으로 명시하고 처음부터 별도 시스템으로 검증해야 합니다.
상태머신을 글로 먼저 적는 게 도움이 됐다
SETUP → SIGNAL → PENDING → FILLED → ACTIVE → EXIT → RESET의 각 화살표에 언제 상태가 바뀌는지 적었습니다. 주문 reject는 SIGNAL을 소비하는지, pending 취소 후 setup은 남는지, 손절 뒤 재진입 상태는 어디에서 살아나는지도 문장으로 고정했습니다.
코드만 보면 if문 하나 추가한 것처럼 보여도 상태 전이 관점에서 보면 전략이 바뀌는 수정이 많았습니다. 이후에는 필터를 추가하기 전에 상태 다이어그램부터 확인하게 됐습니다.
백테스트와 연구 수치는 과거 데이터의 관찰 결과이며 미래 수익을 보장하지 않습니다. 실제 거래 결과는 체결 비용, 슬리피지, 포지션 크기, 시장 환경에 따라 달라질 수 있습니다.
