(REST, 64bit)
"종목 고르고 사는 건 제가 할게요. 파는 것만 규칙대로 대신 해 주세요." 이 한 문장이 명세서의 전부에 가까웠습니다. 진입 로직이 없는 매도 전용 프로그램이고, 계좌 두 개가 서로 다른 규칙으로 완전히 따로 돕니다. 2026년 8월 말에 납품했습니다.
의뢰인은 계좌 두 개를 쓰면서 각각 다른 매도 원칙을 손으로 지키고 있었습니다. 문제는 매일 15:20 전에 종목마다 봉을 세고 5일선을 확인해야 한다는 것, 그리고 그걸 하루라도 빼먹으면 원칙이 무너진다는 것이었습니다.
연속이 아니라 총 개수입니다. 양 1·음 1이면 아직 대기, 어느 쪽이든 2개가 차는 날 매도.
조건 하나. 등호는 이탈로 보지 않습니다. 15:19:30 현재가를 그날 종가로 간주해 판정합니다.
추적 대상은 프로그램을 켠 뒤 새로 산 종목만입니다. 시작 시점의 잔고는 기준선으로 잡아 두고 건드리지 않습니다. 원래 들고 있던 종목도 규칙에 넣고 싶으면 [기존 보유 추적] 버튼으로 골라서 올릴 수 있습니다. 익절·손절 개념은 없고, 조건이 맞으면 보유 전량을 한 번에 시장가로 냅니다.
단순해 보이는데 실제로는 시각 문제가 이 프로젝트의 절반이었습니다. 하루 흐름은 이렇습니다.
trde_tp=3, 단가 공백). 발송 여부는 그 자리에서 저장합니다.종목이 많으면 판정 시각을 자동으로 앞당깁니다. 키움 REST는 api-id마다 요청 간격 제한이 있어 N종목 판정에 N × 간격만큼 시간이 들고, 그걸 15:20 안에 못 끝내면 그날 매도가 통째로 빠집니다. 프로그램이 필요한 만큼 당기고(09:00이 하한) 그 사실을 화면에 띄웁니다.
주문 시각은 PC 시계가 아니라 키움 서버 시각입니다. HTTP 응답의 Date 헤더로 오프셋을 구해 모든 시각 계산에 넣습니다.
시계가 11초 빠르면 PC의 15:20:00이 실제로는 15:19:49라서, 동시호가가 열리기 전에 정규장 시장가로 그냥 체결돼 버립니다.
휴장 판단도 공휴일 표를 믿지 않고 "일봉에 오늘 봉이 있는가"로 합니다. 사람이 관리하는 표가 틀리면 개장일을 휴장일로 오판해 그날 매도가 날아갑니다.
납품 전에 기법을 바꿔 가며 "10라운드 연속 결함 0건"이 나올 때까지 자가 디버깅을 돌렸습니다. 1차 31라운드에서 23건, 2차 10라운드에서 10건. 그중 다른 프로젝트에도 옮겨 붙는 것만 적습니다.
verify_requirements.py였는데, pytest 기본 수집 패턴은 test_*.py입니다. 초록불만 보고 넘어갈 뻔했습니다. 수집 패턴을 넓히고, "테스트를 썼다"와 "테스트가 돈다"를 따로 확인하게 했습니다.Compress-Archive가 경로 구분자를 역슬래시로 써서 반디집·알집·파이썬이 거부합니다. 탐색기에서는 열리니 모릅니다. 납품 zip은 파이썬으로 만들고 만든 직후 다시 열어 검사합니다.
config.json + .env 템플릿
이 건은 없습니다. 의뢰인이 장중에 화면을 보고 있는 분이라 요청에 없었고, 안 넣는 게 값도 쌉니다. 필요하면 하루면 붙습니다.
됩니다. 설정에서 모의/실전을 바꾸면 프로그램을 다시 켜지 않아도 다음 [시작]부터 적용됩니다. 처음엔 "재시작 필요" 안내가 붙어 있었는데, 서버 주소를 들고 있는 객체만 다시 만들면 되는 일이었습니다. 앱키 발급 절차는 키움 REST 앱키 발급 가이드에 있습니다.
봉 개수, 이동평균 기간, 판정 시각, 계좌별 활성 여부는 설정 화면에서 바꿉니다. 판정 로직 자체가 입력(일봉 목록, 매수일)만 받는 순수 함수라 "3봉 누적", "20일선 이탈" 같은 변형은 코드 몇 줄입니다.
시장가 매도 요청의 실제 형태는 키움 REST API 주식 주문 — kt10000과 trde_tp에 있습니다.
"매도만", "알림만" 같은 부분 자동화도 만듭니다. 규칙이 한 줄이어도 괜찮습니다.
알고랩이 24시간 빠르게 답변드립니다.