첫 계좌가 산 종목이 정한 폭만큼 내리면 두 번째 계좌가 자기 돈으로 같은 종목을 삽니다. 거기서 또 내리면 세 번째 계좌가 삽니다. 여섯 번째 계좌까지 이렇게 이어집니다.
2026년 7월 말에 첫 버전을 납품했고, 10월 초까지 패치를 스물일곱 번 냈습니다.
앞서 만든 3슬롯 프로그램은 슬롯끼리 서로 모른 채 따로 돌았습니다. 이번에는 뒤 슬롯이 앞 슬롯의 평균 단가를 보고 움직입니다. 그 차이에서 새로운 문제가 여럿 나왔습니다.
플랫폼
키움증권 OpenAPI+ (OCX, 32bit)
구조
6슬롯 사슬 로그인 1회, 계좌 6개
전략
조건검색 또는 수동 매수로 시작 하락 시 다음 계좌가 이어받기
납품과 패치
첫 납품 2026년 7월 말 이후 약 두 달간 패치 27회
슬롯 1 탭. 사슬이 시작되는 계좌입니다. 아래 로그에 슬롯 2와 슬롯 3이 이어받아 주문을 낸 기록이 보입니다 (계좌, 종목, 가격, 설정값은 모두 예시)
01사슬이 움직이는 규칙
단계
내용
시작
슬롯 1이 HTS 조건검색식에 편입된 종목을 삽니다. 종목코드를 직접 넣어 수동으로 시작할 수도 있습니다
이어받기
슬롯 2부터 6까지는 조건식 없이 앞 슬롯의 보유 종목만 봅니다. 앞 슬롯 평균 단가 대비 정한 폭만큼 내리면 자기 계좌로 삽니다. 폭과 금액은 슬롯마다 따로 정합니다
매수 주문
현재가 지정가. 일정 시간 체결되지 않으면 취소하고 다시 내되 횟수 상한이 있습니다
익절
슬롯 1은 3단계 분할익절과 트레일링 스탑, 슬롯 2부터 6까지는 단순 익절
손절
슬롯별 손절 기준. 정규장은 시장가, 애프터마켓은 최유리지정가
안전장치
한 종목은 슬롯마다 한 번만 매수, 같은 계좌를 두 슬롯에 지정하면 시작 거부, 당일 재매수 금지가 기본값, 예수금이 모자라면 건너뜀
복원
보유 종목과 익절 진행 단계를 SQLite에 저장. 다시 켜면 잔고와 맞춘 뒤에 매수를 재개합니다
여섯 계좌가 모두 같은 OCX 로그인을 씁니다. 체결 통보는 계좌번호로 나눠 해당 슬롯에 돌려주고, 시세는 종목 단위로 한 번만 받아 여섯 슬롯이 함께 씁니다.
다중 PC가 같은 종목 목록을 받아 가는 종목풀 동기화 사례와도 다릅니다. 그쪽은 목록만 공유하고 매매는 각자 하지만, 여기는 앞 계좌의 매수 결과가 다음 계좌의 매수 조건이 됩니다.
슬롯 3 탭. 조건식은 비워 두고 감시할 슬롯만 슬롯 2로 지정합니다. 재매수 정책은 네 가지 중에서 고릅니다 (값은 예시)
02납품 뒤 두 달, 패치 27회
실계좌에서 의뢰인이 보내 준 로그로 원인을 찾은 것들입니다. 종목과 금액은 빼고 적습니다.
계좌가 여섯 개가 되자 매수가 절반은 막혔습니다. 잔고를 30초마다 한 계좌씩 조회했는데, 여섯 계좌를 한 바퀴 돌면 180초입니다. 매수는 잔고를 받은 지 90초 이내일 때만 허용하고 있었으니 시간의 절반은 매수가 보류됐습니다. 주기를 8초로 줄이고, 순서대로 도는 대신 가장 오래 갱신되지 않은 계좌를 먼저 조회하도록 바꿨습니다.
설정 금액의 두 배가 매수된 적이 있습니다. 키움은 취소가 받아들여지면 원래 주문번호로 접수 상태의 통보를 한 번 더 보냅니다. 미체결 수량과 체결 수량이 모두 0인 것만 다릅니다. 이걸 새 주문 접수로 읽어서, 이미 취소한 주문이 미체결 목록에 되살아났고 취소와 재주문이 반복됐습니다. 접수 상태인데 미체결과 체결이 모두 0이면 취소 확인으로 처리하도록 고쳤습니다.
재주문 횟수 상한이 한 번도 걸리지 않은 것도 찾았습니다. 재시도 횟수를 주문에 딸린 정보로 들고 다녔는데, 주문번호는 체결 통보로 나중에 들어오고 그때 정보가 새로 만들어져 횟수가 늘 0이었습니다. 슬롯과 종목을 묶어 직접 세도록 바꿨습니다.
동시호가의 예상체결가를 보고 손절이 나간 일도 있었습니다. 장 시작 전과 마감 직전에는 실시간 시세로 예상체결가가 들어오는데 값이 크게 튑니다. 처음에는 한 번에 크게 튄 값만 걸렀더니, 조금씩 여러 번 내려오는 값에는 기준이 따라 내려갔습니다. 지금은 동시호가와 휴장 시간에는 기준값을 직전 정규장 가격에 고정하고, 정규장 시세로 확인된 뒤에만 매도 판단을 합니다. 이 검증은 처음에 매도 쪽에만 있었는데, 시세는 종목의 속성이라 프로그램 전체가 하나를 같이 쓰도록 옮겼습니다.
장이 열리자마자 여러 종목이 한꺼번에 팔린 날이 있었습니다. 익절에도 손절에도 해당하지 않는 가격이었습니다. 트레일링 스탑은 올랐던 고점에서 되돌아오면 파는 기능인데, 그 고점을 익절 진행 단계로 미루어 짐작하고 있었습니다. 단계는 매도 주문을 보내는 순간 올라갑니다. 보낸 주문이 체결되지 않고 장 마감으로 사라지면 단계만 올라간 채 남고, 다음 날 기준선이 실제로는 가 본 적 없는 높이에 잡힙니다. 고점을 짐작하지 않고 검증된 시세로 직접 기록하도록 바꿨고, 찍어 본 적 없는 고점으로는 팔지 않습니다.
1차 익절 뒤 2차와 3차가 나가지 않은 것도 원인이 같았습니다. 전량 매도 주문은 보내자마자 3차까지 끝난 것으로 기록했는데 그 주문이 체결되지 않으면 기록만 남았습니다. 장이 닫힐 때마다 실제로 판 수량과 기록된 단계를 맞춰 보고, 판 수량보다 높게 적힌 단계는 낮춥니다. 장중에 다시 켠 경우에는 살아 있는 주문이 있을 수 있어 그때는 건드리지 않습니다.
재주문이 오른 가격을 쫓아가 산 경우도 있었습니다. 연동 매수가 체결되지 않으면 취소하고 현재가로 다시 내는데, 가격만 바꾸고 수량과 조건은 처음 그대로였습니다. 그 사이 가격이 오르면 금액이 설정보다 커지고, 이어받기 조건도 이미 맞지 않는 상태였습니다. 다시 내기 전에 조건을 현재가로 다시 판단하고, 처음 판단한 가격에서 많이 올랐으면 주문하지 않고, 조금 올랐으면 수량을 줄여 금액을 넘기지 않습니다.
로그인은 됐는데 계좌 목록이 비어 있던 날이 있었습니다. 주문이 전부 거부됐지만 프로그램은 조용히 돌아갔고, 손절이 나가지 않는다는 걸 장중에야 알았습니다. 로그인 직후 계좌 목록이 비면 바로 경고창을 띄우고 조치 순서를 안내합니다.
사고 로그를 받아도 어느 버전에서 난 일인지 알 수 없던 적이 있어서, 시작할 때 로그 첫 줄에 버전을 남기게 했습니다.
의뢰인이 어떤 종목이 왜 팔렸는지 직접 확인할 수 있도록 로그 보는 법 문서도 따로 드렸습니다. 체결 기록에서 시각을 찾고, 그 바로 앞 줄에서 익절인지 손절인지 트레일링인지 읽는 순서입니다.
03애프터마켓 대응과 점검 도구
8월에는 정규장 이후 시간대에도 이 프로그램을 돌릴 수 있는지가 과제였습니다. 코드를 고치기 전에 확인부터 했습니다.
주문 기능이 아예 들어 있지 않은 작은 점검 프로그램을 따로 만들어 보냈고, 의뢰인이 그 시간대에 실행해 결과 파일을 보내 주는 방식이었습니다.
1차로 넥스트레이드 시세가 실시간으로 들어오는지 봤고, 2차로 조건검색이 그 시간대에도 종목을 돌려주는지 봤습니다. 조건검색이 돌지 않으면 슬롯 1이 새 종목을 찾지 못해 사슬이 시작되지 않으므로, 이 결과에 따라 작업 범위가 달라지기 때문입니다.
9월 중순에 애프터마켓(16:00~20:00) 대응을 넣으면서 고친 것들입니다.
처음에는 매수는 나가는데 매도가 나가지 않았습니다. 손절, 익절, 트레일링 매도가 전부 시장가였는데 애프터마켓은 시장가를 받지 않습니다. 처음에는 현재가 지정가로 바꿨지만 매도 호가 줄에 서기만 하고 체결되지 않는 것을 실계좌에서 확인했습니다. 주문 순간의 매수 1호가로 나가는 최유리지정가로 다시 바꿨습니다.
지금이 어느 구간인지는 프로그램이 판단합니다. 장 시작 동시호가, 정규장, 마감 동시호가, 휴장, 애프터마켓, 장 시간 외를 나눕니다. 15시 30분부터 16시 사이와 20시 이후에는 주문을 내지 않습니다. 이 시간에 낸 주문은 예약으로 남아 다음 날 엉뚱한 가격에 체결될 수 있습니다.
거부될 주문은 미리 거릅니다. 애프터마켓 거래 대상이 아닌 ETF와 ETN, 가격제한폭을 벗어난 지정가는 내지 않습니다. 거부되면 다시 시도하는 구조라 같은 주문이 반복되기 때문입니다.
장이 닫히면 미체결 기록을 정리합니다. 주식 주문은 당일만 유효한데 증권사는 주문이 사라질 때 따로 알려 주지 않습니다. 같은 종목에 매도가 두 번 나가지 않게 들고 있던 매도 주문 표시가 밤새 남으면, 다음 날 그 종목만 손절과 익절이 나가지 않습니다. 장이 닫히는 시점에 표시를 지웁니다.
04이 구조의 위험
내리는 종목을 여러 계좌가 이어서 사는 물타기 구조입니다. 한 종목에 최대 여섯 계좌 몫의 금액이 들어갈 수 있고, 하락이 멈추지 않으면 손실이 계좌 수만큼 쌓입니다.
프로그램은 정한 규칙을 그대로 실행할 뿐이고 종목이 반등할지는 알지 못합니다. 그래서 슬롯마다 손절 기준을 두게 했고, 납품 때 작은 금액으로 며칠 먼저 돌려 보시도록 안내했습니다.
위에 적은 사고 가운데 몇 건은 실제 주문이 의도와 다르게 나간 경우였습니다. 여러 계좌가 엮인 프로그램은 납품 뒤 한동안 로그를 같이 보면서 고쳐 나가는 기간이 필요합니다.
05납품물과 기술
Windows 32bit 실행 파일(PyInstaller). 영웅문 OpenAPI+ 로그인이 필요합니다
PyQt5 화면. 슬롯 탭 6개, 슬롯별 설정과 보유 포지션, 체결 내역, 실시간 로그, 긴급 전량 청산
업데이트는 실행 파일과 런타임 폴더만 덮어쓰는 방식. 설정, 보유 종목 기록, 로그는 그대로 남습니다
사용 설명서, 업데이트 방법, 로그 보는 법 문서
주문 기능이 없는 넥스트레이드 점검 도구(별도 실행 파일)
재현 테스트와 회귀 테스트 스크립트 50개 이상. 고친 결함이 다시 나오는지 버전마다 돌려 봅니다
※ 본 사례는 고객 요구사항을 익명 처리하여 재구성한 것이며, 화면의 종목, 수량, 계좌, 설정값은 예시입니다. 수익률과 수익금은 공개하지 않습니다.
하락 시 추가로 매수하는 구조는 손실이 커질 수 있으며 투자 판단과 결과의 책임은 사용자에게 있습니다.
알고랩은 매매 자동화 프로그램 제작 서비스이며, 종목 추천, 투자 자문, 수익 보장 서비스가 아닙니다.
계좌 여러 개를 엮어 매매하고 싶으시면
계좌가 몇 개인지, 어떤 순서로 사고 싶은지 상담에서 알려 주세요.
위험한 부분이 있으면 그것도 같이 말씀드립니다.