국내주식, 키움증권 신 REST

키움 REST 그리드 매매, 10종목 동시에 차수마다 따로 익절

"종목 여러 개에 격자를 깔아 두고, 산 차수만 따로 익절하고, 팔리면 그 자리에 다시 사고 싶다." 2026년 8월에 납품한 그리드 봇입니다. 처음 명세서는 구 OpenAPI+(OCX)였는데 신 REST API로 바꿔 만들었고, 납품 뒤 실계좌 운용에서 나온 문제를 고치느라 v1.0.0에서 v1.8.1까지 열세 번 버전이 올라갔습니다.

플랫폼
키움증권 신 OpenAPI
(REST와 WebSocket, 64bit)
전략
그리드 분할매수
차수별 익절과 전체청산
규모
최대 10종목 동시
차수 최대 40개
제작 기간
약 3주, 운용 보수 2주
키움 REST 그리드 매매 프로그램 대시보드. 종목 탭 3개, 차수별 매수가와 매도가, 상태 표, 실시간 현재가와 거래소 표시
납품한 프로그램의 대시보드 탭. 종목마다 탭이 하나씩 있고, 차수별로 매수가와 익절가, 상태가 한 줄씩 나옵니다. 화면의 종목과 수량은 예시값입니다.

01어떤 요청이었나

의뢰인은 이미 손으로 그리드 매매를 하고 계셨습니다. 기준가에서 몇 % 떨어질 때마다 한 차수씩 사고, 각 차수가 몇 % 오르면 그 차수만 팔고, 팔린 자리는 다시 사 두는 방식입니다. 종목이 서너 개를 넘어가면서 미체결 주문을 사람이 관리하기가 어려워졌고, 15:30 이후 넥스트레이드(NXT) 시간외에도 이어서 돌리고 싶다는 게 출발점이었습니다.

명세서에는 키움 OpenAPI+(OCX)라고 적혀 있었습니다. 저희는 REST로 바꾸자고 제안했습니다. OCX는 영웅문을 백그라운드에 항상 켜 둬야 하고 32비트 파이썬을 써야 해서 설치와 운영이 번거롭습니다. REST는 그 둘이 다 필요 없습니다. 대신 앱키 발급과 지정단말기 등록이 필요한데, 이건 상담 때 화면을 같이 보면서 끝냈습니다.

02그리드가 돌아가는 방식

차수 가격은 기준가 × (1 + 증감률)^(기준회차 − 차수번호)로 계산해 호가단위에 맞춥니다. 기준가 100,000원, 증감률 3%, 기준회차 5차라고 하면 대략 이런 표가 만들어집니다.

차수매수가익절가 (+2.7%)동작
3차106,090108,950기준가 위, 대기
4차103,000105,780대기
5차 (기준)100,000102,700지정가 매수 걸림
6차97,09099,710지정가 매수 걸림
7차94,26096,800지정가 매수 걸림

어느 차수든 체결되면 그 차수만 설정한 이득률만큼 위에 익절 지정가를 걸고, 팔리면 다시 같은 자리에 매수를 겁니다. 여기에 전체청산가격을 따로 두어서, 가격이 거기 닿으면 보유한 차수를 모두 정리합니다. 두 방식은 동시에 켜 둡니다.

03실계좌에서 실제로 겪은 일

이 프로그램은 테스트가 902개(파일 6개) 돌아가는 상태로 나갔는데도, 실계좌에서 문제가 여럿 나왔습니다. 대부분 동작은 하는데 조용히 틀리는 유형이라 증상만 보고는 원인을 못 찾았고, 읽기 전용 진단 스크립트로 실제 응답을 찍어 보며 잡았습니다.

운용 1주차, 익절 매도가 안 나감

ETF는 넥스트레이드 대상이 아니었다

15:30 이후 어떤 종목의 익절 매도가 전부 거부됐습니다. 표 메모에는 넥스트레이드 관련 오류 코드만 남았고요. 원인은 단순했습니다. NXT는 주식만 취급하고 ETF와 ETN은 대상이 아닌데, 15:30 이후를 무조건 NXT로 보내고 있었습니다. 더 나쁜 건, 거부됐을 때 정규장으로 돌리는 처리가 전체청산 쪽에만 있고 익절 매도 쪽에는 없었다는 점입니다. 거부되면 기다렸다가 또 NXT로 보내기를 끝없이 되풀이했습니다.

한 번 거부된 종목은 프로그램이 기억해 두고 정규장 전용으로 돌립니다. 매수와 매도, 청산이 거래소를 고를 때 같은 판정을 쓰도록 하나로 합쳤습니다.

운용 2주차, 물량이 두 배가 됨

그리드를 다시 만들면 보유가 지워졌다

의뢰인이 4만 주를 들고 있는 종목에서 [중지], [그리드 생성/적용], [시작]을 차례로 눌렀더니 10차 한 곳에 15,302주가 몰리고 나머지 차수는 전부 다시 매수가 나갔습니다. 그리드를 다시 만들면서 차수별 보유수량이 0으로 지워졌고, 시작할 때 잔고를 대조하면서 기존 물량을 기준회차 한 곳에 넣어 버린 겁니다. 경고문에도 수동 편집값이 초기화된다고만 있었지 보유 얘기는 없었습니다.

지금은 그리드를 다시 만들 때 보유와 주문을 매입가가 가까운 새 차수로 옮기고, 익절가도 실제 매입가 기준으로 다시 계산합니다. 확인창에는 보유 몇 주를 어떻게 처리하는지가 수치로 뜹니다.

2026-08-07 18:13, "중요하진 않은데요"라며 알려주신 것

시간외인데 KRX 가격으로 판단하고 있었다

의뢰인이 화면 현재가가 영웅문과 조금 다르다고 지나가듯 말씀하셨습니다. 확인해 보니 시간외에는 주문이 NXT로 나가는데 현재가는 KRX 시세를 조회하고 있었습니다. 그날 삼성전자가 KRX 231,000원, NXT 235,500원으로 1.9% 차이가 났습니다. 증감률 3% 그리드에서는 차수가 한 칸 가까이 밀리는 값입니다.

NXT 시세를 따로 받는 방법을 확인하고, 시세가 들어오는 세 경로를 전부 지금 주문이 나가는 거래소 기준으로 고쳤습니다. 사용자가 중요하지 않다고 한 표시 불일치가 계산 불일치의 증상인 경우가 많다는 걸 다시 배웠습니다.

키움 REST 그리드 매매 프로그램 로그 탭. 인증, WebSocket 구독, 차수별 매수 접수와 체결, 익절 매도, NXT 라우팅 로그
로그 탭. 인증, 구독, 차수별 접수와 체결, 어느 거래소로 나갔는지가 시간순으로 남습니다. 예시 로그입니다.

04그래서 지금 구조는

종목마다 독립된 그리드 엔진을 두고, 증권사 통신과 주문 발송, 알림, 매매내역은 같이 씁니다. 시세와 체결, 잔고 정보가 종목코드별로 오기 때문에 종목별 엔진에 나눠 주기만 하면 서로 간섭이 없습니다. 계좌를 나눌 필요도 없습니다.

05납품물

키움증권 신 REST API (REST, WebSocket) Python 3.10 64bit PyQt5 APScheduler Telegram Bot API PyInstaller

06자주 묻는 것

영웅문을 켜 둬야 하나요?

아니요. REST라서 영웅문이 필요 없고 32비트 제약도 없습니다. 대신 앱키 발급과 지정단말기 등록을 먼저 해야 하는데, 절차는 키움 REST 앱키 발급 가이드에 화면과 함께 적어 뒀습니다.

ETF도 시간외에 되나요?

안 됩니다. NXT는 주식만 취급합니다. 프로그램이 한 번 거부된 종목을 기억해서 정규장 전용으로 돌립니다. NXT 자체에 대한 설명은 키움 REST API 자동매매 가이드를 보시면 됩니다.

그리드 간격이나 차수 수는 바꿀 수 있나요?

종목마다 기준가, 증감률, 차수 수, 차수당 수량, 이득률, 전체청산가격을 따로 둡니다. 저장하면 다음 사이클부터 적용되고 프로그램을 다시 켤 필요는 없습니다. 다만 보유 중에 그리드를 다시 만들면 물량이 새 차수로 옮겨진다는 점은 확인창에서 한 번 더 보게 됩니다.

07관련 사례

키움 REST로 주문을 넣을 때 요청이 어떻게 생겼는지는 키움 REST API 주식 주문 정리에 있습니다.

※ 본 사례는 고객 요구사항을 익명 처리하여 재구성한 것이며, 화면의 종목, 수량, 가격은 예시값입니다. 수익률과 수익금은 공개하지 않습니다. 알고랩은 매매 자동화 프로그램 제작 서비스이며, 종목 추천, 투자 자문, 수익 보장 서비스가 아닙니다. 그리드(분할매수) 전략은 하락 추세에서 손실이 누적될 수 있습니다.

손으로 하던 그리드, 그대로 옮겨 드립니다

지금 쓰시는 기준가와 간격, 차수 수를 알려 주시면 됩니다.
증권사가 키움이 아니어도 상담에서 말씀해 주세요.

무료 상담 시작하기 고객 후기 보기
← 제작 사례 전체 보기