자동매매 납품 검수 — 구매확정 전 모의투자로 볼 6곳
자동매매 프로그램 제작비를 지키는 건 착수금·잔금 비율이 아니라 "돈이 확정되기 전에 무엇을 확인하느냐"입니다. 납품받으면 모의투자에서 6곳을 봅니다. ① 실제로 모의 서버에 붙는가(KIS openapivts.koreainvestment.com:29443, 키움 mockapi.kiwoom.com) ② 주문 tr_id가 모의용 VTTC0012U인가 ③ 주문번호 ODNO·ord_no를 기록하는가 ④ 체결조회(VTTC0081R, 키움 ka10075)로 실제 체결과 맞춰 보는가 ⑤ 명세서 조건과 1:1로 맞는가 ⑥ 껐다 켜도 주문이 중복되지 않는가. 크몽은 발송 후 7일이 지나면 자동 구매확정되므로 그 안에 끝내야 하고, 알고랩 계좌이체 건은 납품 후 30일 무상 수정 기간 안에서 봅니다.
목차
- 돈은 언제 확정되나 — 결제 방식 3가지
- 검수 기간을 어떻게 쓰나 — 7일 타임라인
- 모의투자로 보는 6곳
- 검수 로그 점검 스크립트 — 실행 결과
- 무상 수정과 추가 비용이 갈리는 곳
- 자주 묻는 질문
1. 돈은 언제 확정되나 — 결제 방식 3가지
상담에서 "제작비는 반 먼저, 반은 나중에 내면 되나요?"라는 질문을 자주 받습니다. 이 질문의 진짜 뜻은 "돌아가는 걸 보고 나서 돈을 내고 싶다"입니다. 그런데 그 목적은 분할 비율이 아니라 확정 시점 전에 검수를 끝내는 것으로 달성됩니다. 결제 방식별로 돈이 확정되는 시점이 다릅니다.
| 방식 | 돈이 나가는 시점 | 되돌릴 수 있는 구간 |
|---|---|---|
| 알고랩 계좌이체 | 견적·명세서 동의 후 전액 선결제, 결제 시점에 착수 | 착수 전 전액 환불 · 착수 후 납품 전 미진행분 환불 · 납품 후 명세서 불이행 시 수정 또는 환불 · 30일 무상 수정(이용약관 제4~6조) |
| 크몽 안전결제 | 결제 대금은 크몽이 보관, 구매확정 때 판매자에게 정산 | 구매확정 전까지 수정 요청 가능. 발송일로부터 7일 무응답이면 자동 구매확정, 확정 후에는 수정·취소·환불 요청 불가(크몽 고객센터 안내) |
| 일반 외주 계약 | 착수금 → 중도금 → 잔금 등 계약서에 정한 대로 | 계약서의 검수 조항에 따라 다름 — 검수 기준이 비어 있으면 분쟁이 납니다 |
세 방식 모두 공통점이 있습니다. "검수에서 무엇을 확인했는가"가 문서로 남아 있어야 수정이나 환불을 요구할 근거가 됩니다. 그래서 아래 6곳은 그대로 검수표의 행이 됩니다. 의뢰 전에 정할 것은 견적 전 정할 5가지에, 제작 기간은 납품 33건 실측에 정리해 두었습니다.
2. 검수 기간을 어떻게 쓰나 — 7일 타임라인
크몽의 자동 구매확정 7일을 기준으로 잡으면 순서가 깔끔합니다. 주말이 끼면 장이 열리는 날이 줄어드니, 납품은 가능하면 주초에 받는 편이 검수일을 더 확보합니다.
3. 모의투자로 보는 6곳
① 정말 모의 서버에 붙는가
가장 먼저 볼 것은 프로그램이 어느 서버로 요청을 보내는가입니다. 한국투자증권 KIS Developers는 실전 openapi.koreainvestment.com:9443, 모의 openapivts.koreainvestment.com:29443로 도메인이 다르고, 키움 REST API는 실전 api.kiwoom.com, 모의 mockapi.kiwoom.com(웹소켓은 :10000)입니다. 설정 파일이나 로그의 첫 줄에 이 주소가 찍혀 있어야 합니다. 키움 모의투자는 KRX만 지원되는 것으로 안내되어 있어, NXT 주문 로직은 모의에서 확인되지 않는다는 점도 검수표에 적어 둡니다. 모의와 실전의 차이는 KIS 모의투자 한계에 따로 정리했습니다.
② 주문 tr_id가 모의용인가
KIS는 도메인만이 아니라 tr_id도 모의와 실전이 다릅니다. 현금 매수는 실전 TTTC0012U / 모의 VTTC0012U, 매도는 TTTC0011U / VTTC0011U, 일별 주문체결조회는 TTTC0081R / VTTC0081R입니다. 모의 서버에 실전 tr_id를 보내거나 그 반대면 주문이 거절됩니다. 검수 때 로그에서 tr_id=를 세어 V로 시작하는 것만 있는지 봅니다. 아직 구 규격 TTTC0802U를 쓰는 코드라면 신·구 tr_id 글을 참고하십시오.
③ 주문번호를 기록하는가
주문이 접수되면 KIS는 이런 응답을 돌려줍니다(필드 구조 예시).
{
"rt_cd": "0",
"msg_cd": "APBK0013",
"msg1": "주문 전송 완료 되었습니다.",
"output": {
"KRX_FWDG_ORD_ORGNO": "06010",
"ODNO": "0000117057",
"ORD_TMD": "121052"
}
}
키움 REST kt10000(매수)·kt10001(매도)는 ord_no, dmst_stex_tp, return_code, return_msg를 돌려줍니다. 검수에서 볼 것은 이 주문번호가 로그나 DB에 남는가입니다. rt_cd == "0"만 확인하고 ODNO를 버리는 코드는 나중에 정정·취소를 못 합니다. 자세한 구조는 키움 kt10000 주문 글에 있습니다.
④ 접수와 체결을 구분하는가
rt_cd가 0이어도, 키움 return_code가 0이어도 "샀다"는 뜻이 아니라 주문이 접수됐다는 뜻입니다. 프로그램이 체결을 확인하는 조회를 실제로 부르는지 봅니다. KIS는 inquire-daily-ccld(모의 VTTC0081R), 키움은 미체결 ka10075·체결 ka10076입니다. 그리고 검수자는 HTS·MTS의 모의투자 체결내역 화면을 열어 프로그램 로그의 주문번호와 한 줄씩 맞춰 봅니다. 숫자가 하나라도 다르면 그게 첫 번째 수정 요청입니다(KIS 체결조회 글).
⑤ 명세서 조건과 1:1로 맞는가
명세서의 문장을 그대로 검수표의 행으로 옮깁니다. "RSI 30 이하에서 매수"라면, 매수가 난 시각의 RSI 값을 로그에서 찾아 30 이하였는지 봅니다. "종목당 1회만 매수"라면 같은 PDNO로 두 번 주문이 나간 적이 없는지 셉니다. "15:20 이후 신규 주문 금지"라면 ORD_TMD가 152000보다 늦은 주문이 있는지 봅니다. 명세서에 없는 조건은 검수 대상이 아닙니다. 이게 5절의 무상·유상 경계와 그대로 이어집니다.
⑥ 껐다 켜도 중복 주문이 없는가
장중에 프로그램을 강제로 종료했다가 다시 켭니다. 이때 이미 산 종목을 또 사면 안 되고, 토큰을 매번 새로 받다가 EGW00133(토큰 발급 요청 과다)이나 초당 호출 초과 EGW00201이 나오지 않는지 봅니다. 프로그램 창을 두 번 띄웠을 때 두 번째가 막히는지도 확인합니다. 네트워크가 끊겼다 붙을 때의 재전송 중복은 ReadTimeout 재시도 글에서 실측했습니다.
검수 중에도 실제 키를 메신저로 보내지 마십시오. 설치를 도울 때도 appkey·appsecret는 의뢰자 PC의 설정 화면이나 .env에 직접 입력하는 게 원칙입니다. 모의용 키와 실전용 키는 따로 발급되므로, 검수 기간에는 모의 키만 넣어 두면 실수로 실주문이 나갈 일이 없습니다.
4. 검수 로그 점검 스크립트 — 실행 결과
로그를 눈으로 훑으면 놓칩니다. 아래는 KIS 봇 로그에서 ①~④를 세는 짧은 스크립트입니다. 로그 형식은 프로그램마다 다르니 정규식의 키워드(host=, tr_id=, ODNO=, msg_cd=)만 맞추면 됩니다.
"""납품 검수용 로그 점검 — 봇 로그에서 검수 항목 4개를 센다."""
import re, sys
from collections import Counter
text = open(sys.argv[1], encoding="utf-8").read().splitlines()
hosts = Counter(m.group(1) for l in text if (m := re.search(r"host=(\S+)", l)))
tr_ids = Counter(m.group(1) for l in text if (m := re.search(r"tr_id=(\w+)", l)))
orders = [l for l in text if "order-cash" in l]
ok = [l for l in text if "msg_cd=APBK0013" in l]
no_odno = [l for l in ok if re.search(r"ODNO=\s*$", l)]
errors = Counter(m.group(1) for l in text if (m := re.search(r"msg_cd=(EGW\d+)", l)))
print("[1] 접속 서버 :", dict(hosts))
print("[2] tr_id :", dict(tr_ids))
real = [t for t in tr_ids if t.startswith("TTTC")]
print(" 실전 tr_id 섞임:", real if real else "없음")
print("[3] 주문 요청 %d건 / 접수 %d건 / 주문번호 빈 응답 %d건" % (len(orders), len(ok), len(no_odno)))
for l in no_odno:
print(" ->", l[:19], "ODNO 비어 있음")
print("[4] 에러코드 :", dict(errors) if errors else "없음")
print(" 체결조회 호출:", "있음" if "VTTC0081R" in tr_ids or "TTTC0081R" in tr_ids else "없음")
검수용으로 만든 예시 로그 10줄(가상 데이터 — 모의투자 하루치를 줄인 형태)에 돌린 실제 출력입니다. Python 3.10.4, 2026-10-29 실행.
[1] 접속 서버 : {'openapivts.koreainvestment.com:29443': 1}
[2] tr_id : {'VTTC0012U': 3, 'VTTC0011U': 1, 'VTTC0081R': 1}
실전 tr_id 섞임: 없음
[3] 주문 요청 4건 / 접수 3건 / 주문번호 빈 응답 1건
-> 2026-10-27 14:31:05 ODNO 비어 있음
[4] 에러코드 : {'EGW00201': 1}
체결조회 호출: 있음
읽는 법은 이렇습니다. 서버와 tr_id는 합격입니다. 그런데 주문 4건 중 1건은 EGW00201로 거절된 뒤 재시도로 들어갔고, 14:31 매도 1건은 접수 응답은 받았는데 로그에 주문번호가 비어 있습니다. 이 두 줄이 그대로 수정 요청서가 됩니다. "10:12 EGW00201 발생 — 주문 간격 조정 요청", "14:31 매도 ODNO 미기록 — 정정·취소 불가 우려". 막연한 "가끔 이상해요"보다 고치는 쪽도 빠르고, 명세서 범위 안의 결함이라 무상 수정 대상인지도 바로 판단됩니다. EGW00201 자체의 원인은 EGW00201 단건 글에 있습니다.
5. 무상 수정과 추가 비용이 갈리는 곳
| 검수에서 나온 것 | 보통의 처리 |
|---|---|
| 명세서에 있는 조건이 다르게 동작(예: 15:20 이후 주문이 나감) | 무상 수정 — 명세서 불이행 |
주문번호 미기록, 재시작 시 중복 매수, 실전·모의 tr_id 혼용 | 무상 수정 — 정상 동작의 전제 |
| 돌려 보니 손절선을 −3%에서 −5%로 바꾸고 싶음 | 파라미터가 설정값으로 빠져 있으면 직접 변경, 코드 수정이면 협의 |
| 텔레그램 알림 추가, 종목 조건 추가, 증권사 추가 | 새 기능 — 별도 견적 |
| 수익이 기대보다 낮음 | 검수 대상 아님 — 프로그램은 전략을 실행할 뿐 수익을 보장하지 않습니다 |
알고랩은 납품 후 30일 동안 협의된 범위 안의 오류를 무료로 고치고, 30일이 지난 뒤의 수정이나 명세서에 없던 기능은 별도 견적으로 진행합니다. 그 이후의 API 변경 대응(예: 키움 TR 삭제, KIS tr_id 개편)은 사후관리의 영역입니다. 납품 당일 실행조차 안 되는 경우는 첫 실행 오류 7곳부터 보십시오.
6. 자주 묻는 질문
자동매매 제작비는 착수금·잔금으로 나눠 내나요?
업체마다 다릅니다. 알고랩은 계좌이체의 경우 견적·명세서 동의 후 전액 선결제이고, 착수 전에는 전액, 착수 후 납품 전에는 미진행분을 환불합니다. 크몽으로 결제하면 대금은 크몽이 보관하다가 구매확정 때 정산됩니다. 어느 방식이든 돈을 지키는 장치는 분할 비율보다 검수 순서와 명세서입니다.
크몽에서 작업물을 받고 확인을 안 하면 어떻게 되나요?
크몽 고객센터 안내에 따르면 작업물 발송일로부터 7일 동안 수정 요청이나 구매확정을 하지 않으면 자동으로 구매확정됩니다. 구매확정 뒤에는 수정·취소·환불을 요청할 수 없으므로, 모의투자 검수는 그 안에 끝내거나 수정 요청으로 확정을 보류해야 합니다. 정확한 날짜는 거래 화면에서 확인하십시오.
검수할 때 실계좌로 바로 돌려도 되나요?
모의투자로 주문·체결·재시작까지 확인한 뒤에 실계좌로 옮기는 순서를 권합니다. KIS는 모의 서버 openapivts.koreainvestment.com:29443과 VTTC 계열 tr_id, 키움 REST는 mockapi.kiwoom.com을 씁니다. 실계좌 첫날은 1주 같은 최소 수량으로 주문번호와 체결을 확인합니다. 전환 절차는 모의→실전 전환 글에 있습니다.
검수에서 문제가 나오면 무료로 고쳐 주나요?
명세서에 적힌 기능이 그대로 동작하지 않는 것은 무상 수정 대상입니다. 알고랩은 납품 후 30일 동안 협의된 범위 안의 오류를 무료로 고칩니다. 명세서에 없던 조건 추가나 새 기능은 별도 견적입니다. 그래서 검수표는 명세서 항목을 그대로 옮겨 만드는 것이 좋습니다.
※ 결제·환불 조건은 2026-10-29 기준 알고랩 이용약관과 크몽 고객센터 안내를 옮긴 것입니다. 크몽 거래의 실제 자동 구매확정일은 거래 화면에서, 증권사 API 서버 주소와 tr_id는 KIS Developers·키움 REST API 공식 문서에서 확인하십시오. 알고랩은 프로그램 제작 서비스이며 투자 수익을 보장하지 않습니다.
검수표까지 명세서에 같이 적어 드립니다
만들 기능과 함께 "무엇이 되면 합격인지"를 견적 단계에서 정해 두면 납품 날이 편해집니다. 24시간 빠른 답변 가능합니다.
무료 상담 시작하기