키움 OpenAPI 조건검색식 실시간 연동, 종목이 알아서 들어온다

 

키움 조건검색식으로 실시간 감시 중인 종목 목록 화면

로그인을 뚫고 나서 다음으로 한 일은, 내가 직접 만든 검색 조건을 봇에게 넘기는 거였다.

나는 이미 HTS(영웅문)에서 나만의 조건검색식을 하나 짜둔 상태였다. "실시간돌파감시"라는 이름을 붙인 조건이었다. 어떤 종목이 내가 정한 조건에 맞으면 자동으로 걸러지도록 만들어 둔 것이다. 문제는 이걸 봇이 어떻게 알아듣게 하느냐였다.

목차

HTS 조건식을 봇이 그대로 불러온다

여기서 키움 OpenAPI+의 진짜 강점이 나온다. HTS에서 만든 조건검색식을 봇이 그대로 불러다 쓸 수 있다. 내가 1편에서 REST가 아니라 이 낡은 방식에 남기로 한 이유 중 하나가 바로 이거였다.

봇을 켜면 먼저 조건식 목록을 서버에서 불러온다. 로그에는 이렇게 찍힌다.

📥 조건식 불러오기 요청(GetConditionLoad)
✅ 조건식 불러오기 완료
🎯 타겟 조건식 찾음: 실시간돌파감시 (번호 009)

내가 저장해둔 여러 조건식 중에서 "실시간돌파감시"를 찾아냈고, 그 조건식에는 009번이라는 번호가 붙어 있었다. 봇은 이 번호로 조건식을 지목한다.

실시간으로 켜면, 종목이 알아서 들어온다

조건식을 찾았으면 이제 실행이다. 여기서 나는 그냥 한 번 검색하고 마는 게 아니라, 실시간으로 돌아가게 했다.

🚀 실시간 조건식 시작(SendCondition)
🧾 최초 조건검색 결과: 47개

실행하자마자 조건에 맞는 종목 47개가 잡혔다. 그런데 실시간의 진짜 의미는 이 다음이다. 실시간으로 켜두면, 장이 돌아가는 동안 새로 조건에 맞는 종목이 생기면 자동으로 들어오고, 조건에서 벗어난 종목은 자동으로 빠진다. 키움에서는 이걸 편입(들어옴)과 이탈(빠짐)이라고 부른다. 내가 계속 화면을 들여다볼 필요가 없다는 뜻이다. 봇이 알아서 감시 목록을 갱신한다.

47종목을 실시간 감시에 걸다

조건에 걸린 47종목은 그냥 이름만 아는 게 의미가 없다. 각 종목의 가격이 실시간으로 어떻게 움직이는지 받아와야 한다. 그래서 잡힌 종목들을 하나씩 실시간 감시에 등록한다.

📡 실시간 등록 완료: 000070 (FID=10;13, type=0)
📡 실시간 등록 완료: 000150 (FID=10;13, type=1)
📡 실시간 등록 완료: 000155 (FID=10;13, type=1)
...
📌 감시목록 수: 47

여기 붙은 FID=10;13이 처음엔 뭔 소린가 싶었다. 알고 보니 이건 내가 어떤 정보를 받고 싶은지 지정하는 번호였다. FID 10은 현재가, FID 13은 누적거래량이다. 즉 나는 이 47종목의 현재가와 거래량을 실시간으로 받겠다고 등록한 것이다.

뒤에 붙은 type도 의미가 있었다. 첫 종목은 type=0, 그다음부터는 type=1로 붙는다. type=0은 감시 목록을 새로 시작한다는 뜻이고, type=1은 기존 목록에 이어 붙인다는 뜻이다. 이걸 몰라서 처음엔 종목마다 전부 0으로 등록했다가, 앞 종목이 자꾸 사라지는 걸 겪었다. 새로 등록할 때마다 목록을 리셋해버린 것이다. 첫 종목만 0, 나머지는 1. 이 규칙을 알고 나서야 47종목이 온전히 다 감시됐다.

검색 결과가 0개로 나오던 날

그런데 실시간 조건검색에는 함정이 하나 있었다. 어느 날 로그를 보니 이렇게 찍혀 있었다.

🧾 최초 조건검색 결과: 0개
📌 감시목록 수: 0

분명 같은 조건식인데 47개가 아니라 0개가 잡혔다. 처음엔 조건식이 잘못됐나 의심했다. 하지만 원인은 다른 데 있었다. 조건검색에는 호출 제한이 있다. 키움에서는 조건검색을 1초에 5회, 그리고 1분에 1회로 제한한다. 봇을 짧은 시간에 여러 번 껐다 켜면 이 제한에 걸려서, 조건검색이 제대로 안 되고 0개로 돌아오는 것이다.

그날 새벽에 내가 봇을 열 번 넘게 껐다 켰던 걸 떠올리면 당연한 결과였다. 너무 자주 요청해서 서버가 잠깐 막아버린 것이다. 같은 증상을 겪는 사람이 있다면, 조건식을 의심하기 전에 최근에 봇을 너무 자주 재시작하지 않았는지 먼저 확인하길 권한다. 잠깐 기다렸다가 다시 켜면 대개 정상으로 돌아온다.

이 단계에서 배운 것

조건검색 연동은 생각보다 단순한 듯 까다로웠다. 조건식을 불러오고, 실시간으로 켜고, 잡힌 종목을 감시에 등록하는 흐름 자체는 명확하다. 하지만 그 안에 함정이 숨어 있었다. type 값을 잘못 줘서 목록이 리셋되고, 너무 자주 켜서 검색이 0개로 나오고.

결국 나는 여기서도 같은 교훈을 얻었다. 에러가 아니라 "이상한 결과"가 나올 때가 더 무섭다. 빨간 X는 최소한 뭔가 잘못됐다고 알려주지만, 0개라는 결과는 아무 경고 없이 조용히 나를 속인다. 그래서 나는 조건검색 결과 개수와 감시목록 수를 항상 로그로 남긴다. "0개"라는 숫자 하나가, 나중에 원인을 찾는 결정적 단서가 되기 때문이다.

다음 글에서는 이렇게 감시에 걸어둔 종목들의 실시간 데이터를 실제로 어떻게 받아 처리하는지, 그 이벤트 구조를 풀어보려 한다.

Post a Comment

다음 이전