- 대체거래소 NXT가 생기면서 SOR이라는 주문 방식이 생겼습니다. 두 거래소 호가를 비교해 유리한 쪽으로 보내주는 것입니다.
- 그런데 SOR은 시장가 주문을 받지 않습니다. 비교할 가격 자체가 없기 때문입니다.
- 저는 수동 주문에 무조건 SOR을 붙여놨는데, 수동 매수도 매도도 둘 다 시장가였습니다. 수동 주문이 통째로 막혔습니다.
- 고친 것은 조건 한 줄입니다. 지정가일 때만 SOR을 붙이고 시장가는 거래소를 안 정하게 했더니 둘 다 정상으로 돌아왔습니다.
- 거래 시간이 밤 8시까지 늘었는데, 그 시간엔 시장가가 안 될 것으로 봅니다. 한국거래소가 닫혀 있어서인데 — 아직 해본 적은 없습니다.
- 그리고 오후 5시에 낸 주문이 다음 날까지 유령으로 남았습니다. 정리 로직이 「15:30」을 전제로 짜여 있었습니다.
자동매매 프로그램을 만들어 쓰고 있습니다. 대부분은 자동으로 돌지만, 제가 직접 사고팔 수 있는 수동 버튼도 붙여뒀습니다.
어느 날 그 버튼으로 매수를 넣으려는데 이런 메시지가 떴습니다.
제가 그 전날 새로 붙인 기능 때문이었습니다. 좋아지라고 넣은 것이 주문을 통째로 막았습니다.
SOR 주문이란 — 거래소가 둘이 되면서 생긴 것
한국에는 오랫동안 주식을 사고파는 곳이 하나였습니다. 한국거래소(KRX)입니다. 여기에 대체거래소 NXT가 생겼습니다. 같은 종목을 두 곳에서 사고팔 수 있게 된 것입니다.
파는 곳이 둘이면 값이 다를 수 있습니다. 그래서 나온 것이 SOR(최선주문집행)입니다. 주문을 내면 증권사가 양쪽 호가를 비교해서 유리한 쪽으로 보내줍니다. 제가 어느 거래소인지 고를 필요가 없습니다.
좋은 기능입니다. 그래서 수동 주문에 이걸 붙였습니다.
시장가는 비교할 것이 없습니다

주문에는 종류가 있습니다.
| 주문 종류 | 뜻 | SOR |
|---|---|---|
| 지정가 | 「35,000원에 사겠다」 — 값을 내가 정한다 | ✅ 된다 |
| 최유리 | 지금 나와 있는 제일 좋은 호가로 | ⛔ 안 된다 |
| 시장가 | 값은 상관없다, 지금 당장 사겠다 | ⛔ 안 된다 |
이유를 알고 나면 당연합니다. SOR이 하는 일은 「어느 쪽이 유리한가」를 재는 것입니다.
지정가는 제가 값을 정해줬으니 잴 수 있습니다. 어느 거래소가 그 값에 더 잘 붙는지 비교하면 됩니다. 그런데 시장가는 값이 없습니다. 비교할 기준 자체가 없으니 SOR이 할 일이 없습니다.
제 실수 — 「수동이면 무조건」
제가 짠 것은 이랬습니다.
그런데 제 수동 매수 버튼도 시장가였고, 수동 매도 버튼도 시장가였습니다. 즉 SOR을 붙일 수 있는 주문이 하나도 없는데 전부에 붙이고 있었던 것입니다. 결과는 수동 주문 전면 차단이었습니다.
고친 것은 조건 한 줄이었습니다.
| 주문이 이것이면 | 이렇게 보낸다 |
|---|---|
| 지정가 | SOR로 보낸다 |
| 시장가 · 최유리 | 거래소를 지정하지 않는다 — 예전 방식 그대로 |
여기서 중요한 것은 아랫줄입니다. 거래소를 지정하지 않으면 증권사가 알아서 보내던 예전 방식으로 그대로 나갑니다. 즉 「아무것도 안 하는 쪽」이 원래 동작입니다.
그래서 이 조건 한 줄로 시장가 주문이 곧바로 다시 나갔습니다. 뭘 새로 만든 게 아니라 제가 막고 있던 손을 뗀 것입니다. 고장 난 곳은 증권사도 시장가도 아니고, 「수동이면 무조건」이라고 적은 제 한 줄이었습니다.
배운 것은 이것입니다.
두 번째 — 요청 코드가 갈립니다
거래소를 지정하면 증권사에 보내는 요청 코드가 달라집니다. KIS는 주문 종류를 TR ID라는 코드로 구분하는데, 거래소를 지정하는 주문은 코드가 따로 있습니다.
| 경우 | 보내는 것 |
|---|---|
| 거래소 지정 안 함 | 거래소 항목을 아예 안 보낸다 + 예전 코드 |
| 거래소 지정(SOR) | 거래소 항목 + 다른 코드 |
여기서 제가 신경 쓴 것은 자동으로 도는 쪽을 건드리지 않는 것이었습니다. 거래소 항목을 빈 값으로 보내는 게 아니라 아예 빼면, 자동 주문은 이 기능을 붙이기 전과 보내는 내용이 한 글자도 다르지 않습니다.
그래서 새 기능의 위험이 수동 버튼 하나에만 갇혔습니다. 실제 돈이 오가는 프로그램에서 새 기능을 붙일 때, 저는 이 부분을 제일 신경 씁니다. 기본값이 「아무것도 안 한다」여야 기존 동작이 안전합니다.
세 번째 — 시간을 넓혔더니 시장가가 걸립니다

NXT 덕분에 거래할 수 있는 시간이 늘었습니다.
| 시간 | 무엇 |
|---|---|
| 08:00 ~ 08:50 | 장 열기 전 (NXT) |
| 09:00 ~ 15:30 | 정규장 — 두 거래소 다 열림 |
| 15:40 ~ 20:00 | 장 끝난 뒤 (NXT) — 한국거래소는 닫혀 있다 |
마지막 줄이 문제였습니다. 15:40 이후에는 한국거래소가 닫혀 있습니다. 시장가는 그쪽 기준으로 처리되는 주문이라 그 시간엔 안 될 것으로 봅니다. 그 시간에 주문하려면 값을 적어 넣는 지정가여야 합니다.
그런데 앞에서 봤듯이 제 수동 매도 버튼은 항상 시장가입니다. 그래서 밤에는 그 버튼을 쓸 수 없다고 보고 있습니다. 이건 「누르면 파는 버튼」의 성격을 바꾸는 일이라 아직 손대지 않았습니다. 매수는 값을 적는 칸이 있어서 밤에도 됩니다 — 실제로 그 시간에 사봤습니다.
네 번째 — 오후 5시에 낸 주문이 유령이 됐습니다
이게 제일 조용한 사고였습니다. 오류도 안 뜨고, 화면도 멀쩡했습니다.
주문을 내면 체결이 됐는지 확인해야 합니다. 안 됐으면 「샀다고 적어둔 것」을 지워야 합니다. 안 그러면 없는 주식을 갖고 있다고 착각하니까요. 그 정리 로직이 이렇게 돼 있었습니다.
정규장만 있던 시절엔 맞는 말입니다. 장이 끝나면 정리하는 것이니까요.
그런데 17시 4분에 주문을 내면, 그날 15:30은 이미 지나가 버렸습니다. 정리할 기회가 영영 오지 않습니다. 게다가 확인하는 감시 루프도 15:30 밖에서는 안 돕니다.
결과는 있지도 않은 보유 종목이 다음 날 15:30까지 화면에 남는 것이었습니다. 그 상태로 다음 날 아침을 맞으면, 프로그램은 없는 주식을 기준으로 판단합니다.
조건을 이렇게 바꿨습니다.
여기서 배운 것이 이번에 가장 값이 나갔습니다.
이걸 저는 세 번 겪었습니다. 미체결 주문 정리에서 한 번, 계좌 맞춰보기에서 한 번, 그리고 검사 프로그램에서 한 번입니다. 마지막 것은 따로 쓸 만큼 황당했습니다.
지금은 이렇게 돕니다
고친 뒤로 둘 다 실제로 체결까지 갔습니다. 기록을 세어보니 시장가로 나간 매도가 177건이고, 지정가는 확장 시간에 낸 매수가 그대로 체결됐습니다.
| 언제 | 주문 종류 | 결과 |
|---|---|---|
| 정규장 09:00~15:30 |
지정가 | SOR로 나갑니다 — 두 거래소 중 유리한 쪽 |
| 시장가 | 다시 나갑니다 — 거래소를 안 정해 예전 그대로 | |
| 확장 시간 15:40~20:00 |
지정가 | 나갑니다 |
| 시장가 | 아직 안 해봤습니다 — 아래 설명 |
마지막 칸은 「안 된다」가 아니라 「모른다」로 적어야 맞습니다. 기록을 세어보니 15:40 이후에 시장가 주문을 낸 적이 한 번도 없습니다. 안 될 것이라고 보는 이유는 그 시간엔 한국거래소가 닫혀 있기 때문인데, 그건 제가 추론한 것이지 재본 것이 아닙니다.
이 구분을 저는 자꾸 놓칩니다. 「그럴 것이다」와 「확인했다」는 다른 말인데, 글로 적을 때는 둘이 똑같이 생겼습니다. 실제 돈이 오가는 쪽에서는 이 둘을 섞으면 안 됩니다.
그래서 수동 매도 버튼만 아직 밤에 안 됩니다. 그 버튼은 항상 시장가로 나가게 만들어놨기 때문입니다. 이걸 지정가로 바꾸면 「누르면 즉시 팔린다」가 「그 값에 걸어둔다」로 바뀝니다. 버튼의 성격이 달라지는 일이라, 급하게 고치지 않고 남겨뒀습니다.
정리
| 겪은 것 | 배운 것 |
|---|---|
| SOR에 시장가를 보냈다 | 거래소를 바꾸면 그쪽이 받는 주문 종류부터 센다 |
| 요청 코드가 갈렸다 | 기본값이 「아무것도 안 한다」여야 기존 동작이 안전하다 |
| 밤엔 시장가가 안 될 것 같다 | 「그럴 것이다」와 「확인했다」를 섞어 적지 않는다 |
| 17시 주문이 유령이 됐다 | 시간 창을 넓히면 「끝나면 정리」를 전부 다시 센다 |
글을 쓰면서 기록을 다시 뒤져보다 알았는데, 이 넷 중 셋이 「같은 한 건의 주문」에서 나왔습니다. 그날 17시 4분에 낸 매수 하나가 — SOR 지정가로 나갔고, 시각 때문에 유령으로 남았고, 쓸 수 있는 돈을 잘못 계산해 원래 살 수 있던 것보다 적게 샀습니다. 사고는 따로따로 온 게 아니라 한 자리에 겹쳐 있었습니다.
넷 다 새 기능을 붙였더니 멀쩡하던 것이 깨진 경우입니다. 기능이 잘못 만들어진 게 아니라, 전에는 참이던 전제가 깨진 것입니다. 「지금까지 잘 됐으니 괜찮겠지」가 안 통하는 자리가 여기입니다.
'자동매매 일지 > 시스템 운영' 카테고리의 다른 글
| 주식 자동매매 직접 만들기 — 실제 사고로 배운 5가지 (0) | 2026.08.28 |
|---|---|
| 검사 프로그램이 진짜 보유 내역을 덮어썼습니다 — 12개는 지켰는데 하나가 (0) | 2026.08.27 |
| 하네스가 무엇인가요 — 말에 채우는 마구에서 클로드 코드까지 (0) | 2026.08.27 |
| 동시호가에 판 돈은 그날 못 씁니다 — 파는 건 장중에, 사는 건 마지막에 (0) | 2026.08.26 |
| 액면분할로 3주가 7주가 됐는데, 자동매매는 3주만 팔았습니다 (0) | 2026.08.21 |