- 검사용으로 만든 프로그램이 진짜 보유 내역 파일을 덮어썼습니다. 있지도 않은 종목들이 「보유 중」으로 적혔습니다.
- 같은 목적으로 만든 형제 프로그램 12개는 전부 안전장치를 갖고 있었습니다. 새로 쓴 하나만 빠뜨렸습니다.
- 그 파일 맨 위에도 「읽기 전용」이라고 제가 적어뒀습니다. 적어둔 게 아무것도 막지 못했습니다.
- 살아난 건 매매 기록이 따로 있었기 때문입니다. 매수에서 매도를 빼서 되살렸습니다.
- 그래서 「조심한다」를 그만두고 도구가 막게 했습니다. 이제 실수하면 프로그램이 죽습니다.
자동매매 프로그램을 고칠 때마다 검사용 프로그램을 따로 만듭니다. 「이렇게 고쳤는데 진짜로 그렇게 도는가」를 확인하는 것입니다.
그 검사용 프로그램은 절대로 진짜 데이터를 건드리면 안 됩니다. 확인만 하고 끝나야 합니다.
어느 날 하나가 건드렸습니다.
무슨 일이 있었나

제 프로그램은 「지금 무엇을 갖고 있는지」를 파일 하나에 적어둡니다. 종목, 수량, 산 값이 들어 있습니다. 프로그램은 그 파일을 보고 팔지 말지를 정합니다.
검사용 프로그램 하나가 매수 동작을 흉내 내면서 그 파일에 실제로 써버렸습니다. 검사에 쓰려고 만든 가짜 종목들이 진짜 보유 내역 자리에 저장됐습니다.
이게 왜 위험하냐면, 프로그램은 그 파일을 믿기 때문입니다. 없는 종목을 갖고 있다고 믿으면 없는 걸 팔려고 합니다. 반대로 진짜 갖고 있는 종목이 목록에서 사라지면 팔아야 할 때 안 팝니다.
막지 못한 이유 — 규약은 문서에 있었습니다
여기가 이 사고에서 제일 뼈아픈 부분입니다.
같은 목적으로 만든 형제 프로그램이 12개 더 있었습니다. 그 12개는 전부 「진짜 파일에는 못 쓰게 막는」 장치를 갖고 있었습니다. 제가 매번 넣었으니까요.
그리고 사고를 낸 그 파일 맨 위에도 「이 검사는 읽기 전용이다」라고 제가 적어뒀습니다.
이게 「조심하겠습니다」가 왜 대책이 아닌지를 보여줍니다. 12번을 지켰다는 건 13번째에 안 지킬 수 있다는 뜻이기도 합니다. 사람은 매번 같은 상태가 아닙니다.
복구 — 기록이 따로 살아 있었던 덕
다행히 덮어쓰인 건 「지금 상태」였고, 「지나온 기록」은 무사했습니다.
제 프로그램은 살 때마다 한 줄, 팔 때마다 한 줄씩 별도 파일에 계속 쌓습니다. 그건 검사 프로그램이 안 건드렸습니다.
이 계산으로 보유 종목을 다시 만들어냈습니다. 거래마다 붙어 있는 고유 번호로 하나씩 맞춰봤더니 안 맞는 게 하나도 없었습니다.
이게 앞 글에서 말한 것과 같은 이야기입니다. 「지금 상태」는 다시 만들 수 있지만 「지나간 일」은 못 만듭니다. 그래서 기록은 쌓기만 하고 절대 고치지 않습니다.
그런데 다 살아나지는 않았습니다
정직하게 적어둡니다. 기록에 없던 값들은 못 살렸습니다.
보유 정보에는 「샀다」는 사실 말고도 프로그램이 판단에 쓰는 값이 몇 개 더 붙어 있습니다. 그건 매매 기록에 안 남는 값이라 되살릴 방법이 없었습니다.
그 자리는 「모를 때 쓰는 안전한 기본값」으로 채웠습니다. 그렇게 하면 프로그램이 덜 공격적으로 움직입니다. 모르는 상태에서는 덜 하는 쪽이 안전합니다.
진짜 정답은 증권사 계좌였습니다
되살린 목록을 보면서 한 가지를 분명히 해뒀습니다.
실제로 확인해보니 제 추정과 계좌가 다른 곳이 있었습니다. 어떤 종목은 이미 실제로는 없었고, 어떤 종목은 거래정지 상태였습니다.
그래서 마지막은 계좌를 불러와 맞추는 것으로 끝냈습니다. 내가 적어둔 장부와 실제 계좌가 다르면 언제나 계좌가 이깁니다.
처방 — 조심하는 대신 도구가 막게 했습니다

고친 방식이 이 글의 핵심입니다. 「다음엔 잊지 말자」로 끝내지 않았습니다.
검사 프로그램들이 공통으로 쓰는 한 줄이 있습니다. 거기에 안전장치를 얹었습니다. 이제 그 줄을 쓰는 순간 자동으로 다음이 걸립니다.
| 층 | 하는 일 |
|---|---|
| ① 막는다 | 진짜 파일 쓰기 · 실제 주문 · 알림 전송을 통째로 차단. 기록 파일은 임시 폴더로 경로를 돌려놓습니다 |
| ② 지켜본다 | 시작할 때 모든 데이터 파일을 찍어두고, 끝날 때 하나라도 바뀌었으면 원본을 따로 보존하고 실패로 끝냅니다 |
①만으로는 부족합니다. 제가 못 막은 경로가 또 있을 수 있기 때문입니다. ②는 그걸 잡습니다 — 무엇이 막혔는지가 아니라 무엇이 바뀌었는지를 봅니다.
막았다고 생각한 경로 말고, 옆에 있는 경로
실제로 ②가 바로 일을 했습니다.
안전장치를 붙이고 처음 돌린 검사에서, 제가 일부러 안 막아둔 다른 경로가 진짜 기록 파일에 두 줄을 적었습니다. 「이건 막을 필요 없지」 하고 남겨둔 자리였습니다.
지켜보는 층이 그걸 잡아서 원본으로 되돌렸습니다.
그래서 「무엇을 막을지 목록을 만드는 방식」은 늘 부족합니다. 목록에 없는 게 그대로 구멍이 되니까요. 「무엇이든 바뀌면 걸린다」가 훨씬 튼튼합니다.
일부러 안 한 것 — 자동 복구
파일이 바뀐 걸 발견하면 자동으로 되돌릴까 하다가 그만뒀습니다.
이유는 이렇습니다. 자동매매 프로그램이 켜져 있으면 그 파일은 계속 정상적으로 바뀝니다. 종목을 사고팔 때마다요.
그때 자동 복구가 돌면 멀쩡한 진짜 기록을 옛날 것으로 되돌려버립니다. 사고를 막으려던 장치가 사고를 냅니다.
그래서 지금은 「바뀌었다」고 알리고 원본을 따로 보관만 합니다. 되돌릴지는 제가 봅니다.
대신 규칙을 하나 더 만들었습니다 — 검사를 돌릴 땐 자동매매 프로그램을 끈다. 켜놓고 돌리면 정상 동작이 매번 사고로 보입니다.
정리
| 겪은 것 | 배운 것 |
|---|---|
| 12개는 지켰는데 하나가 빠뜨렸다 | 문서에 적은 규칙은 언젠가 안 지켜진다 |
| 기록이 따로 있어서 되살렸다 | 쌓기만 하는 기록을 하나는 갖고 있어야 한다 |
| 되살린 것과 계좌가 달랐다 | 내 장부와 실제가 다르면 실제가 이긴다 |
| 안 막아둔 옆 경로가 또 썼다 | 막을 목록보다 「바뀌면 걸린다」가 튼튼하다 |
| 자동 복구를 넣을 뻔했다 | 고치는 장치가 멀쩡한 걸 망가뜨릴 수 있다 |
다섯 개가 다 「사람이 조심하는 자리를 없앤다」는 하나로 모입니다. 저는 이 사고 전까지 규칙을 문서에 잘 적어두는 것으로 충분하다고 생각했습니다. 열두 번은 통했습니다. 열세 번째에 안 통했고, 그때 잃는 것이 실제 돈이었습니다.
'자동매매 일지 > 시스템 운영' 카테고리의 다른 글
| 주식 자동매매 직접 만들기 — 실제 사고로 배운 5가지 (0) | 2026.08.28 |
|---|---|
| 하네스가 무엇인가요 — 말에 채우는 마구에서 클로드 코드까지 (0) | 2026.08.27 |
| 동시호가에 판 돈은 그날 못 씁니다 — 파는 건 장중에, 사는 건 마지막에 (0) | 2026.08.26 |
| SOR은 시장가 주문을 받지 않습니다 — NXT 대체거래소에서 막힌 네 가지 (0) | 2026.08.25 |
| 액면분할로 3주가 7주가 됐는데, 자동매매는 3주만 팔았습니다 (0) | 2026.08.21 |