"종목 고르고 사는 건 제가 할게요. 파는 것만 규칙대로 대신 해 주세요."
명세서는 이 말에서 크게 벗어나지 않았습니다. 매수 기능이 없는 매도 전용 프로그램이고,
계좌 두 개가 서로 다른 규칙으로 따로 돕니다. 2026년 8월 말에 납품했습니다.
플랫폼
키움증권 신 OpenAPI (REST, 64bit)
역할
매도 전용 진입 로직 없음
주문
15:20 동시호가 시장가 전량
제작 기간
약 2주 (자동 테스트 382개)
계좌 1 탭. 추적 중인 종목마다 매수일 이후 양봉과 음봉 개수, 오늘 매도 예정 여부가 보입니다 (종목과 수량은 예시값)
01두 계좌, 두 규칙
의뢰인은 계좌 두 개에 각각 다른 매도 원칙을 정해 두고 손으로 지키고 있었습니다.
그러려면 매일 15:20 전에 종목마다 봉을 세고 5일선을 확인해야 합니다. 하루라도 빼먹으면 원칙이 무너집니다.
계좌 1
매수 다음 거래일부터 양봉 2개 또는 음봉 2개 누적
연속일 필요는 없고 합친 개수로 셉니다. 양봉 하나에 음봉 하나면 아직 기다리고, 어느 쪽이든 2개가 차는 날 팝니다.
계좌 2
종가 < 5일 이동평균선
조건은 이것 하나입니다. 종가와 5일선이 같으면 이탈로 보지 않습니다. 15:19:30의 현재가를 그날 종가로 보고 판정합니다.
추적하는 것은 프로그램을 켠 뒤 새로 산 종목만입니다. 켤 때 이미 있던 잔고는 기준선으로 잡아 두고 건드리지 않습니다.
원래 들고 있던 종목도 규칙에 넣고 싶으면 [기존 보유 추적] 버튼으로 골라서 올리면 됩니다.
익절이나 손절 개념은 없습니다. 조건이 맞으면 보유 전량을 시장가로 냅니다.
0215:19:30에 판정하고, 15:20:00에 주문한다
규칙은 단순한데 만들 때는 시각 문제에 품이 절반쯤 들었습니다. 하루는 이렇게 흘러갑니다.
09:00 시작합니다. 잔고 기준선을 확인하고 어제까지의 추적 상태를 되살립니다. 자동매도 스위치는 항상 꺼진 채로 시작합니다. 프로그램을 다시 켠 것만으로 매도가 나가면 안 되기 때문입니다.
장중 잔고를 주기적으로 보다가 새로 산 종목이 생기면 추적에 올립니다. 봉 개수는 저장해 두지 않고 매번 일봉을 다시 받아 셉니다. 그래서 프로그램이 며칠 꺼져 있었어도 숫자가 맞습니다.
15:19:30 종목별로 판정하고 결과를 고정합니다. 고정하지 않으면 남은 30초 사이에 시세가 한 번 움직여 매도 대상이 바뀔 수 있고, 매매기록에는 매도신호가 남았는데 주문은 안 나가는 일이 생깁니다. 화면의 상태 표시도 이 고정된 결과를 따릅니다.
15:20:00 고정해 둔 대상에만 시장가 전량 매도 주문을 냅니다. 주문을 보냈는지는 그 자리에서 저장합니다.
15:30 잔고가 줄었는지 확인하고 추적을 닫습니다.
종목이 많으면 판정 시각을 자동으로 앞당깁니다. 키움 REST는 요청 사이에 간격을 둬야 해서 종목 수만큼 시간이 걸리는데,
15:20까지 판정을 못 끝내면 그날 매도가 통째로 빠지기 때문입니다. 프로그램이 필요한 만큼 당기고 그 사실을 화면에 띄웁니다. 09:00보다 앞으로는 당기지 않습니다.
개발 PC 시계가 11초 빨랐다
주문 시각은 키움 서버 시각을 기준으로 잡습니다. 서버 응답에 찍힌 시각과 PC 시계의 차이를 구해 모든 시각 계산에 반영합니다.
PC 시계가 11초 빠르면 PC의 15:20:00은 실제로 15:19:49입니다. 동시호가가 열리기 전이라 정규장 시장가로 바로 체결돼 버립니다.
휴장인지도 공휴일 표 대신 오늘 일봉이 있는지를 보고 판단합니다. 사람이 관리하는 표가 틀리면 개장일을 휴장일로 잘못 알고 그날 매도를 놓칩니다.
03고치고 나서야 알게 된 것들
납품 전에 점검 방법을 바꿔 가며 10라운드 연속으로 결함이 0건 나올 때까지 자체 점검을 돌렸습니다. 1차 31라운드에서 23건, 2차 10라운드에서 10건이 나왔습니다.
다른 프로젝트에서도 똑같이 생길 만한 것만 골랐습니다.
잔고를 못 읽은 경우와 잔고가 빈 경우를 프로그램이 구분하지 못하고 있었습니다. 엔진은 잔고에서 사라진 종목을 전량 매도된 것으로 처리합니다. 키움 응답 형식이 조금만 달라져도 팔리지 않은 종목이 체결완료로 기록되고 추적에서 지워질 뻔했습니다. 지금은 잔고를 못 읽으면 직전 상태를 그대로 유지합니다.
배포 설정이 모의투자 서버로, 계좌 2는 꺼진 상태로 돼 있는지 검사하는 납품 검사 파일이 있었습니다. 그런데 파일 이름이 테스트 도구가 찾는 규칙과 달라서 한 번도 실행된 적이 없었습니다. 통과 표시만 보고 넘어갈 뻔했습니다. 그 뒤로는 테스트를 썼는지와 테스트가 실제로 도는지를 따로 확인합니다.
부정형 체크박스도 실거래 사고가 될 뻔했습니다. "매수 당일 봉은 판정에서 제외"라는 체크박스를 반대로 이해하면 산 날 15:20에 바로 팔립니다. 고객이 "선택할 수 있게 해 달라"고 요청했는데 그 기능은 이미 있었습니다. 찾지 못하는 기능은 없는 것과 같아서, 둘 중 하나를 고르는 목록으로 바꿨습니다.
아무것도 검증하지 않는 테스트가 있었습니다. 판정 시각을 09:00보다 앞으로 당기지 않는지 본다는 테스트였는데, 그 제한이 걸릴 일이 없는 상황만 다루고 있었습니다. 일부러 고장 낸 코드에서 테스트가 실패하는지 보는 검사로 찾았고, 고장 29가지가 모두 잡힐 때까지 고쳤습니다.
Windows 기본 압축 명령으로 만든 zip은 반디집, 알집, 파이썬에서 열리지 않았습니다. 탐색기에서는 열려서 모르고 지나가기 쉽습니다. 납품용 zip은 파이썬으로 만들고, 만든 직후 다시 열어 검사합니다.
로그 탭. 종목별 판정 근거가 한 줄씩 남고, 15:19:30의 판정 고정과 15:20:00의 주문이 따로 찍힙니다 (예시 로그)
04납품물
Windows 실행 파일(64bit, 영웅문 불필요)과 설정 파일 템플릿
PyQt5 화면. 계좌별 탭, 설정, 로그, [기존 보유 추적] 창이 있습니다
날짜별 매매기록 CSV, 30일치 로그
워드 사용설명서 38쪽. 설명서 문구가 화면의 이름, 기본값과 일치하는지 자동으로 대조하는 검사도 붙였습니다. 문제 해결 장에 옛 이름이 남아 있어 고객이 물어본 뒤에 만든 것입니다
자동 테스트 382개. 실계좌나 네트워크 없이 전부 돌아갑니다
[기존 보유 추적] 창. 프로그램을 켜기 전에 산 종목도 골라서 규칙에 넣을 수 있습니다
키움증권 신 REST APIPython 3.10 64bitPyQt5pytest (382)PyInstallerdocx-js (사용설명서)
05자주 묻는 것
텔레그램 알림은 없나요?
이 건에는 없습니다. 의뢰인이 장중에 화면을 보고 계신 분이라 요청하지 않으셨고, 넣지 않으면 값도 쌉니다. 필요하면 하루면 붙습니다.
모의투자로 먼저 돌려볼 수 있나요?
됩니다. 설정에서 모의와 실전을 바꾸면 프로그램을 다시 켜지 않아도 다음 [시작]부터 적용됩니다.
처음에는 재시작이 필요하다는 안내가 붙어 있었는데, 살펴보니 재시작 없이도 되는 일이어서 고쳤습니다.
앱키 발급 절차는 키움 REST 앱키 발급 가이드에 있습니다.
규칙을 바꾸고 싶으면요?
봉 개수, 이동평균 기간, 판정 시각, 계좌별 사용 여부는 설정 화면에서 바꿉니다.
판정 부분은 일봉과 매수일만 받아 계산하도록 따로 떼어 놓았습니다. 3봉 누적이나 20일선 이탈 같은 변형은 코드 몇 줄로 됩니다.