"계좌 세 개를 각각 다른 조건식과 다른 규칙으로, 로그인은 한 번만." 2026년 4월에 납품한 키움 OpenAPI+ 프로그램입니다.
슬롯 하나에 계좌 하나, 조건식 하나, 매매 규칙 한 벌이 들어가고 세 슬롯이 한 화면에서 따로 돕니다.
납품 뒤 3주 동안 패치를 열여덟 번 냈습니다. 대부분 실계좌에서만 드러나는 키움 API의 성질 때문이었고, 이때 정리한 목록이 이후 키움 프로젝트의 기준이 됐습니다.
플랫폼
키움증권 OpenAPI+ (OCX, 32bit)
구조
3슬롯 독립 운용 1로그인, 최대 3계좌
전략
HTS 조건검색 편입 후 분할매수, 손절과 분할익절
제작 기간
약 3주, 이후 패치 3주
슬롯 A 탭. 왼쪽이 그 슬롯의 계좌와 조건식, 분할매수 설정, 오른쪽이 매칭 종목과 포지션, 아래가 슬롯별 로그 (계좌와 종목은 예시값)
01슬롯 하나의 규칙
단계
내용
편입
HTS에서 만든 조건검색식을 실시간 등록. 슬롯별 매매 시간(예: 09:00~15:20) 안에서만
필터
보조지표는 두 번째 버전부터 조건식 안에 넣습니다. 재무 필터는 DART OpenAPI의 영업이익 증가율
분할매수
1차는 즉시, 2차와 3차는 직전 차수 대비 ±N%에서 매수. 양수면 불타기, 음수면 물타기. 단위는 만원 또는 주
청산
가중평균 평단 기준 −5% 손절, 40%, 30%, 30% 분할익절과 추가 상승 트리거. 모두 시장가
체결통보는 계좌번호를 보고 해당 슬롯으로 보냅니다. 같은 종목이 두 슬롯의 조건에 동시에 걸리면 각자 자기 계좌에서 사고, 한쪽이 팔아도 다른 쪽에는 영향이 없습니다.
첫 버전의 단일 슬롯 설정은 새 버전으로 자동으로 옮겨집니다.
02납품 후 3주, 패치 18회
의뢰인 보고와 로그 분석에서 나온 것들입니다.
보유 종목이 −3% 떨어졌는데 2차 매수가 안 됐다는 보고가 처음이었습니다. 프로그램은 주문을 보낸 뒤 체결통보가 와야 진행 중 표시를 지웁니다. 그런데 VI 발동이나 단일가 구간, 키움의 말없는 거부에서는 통보가 오지 않아 그 종목의 분할매수가 계속 막혀 있었습니다. 15초가 지나면 표시를 자동으로 풀게 했습니다.
17주씩 두 번 체결됐는데 DB에는 68주로 적힌 일도 있었습니다. 키움 체결통보의 체결수량은 누적 수량으로 옵니다. 17, 34로 온 것을 그대로 더한 것입니다. 직전 누적 수량과의 차이만 반영하도록 고쳤습니다.
"오전에 판 종목을 오후에 다시 샀는데 손절이 이상하게 잡힌다"는 문의가 왔습니다. 전량 매도로 수량이 0이 돼도 이전 매수 내역이 남아 있었고, 다시 살 때 그 위에 새 내역이 얹혀 평단이 두 번의 매매를 합친 값이 됐습니다. 지금은 전량 매도 때, 매수 때 남은 내역이 보일 때, 잔고 동기화 때 각각 초기화합니다.
잔고 조회 응답은 체결통보보다 늦습니다. 매수 직후 잔고를 동기화하면 방금 산 종목이 아직 없어서 수량이 0으로 바뀌고 손절과 익절 판단이 멈춥니다. 주문이 진행 중인 종목은 0으로 바꾸지 않게 했습니다.
켜자마자 어제 들고 있던 종목을 또 산 적이 있습니다. 잔고 동기화가 끝나기 전에 조건 매칭이 들어와 빈 포지션 목록을 보고 신규 매수로 판단한 것입니다. 지금은 DB에서 포지션을 되살리고, 잔고 동기화에 성공한 뒤 90초 이내일 때만 매수합니다.
예약 실행 쪽에서 키움 API를 직접 부르면 응답이 오지 않았습니다. 키움 OpenAPI+는 프로그램의 메인 흐름에서만 불러야 해서, 예약 실행은 시각만 알리고 호출은 메인 흐름이 하도록 바꿨습니다. 체결통보를 처리하는 도중 다른 통보가 끼어들어 상태가 꼬이던 문제도 같은 뿌리라 함께 고쳤습니다.
자동으로 한 적 없는 2차 매수가 찍혔다는 문의도 있었습니다. 의뢰인이 같은 계좌에서 HTS로 직접 산 것이 체결통보로 들어와 2단계, 3단계로 표시된 것이었습니다. 프로그램이 보낸 주문에 표식을 붙여 로그에서 바로 구분되게 했습니다.
정지 중인 슬롯은 설정이 열립니다. 실행 중엔 잠깁니다
03납품물과 기술
Windows 32bit 실행 파일. 영웅문 OpenAPI+ 상시 로그인이 필요하고 계정 하나에 프로그램 하나만 띄웁니다.
PyQt5 어두운 테마 화면. 슬롯 탭 3개에 탭마다 설정, 매칭 종목, 포지션, 체결, 로그가 있고 긴급 전량 청산 버튼이 있습니다.