순위는 토스증권 Open API
의뢰인은 직접 만든 국내주식 단타 프로그램을 한투 모의투자로 돌리고 계셨습니다. 화면도 규칙도 마음에 드는데 매수가 자꾸 늦는다는 것이 고민이었습니다. 조건이 맞았다는 표시는 뜨는데 주문은 나가지 않거나, 나가더라도 가격이 이미 지나간 뒤였습니다. 저희는 코드를 읽어 늦는 이유를 먼저 찾았고, 화면과 매매 규칙은 손대지 않은 채 신호부터 주문까지의 경로를 새로 만들었습니다. 2026년 10월 말에 첫 판을 전달했고 지금은 의뢰인이 써 보며 알려 주시는 내용을 반영하고 있습니다.
받은 프로그램은 파이썬 1만 3천 줄, 모듈 90여 개였습니다. 의뢰인이 AI 도구의 도움을 받아 여러 버전에 걸쳐 고쳐 온 것이라 버전마다 검증 보고서가 붙어 있었고, 고쳤다가 되돌린 버전도 있었습니다. 엔진의 중심 함수 하나가 1,650줄이어서 한 군데를 고치면 다른 곳이 막히는 상태였습니다.
의뢰인이 남긴 보고서에 이런 줄이 있었습니다. "신호 통과 2.3초 뒤 소멸, 주문 미전송." 코드를 따라가 보니 원인은 네 군데였습니다.
| 원인 | 결과 |
|---|---|
| 조회 간격 | 증권사에 보내는 모든 요청 사이를 1.1초씩 띄웠고, 호출 한도 오류가 나면 8초까지 늘어났다. 한투가 모의투자에 권하는 간격은 0.5초다 |
| 주문 전 확인 | 매수 직전에 호가 조회와 주문가능금액 조회를 하나씩 차례로 보냈다. 신호가 나와도 주문은 최소 2.2초 뒤에 나간다 |
| 계좌 대조 조건 | 최근 10초 안에 계좌를 다시 맞춰 봤어야 주문할 수 있게 돼 있었다. 잔고와 체결 조회가 몇 초마다 돌면서 주문과 같은 줄에 섰다 |
| 관측 시간 | 새 후보 종목은 체결을 일정 시간 지켜본 뒤 판단한다. 이것은 의뢰인이 정한 설정값이어서 그대로 두고 화면에서 줄일 수 있다고 안내했다 |
앞의 세 가지는 매매 규칙과 상관이 없습니다. 규칙이 내린 판단을 증권사에 전달하는 길이 막혀 있던 것입니다. 그래서 규칙은 두고 길만 새로 내기로 했습니다.
| 구분 | 대상 |
|---|---|
| 그대로 둠 | 화면 전체, 수동매도와 긴급정지 버튼, 토스증권 거래대금 상위 100종목 순위, 한투 실시간 시세 수신, 설정 항목 34개와 저장 파일 |
| 옮기기만 함 | 진입, 청산, 호가 조건, 재진입, 손실 뒤 쉬는 시간을 판단하는 매매 규칙 파일 12개 |
| 새로 만듦 | 엔진 본체, 주문 경로, 장부, 계좌 대조, 시간대별 거래소 선택, 모의와 실전 전환, 수수료와 거래세를 뺀 매매별 손익 계산 |
| 버림 | 1,650줄짜리 중심 함수와 그 주변의 간격 조절, 대기열, 각종 검증 기록 모듈 |
매매 규칙 파일은 원본과 한 글자도 다르지 않습니다. 파일마다 원본의 지문 값을 적어 두고, 시험을 돌릴 때마다 같은지 자동으로 확인합니다. 누군가 실수로 규칙을 건드리면 시험이 실패합니다.
화면을 그대로 쓸 수 있었던 이유는 화면과 엔진이 주소 22개로만 대화하고 있었기 때문입니다. 새 엔진이 같은 주소에서 같은 모양으로 답하면 화면은 바뀐 줄 모릅니다. 화면이 읽어 가는 값 110여 개를 뽑아 목록으로 만들고, 새 엔진의 응답이 그 목록을 다 채우는지 확인하는 시험부터 만들었습니다.
새 엔진은 주문을 판단할 때 증권사에 묻지 않습니다. 현금과 보유 수량은 프로그램이 들고 있는 장부에서 바로 읽고, 호가는 실시간으로 받고 있는 값을 씁니다. 증권사로 가는 요청은 모두 한 줄로 서고 주문과 취소가 늘 맨 앞에 섭니다. 조회는 그 뒤에 틈이 날 때 나갑니다.
주문을 보냈는데 응답이 없을 때는 다시 보내지 않습니다. 증권사가 받았는지 모르는 상태에서 한 번 더 보내면 두 번 살 수 있습니다. 주문 내역을 조회해 접수됐는지 확인될 때까지 그 종목의 새 주문을 막아 둡니다.
가짜 증권사를 붙인 시험은 첫날 통과했습니다. 문제는 한투 모의투자 서버에 붙인 10월 28일과 정규장 하루를 돌린 29일에 나왔습니다. 첫 납품까지 판을 아홉 번 새로 만들었습니다.
10월 29일 모의 정규장에서 잰 값입니다. 신호가 나온 뒤 주문을 보낼 때까지 매수 30건의 중앙값이 0.63초, 매도 29건이 0.50초였습니다. 한투 모의투자 서버는 주문 앞뒤로 1초쯤 다른 요청이 없어야 주문을 받아 주는 일이 많아 그만큼 기다린 시간이 들어 있습니다. 실전 서버에는 이 기다림을 두지 않습니다.
납품 전에 저희 PC에서 실전 소액으로 밤새 켜 두고 지켜봤습니다. 10월 29일 오전 9시, 정규장이 열린 직후에 프로그램이 꺼졌습니다.
처음에는 코드 오류를 의심했습니다. 윈도우가 남긴 기록을 열어 보니 프로그램이 자기 실행 파일의 일부를 디스크에서 다시 읽으려다 실패한 것이었습니다. 프로그램 폴더가 구글 드라이브 안에 있었습니다. 구글 드라이브는 PC에 가상 드라이브로 붙는데, 구글 드라이브 앱이 새벽에 스스로 재시작하면서 드라이브가 잠깐 사라졌다가 돌아왔습니다. 그 전에 켜 둔 프로그램은 몇 시간 뒤 필요한 파일 조각을 읽으려는 순간 죽습니다.
증상이 원인보다 몇 시간 늦게, 아무 때나 나타나기 때문에 코드 문제로 오해하기 쉽습니다. 그 뒤로 시험은 C 드라이브의 일반 폴더에 복사해서 돌렸고, 의뢰인께 드린 사용안내서에 구글 드라이브나 원드라이브 같은 동기화 폴더에서 실행하지 말라는 안내를 넣었습니다.
의뢰인은 모의투자로 일주일을 쓰신 뒤 아홉 가지를 정리해 보내 주셨습니다. 로그와 대조해 하나씩 확인했고, 그중 일곱 가지를 반영한 수정판을 11월 9일에 만들었습니다.
나머지 두 가지 가운데 하나는 주문 통로를 조회와 완전히 나누는 구조 변경이라 따로 판단하기로 했습니다. 수정판에서 팔 때 쓰는 기준을 끈 경우의 매도는 가짜 증권사 시험으로만 확인했고, 장중 모의 확인은 아직 남아 있습니다.
모의투자 서버는 넥스트레이드 주문을 받지 않습니다. 그래서 프리마켓과 애프터마켓 주문은 모의로 확인할 수 없었고, 실전 계좌에서 한 주를 접수했다가 바로 취소하는 방법으로 경로를 확인했습니다.
한투 API가 돌려주는 오류와 대응은 KIS API 에러코드 정리에 따로 적어 두었습니다.
어떤 증상이 있는지와 소스코드가 있는지만 알려 주셔도 상담을 시작할 수 있습니다.
고쳐 쓸 수 있는지, 새로 만드는 편이 나은지부터 말씀드립니다.