트레이딩

[키움API] KOA StudioSA 톺아보기 - 자주 묻는 질문 (2)

성민석 2023. 7. 25. 09:00

안녕하세요 성민석입니다.

오늘은 키움증권 API와 관련된 기본 설명과 동작을 설명드릴 예정입니다. 기본적으로 KOA StudioSA에서 제공해주는 내용을 바탕으로 글을 작성해나갈 예정입니다. 여기서 제 개인적인 의견이나 첨언이 들어갈 경우 파란색으로 표시하겠습니다.

 

지난 포스팅에 이어서 이번 포스팅에서는 후반에 있는 자주 묻는 질문 중 개발 및 구현 중인 단계에 대해서 알아보겠습니다.

 


Q : 소스에 open api 컨트롤 등록시 오류가 납니다.

A : OpenAPI는 64비트용으로 제공되지 않습니다. OpenAPI ocx 컨트롤이 64비트용으로 추가되지 않았는지 확인해보시기 바랍니다. 비주얼 스튜디오 2022, 64비트 MS Office(엑셀), 64비트 파이썬 등 64비트 개발환경은 지원되지 않습니다. 프로젝트 환경에 유니코드 문자열을 사용하도록 설정되어 있다면, 멀티바이트 문자 사용으로 변경해보시기 바랍니다. 

 

Python으로 32비트 개발환경 세팅하는 법이 궁금하시다면 아래 포스팅을 참고하세요!

2021.10.01 - [개발] - [개발] 증권사 API를 사용하기 위한 32비트 가상환경 만들기

 

[개발] 증권사 API를 사용하기 위한 32비트 가상환경 만들기

안녕하세요 성민석입니다. 새롭게 블로그를 만들다보니 이전 블로그에서는 다루지 못했던 다양한 컨텐츠를 다뤄보려고 합니다. 제가 지난 1년동안 증권사 API를 사용해보면서 처음에 가장 힘들

minsuk-sung.tistory.com

 


 

Q : RQName은 어떤 값을 입력하나요?

A : RQName은 사용자가 임의로 지정하여 사용합니다. 한글 사용이 가능하므로 가령 "주식주문", "차트조회" 식으로 임의 지정하실 수 있고, 해당 조회요청에대한 데이터가 수신될때 임의로 지정했던 RQName이 그대로 수신됩니다. 따라서 데이터 수신 이벤트가 발생할때 어떤 요청에대한 수신인지 구분하기 위한 용도로 사용하시면 되겠습니다. RQName은 80바이트 (한글 40글자)내로 사용해주시길 권장드립니다.

 


 

Q : 계좌비밀번호를 입력하라고 나옵니다

A : OpenAPI는 계좌비밀번호 입력창을 통해서만 계좌비밀번호 입력이 가능합니다. 당사 OpenAPI는 계좌비밀번호를 평문으로 입력받지 않습니다. 계좌비밀번호 입력창은 사용자가 입력하는 비밀번호를 암호화하여 저장 및 서버로 전송하게 됩니다. 계좌비밀번호 입력창을 출력하는 방법은 두가지 입니다. OpenAPI를 로그인하시면 윈도우 작업표시줄에 사각형으로 깜박이는 트레이아이콘이 표시됩니다. 깜박이는 아이콘 위에서 마우스 우클릭메뉴에서 "계좌비밀번호 저장" 을 선택하시는 방법 또 하나는 코딩으로 출력하는 방법 입니다. 로그인 후에 OpenAPI.KOA_Functions("ShowAccountWindow", "") 호출하시면 계좌비밀번호 입력창이 출력됩니다. 계좌비밀번호는 계좌비밀번호 입력창에서만 입력/등록이 가능하며 KOA스튜디오 TR조회시 입력값들중 "비밀번호" 란은 공백으로 두시고 "비밀번호입력매체구분" 값은 "00" 으로 입력하셔서 조회하시면 되겠습니다. 직접 구현하신 프로그램상에서도 조회 또는 주문시 계좌비밀번호는 따로 입력하지 않습니다.

 

이 부분도 이전 포스팅글을 참고해주시면 될 것 같습니다.

2023.07.22 - [트레이딩] - [키움API] 기타 함수 (종목정보관련 및 특수함수)

 


 

Q : 계좌번호가 10자리 인가요?

A : 당사의 계좌번호체계는 10자릿수 입니다. 영웅문4, 영웅문S 등은 사용자에게 8자리의 계좌번호를 노출하고 뒤에 2자리는 프로그램내에서 관리됩니다. OpenAPI에서는 계좌번호가 따로 관리되지 않으며 사용자가 입력한 10자릿수가 사용됩니다. TR조회 및 주문시 계좌번호 10자리를 입력해주시기 바랍니다. 계좌번호 10자리는 OpenAPI로그인 후 계좌비밀번호 입력창에서 확인하실 수 있습니다.

 


 

Q : TR조회중 수신이벤트가 발생되었는데 데이터가 없거나 이상한 값 입니다.

A : TR을 요청하실때 사용되는 화면번호를 확인해보시기 바랍니다. 1) 동일한 화면번호를 연속으로 사용하거나 2) 프로그램내에서 사용되는 화면번호 갯수가 200개가 넘어가는 경우 (수신)데이터의 유효성이 보장되지 못합니다. 매번 새로운 화면번호를 사용하시거나 여러개의 화면번호를 번갈아 사용하는 방법도 무방합니다.

 

현재 제 시스템에서 문제가 되고 있는 부분이 아마 이게 아닐까 생각됩니다. 간혹 데이터가 누락되거나 계속 요청했던 이전 종목코드에 대한 데이터가 수신됐는데 API 제한횟수나 시간도 고려해보고 체결이 활발하게 일어나는 시간인지도 다 테스트해봤는데 결국 이게 문제가 아닐까 싶습니다. 제발 이게 맞아서 해결되길....

 


 

Q : 1초당 5회 횟수제한에는 어떤 것들이 해당되나요?

A : 특정 사용자에의해 서버의 부하가 발생하는 것을 방지하기 위해 조회 및 주문 횟수를 제한하고 있습니다. 쉽게는 데이터 요청(조회), 주문이 각각 1초당 5회로 여기시면 되겠습니다. 조회시 1초당 5회 횟수(유동적일 수 있다고 합니다.)는 CommRqData(), CommKwRqData(), SendCondition() 함수 사용이 합산되고 조회와 별개로 주문시 1초당 5회 횟수는 SendOrder(), SendOrderFO() 함수 사용이 합산됩니다. 해당 제한에 적용되는 경우 각 함수의 리턴값으로 에러코드가 리턴되고 카운트는 1초마다 초기화 됩니다.

 


 

Q : 실시간시세 수신하는데 종목수 제한이 있나요?

A : 실시간으로 시세를 수신할때 종목의 수를 제한하지는 않습니다. 프로그램내에서 사용되는 화면번호 하나에 실시간시세를 서버로 등록할 수 있는 최대 종목의 100종목 입니다. 그리고 프로그램내에서 사용할 수 있는 화면번호의 갯수는 최대 200개 입니다. 따라서 이론적으로는 100 X 200 개 종목에대해 실시간 시세를 등록/수신 할 수 있습니다. 다만 데이터 수신처리 로직에따라, PC(CPU/메모리/네트워크)의 부하 및 프로그램 지연현상이 발생될 수 있습니다. 처리로직의 성격이나 PC사양에따라 현상이 다를것이므로 구현하시는 중 테스트를 통해 종목의 수를 늘리거나 줄여서 문제가 없는 정도의 종목 수를 운영하시기 바랍니다.

 


 

Q : 수신된 데이터 건수 이상으로 조회하려면 어떻게 해야하나요?

A : 데이터 조회시 각 TR마다 한번에 수신할 수 있는 데이터의 양이 정해져 있습니다. 가령 opt10081 주식 일봉차트 데이터는 한번에 600건의 데이터가 조회됩니다. 한번에 조회된 데이터 건수 이상의 데이터가 서버에 존재하는 경우 조회 응답 이벤트인 OnReceiveTrData() 이벤트 발생시 연속된 데이터가 존재한다는 의미로 파라메터 값 (5번째 값)이 "2"로 수신됩니다. 이때 연속된 데이터를 더 요청하려면 최초 조회때 SetInputValue로 셋팅한 입력값들 그대로하여 CommRqData 로 데이터를 요청할때 이번에는 연속조회 옵션값(3번째 인자)을 수신된 값과 동일하게 2로 입력하여 데이터를 요청하시면 되겠습니다. 연속조회 중간에 다른 TR을 요청하는 경우 연속조회가 되지 않습니다.

 

최초조회 : CommRqData("차트조회", "opt10081", 0, "1111");

최초조회 데이터 수신 후 연속조회 : CommRqData("차트조회", "opt10081", 2, "1234");

 


 

Q : 현재가 앞에 붙는 + 혹은 - 는 뭘 의미하는건가요?

A : 현재가 데이터 앞에 부호가 2개 붙어서 수신될수 있습니다. 첫번째 부호는 영웅문4 HTS, 영웅문S MTS 등의 시스템들이 화면상 데이터의 폰트색상(파랑, 빨강)을 표기하기 위해 사용되는 값 입니다. 두번째 부호는 전일대비 상승/하락 의미 입니다. OpenAPI는 데이터를 최대한 가공하지 않고 제공하고 있기 때문에 동일하게 전달되고 있습니다. 필요에따라 위와 같은 용도로 사용하시거나, 부호를 잘라내어 사용하시면 되겠습니다. (참고로 정규장이 아닌 시간에 체결 데이터가 발생하면 부호가 붙지 않는 경우도 있으니 참고하시길 바랍니다.)

 


 

Q : 종목코드 앞에 A라고 붙는건 뭔가요?

A : 수신된 종목코드 6자리 앞에 A는 장내주식, J는 ELW종목, Q는 ETN종목을 의미합니다. 종목코드 앞에 마켓구분값이 붙는 경우와 그렇지 않은 경우는 영웅문HTS, MTS등 쓰임에따라 설계된것이고 OpenAPI가 이러한 데이터들을 공유하여 데이터의 가공 없이 제공되고 있기 때문입니다. 구현하시는 중에 종목코드앞에 마켓구분값 필요여부에따라 종목코드가 6자리를 초과하는 경우 앞자리를 잘라내어 사용하시면 되겠습니다.

 


 

Q : 화면번호는 어떤역할을 하는지요?

A : 사용자 입장에서는 영웅문4의 화면번호와 동일한 맥락이라고 보시면 되겠습니다.

 

예시: 화면번호 0641 - 시장 당일등락률차트

 

시스템적으로 화면번호는 데이터 송수신 및 실시간데이터의 키값으로 사용됩니다. 하나의 화면번호에 특정 종목의 실시간시세가 등록되어 수신되고 있는 상태에서 해당 화면번호를 다른 용도로 다시 사용하거나 종목을 바꾸어 데이터 요청에 사용하는 경우 해당 화면번호에 등록되어 있던 종목은 자동으로 실시간시세 해지가 됩니다. 가령 화면번호 1111을 사용하여 이미 A종목의 실시간시세를 수신하고 있는 상태에서 1111 화면번호로 B종목의 시세데이터를 조회하는 경우 A종목의 실시간시세는 자동으로 해지되고 1111 화면번호로 B종목의 실시간시세가 등록되어 수신됩니다. OpenAPI는 사용자가 화면번호를 임의로 지정할 수 있어서 어떤 화면번호에 어떤 데이터를 요청/수신 할지 관리하실 수 있습니다. 화면번호는 몇가지 규칙을 지켜주시면서 임의의 값으로 지정하여 사용하시면 됩니다. 1. 4자릿수 숫자 사용 "1111", "1234",,, 2. 프로그램내 화면번호 최대 사용갯수는 200개. 동일한 화면번호 재사용 가능 (영웅문4 에서 화면을 200개까지 열수 있는 개념으로 이해하시면 되겠습니다.) 3. 동일한 화면번호를 연속적으로 반복하여 사용하지 않도록 운영하시면 됩니다. 데이터 요청시, 주문전송시 화면번호를 생략할 수 없습니다.

 

사실 여기 화면번호도 꼭 4자리일 필요없고, 최대 8자리 숫자로 설정해도 무방합니다. 다만 최대 200개의 화면번호만 사용 가능하니 꼭 이를 관리하는 로직이 들어가야합니다. 


 

Q : 실시간데이터 받는법 문의

A : OpenAPI에서 실시간 시세데이터는 모두 OnReceiveRealData() 이벤트 발생을 통해 수신 됩니다. 실시간시세 데이터를 서버에 등록(요청)하는 방법은 두가지 입니다. OPT계열의 시세관련 TR서비스를 요청하는 경우 해당 종목의 실시간 시세가 자동으로 서버에 등록되어 이후 해당 종목에 대해 OnReceiveRealData() 이벤트가 발생됩니다. 또 한가지는 SetRealReg 함수를 사용하는 방법 입니다. 조회요청/수신 없이 실시간시세만 등록하는 방법이라 여기시면 되겠습니다. SetRealReg 함수로 등록시 주식체결, 주식우선호가, 주식호가잔량 실시간을 수신하실 수 있습니다. 하나의 화면번호로 실시간 등록할 수 있는 종목의 수는 최대 100종목 입니다. 실시간 시세데이터는 실시간타입 단위로 수신 됩니다. 수신된 실시간타입에 포함되어 있는 FID 항목들이 모두 수신됩니다. 가령 "주식체결" 실시간타입이 수신된 경우 주식체결 실시간타입에 포함되어 있는 fid 항목들의 값들이 모두 수신됩니다.

 

더욱 자세한 내용은 아래 포스팅을 참고해주세요.

2023.07.20 - [트레이딩] - [키움API] 조회와 실시간 데이터 처리 (2) - 실시간

 

[키움API] 조회와 실시간 데이터 처리 (2) - 실시간

안녕하세요 성민석입니다. 오늘은 키움증권 API와 관련된 기본 설명과 동작을 설명드릴 예정입니다. 기본적으로 KOA StudioSA에서 제공해주는 내용을 바탕으로 글을 작성해나갈 예정입니다. 여기서

minsuk-sung.tistory.com

 


 

Q : 실시간 주식체결 데이터 수신시 매수인지 매도인지 구분할 수 있나요?

A : 실시간 주식체결데이터 중에서 fid 15번 거래량 데이터의 부호가 매도/매수를 의미합니다. -마이너스 거래량인 경우 매도체결에대한 거래량 입니다. +거래량은 매수체결을 의미 합니다.

 

+라면 [매수 체결]로 인해 (매도호가잔량)이 줄어들고, -라면 [매도 체결]로 인해 (매수호가잔량)이 줄어듭니다.

또한 추가적인 설명을 넣자면, 동시호가 이후 체결된 물량은 부호가 붙지 않습니다. (예시: 거래량 89652주 체결)

 


 

Q : 지수 실시간 데이터를 받고 싶은데 어떻게 해야하나요?

A : OpenAPI에서 제공하는 TR서비스 중 opt로 시작하는 시세관련 서비스로 데이터를 서버에 요청하는 경우 해당 종목의 실시간 시세데이터가 서버에 자동으로 등록되어 OnReceiveRealData 이벤트를 통해 실시간 시세데이터가 수신됩니다. 지수시세 데이터 조회는 opt20001 : 업종현재가요청 등의 업종시세관련 TR서비스를 참고해보시기 바랍니다.

 

SetRealReg로 직접 등록하시면 됩니다. 코스피는 001으로 코스닥은 101로 등록하시면 됩니다.

이후 실시간 이벤트로 아래와 같은 데이터를 수신할 수 있습니다.

 

 


 

Q : 실시간데이터 중 주식체결 데이터와 주식시세 데이터의 차이가 뭔지 알려주세요

A : "주식체결" 데이터는 시장에서 특정 종목의 체결(거래)이 이루어졌을때마다 발생하고 "주식시세" 데이터는 특정 종목이 기세일때 발생하는 데이터로 체결없이 현재가가 변경되는 대량매매나 종목 종가 데이터 보정 시 발생하는 데이터 입니다.

(저는 그냥 주식체결 데이터를 기준으로 실시간 매매합니다.)

 


 

Q : 같은 종목을 여러번 실시간등록 해도 문제가 없나요?

A : 해당 종목의 실시간시세를 수신하는데에는 문제 되지 않습니다. 여러번 등록되어도 해당 종목의 실시간시세 데이터는 한번만 등록된 경우와 동일하게 수신됩니다. 다만, 사용하시는 프로그램 성격상 해당 종목의 실시간시세를 해지 해야 할 필요가 있다면, 화면번호가 실시간시세 데이터의 key가 되기 때문에 등록했던 화면번호로 모두 해지해주어야 합니다. (SetRealRemove나 Disconnect 함수를 이용해서 여러 화면 번호에 있는 종목코드를 전부 해지해야합니다. 조금 번거롭긴 하겠죠.)

 


 

Q : 실시간 데이터로 vi 발동 정보를 가져오고 싶습니다

A : VI발동/해제 실시간은 OPT10054 TR 조회시에 등록됩니다. 이후 OnReceiveRealData() 이벤트 발생으로 "VI발동/해제" 실시간타입이 수신됩니다. KOA스튜디오에서 OPT10054 TR을 참고하셔서 사용해보시기 바랍니다.

 

이게 웃긴게 실시간 데이터인데, TR로 요청해야합니다.

 

 

그러면 실시간 이벤트로 아래와 같은 정보를 줍니다.


 

Q : 1초당 5회 이하로 조회중인데 과도한 요청이라는 메세지가 나옵니다.

A : OpenAPI에는 1초당 5회 횟수제한과는 별개로 서버부하방지 제한이 있습니다. 특정 고객에의해 서버부하 현상이 반복되면서 보다 안정적인 OpenAPI 서비스 제공을 위한 추가정책입니다. CommRqData(데이터 조회요청), SendCondition(조건검색 조회요청), CommKwRqData(복수종목 조회요청) 들이 해당됩니다. 서버의 상황에따라 유동적일 수 있어서 초당 5회와 같이 명확한 기준을 알려드리기 어려운 점 양해 부탁드립니다. 1초당 5회 정도의 데이터 요청을 장시간 반복하는 경우 이에 적용될 가능성이 높습니다. 서버부하방지 제한에 적용되는 경우에는 메세지박스가 출력되며 데이터요청이 불가해집니다. 프로그램 종료 후 재접속으로 다시 정상적으로 사용할 수 있습니다. 서버부하방지 제한에 적용된 경우 다시 적용될 가능성이 높으니 반복적인 조회간격에 더 크게 여유를 두어 구현하시기 바랍니다.

 


 

Q : 여러 종목을 한번에 조회하고 싶습니다.

A : CommKwRqData() 함수는 복수종목을 입력하여 최대 100종목의 여러종목을 한번에 조회할 수 있는 기능 입니다. 수신은 TR OPTKWFID 으로 고정되어 있습니다. CommRqData() 함수로는 복수종목 조회가 불가 합니다.

 


 

Q : 주문가능금액을 구하는 tr에 대한 질문입니다.

A : opw00001 TR의 "주문가능금액"은 예수금 중 사용 가능한 금액이라고 여기시면 되고, "100%종목주문가능금액" 데이터는 현금분 금일재상용금액+전일재사용금액+현금 중에 주문가능한금액 입니다. 가령 100만원이 있는 상태에서 보유중인 잔고 10만원만큼 청산하면 주문가능금액은 그대로 100만원이고, 100%주문가능금액은 110 이 됩니다. 이외 OPW00011(증거금율별주문가능수량조회요청)조회후 증거금20주문가능금액 ~ 증거금100주문가능금액을 사용하시거나 미수불가 주문가능금액 항목을 참고해보시기 바랍니다. OPW00011에서 미수포함 주문가능데이터를 구하는 법은 "적용증거금율"에서 구해지는 값(예:"40%")으로 해당"(증거금40)주문가능금액"과 "증거금40주문가능수량"을 구하실 수 있습니다. 시장가 주문인 경우 주문가능수량은 상한가로 계산이 되니 TR서비스 요청시 가격입력을 상한가로 해주시면 되겠습니다. 미수주문을 사용하지 않고자 하시는 경우 영웅문4 HTS의 0398화면에서 증거금을 100% 현금으로 설정하셔서 사용하실 수 있습니다.

 


 

Q : 잔고 손익을 실시간으로 알고 싶습니다.

A : OpenAPI는 주문 발생시 체결에의한 잔고변경 시점에대한 잔고손익외 따로 실시간으로 잔고손익을 제공하지 않습니다. 잔고에대한 손익을 실시간으로 계산하는 것은 사용자가 직접 구현해야 하는 부분 입니다. OPW00004, OPW00018 등 TR조회로 보유잔고를 먼저 조회하신 뒤에 보유종목을 시세조회 또는 SetRealReg 함수로 실시간시세 등록하고 이후로 수신되는 보유종목의 시세 데이터를 사용하여 실시간으로 손익을 계산해보시기 바랍니다.

 


 

Q : 잔고 손익, 수익률 계산공식 알려주세요.

A : 영웅문4 HTS의 [0345] 화면에서 사용되는 공식으로 답변 드립니다. 손익, 수익률 계산시 수수료는 매수수수료와 매도수수료의 합산이며 원단위는 절사 됩니다.

제세금 값은 해당 종목에대해 코스피, 코스닥 등의 구분에따라 다르게 계산됩니다.

- ETF, ELW, ETN : 세금 무료

- 거래소(코스피)종목 거래세 + 농특세 : 0.08% + 0.15% (사실상 0.23%로 똑같습니다.)

- 코스닥 종목 : 평가금액의 0.23%

- 코넥스 종목 : 평가금액의 0.10%

- K-OTC : 평가금액의 0.25

 

손익과 수익률 계산에 사용되는 기초데이터는 종목코드, 현재가, (평균)매입가, 보유수량 4가지 입니다.

[평가손익, 수익률 도출 공식]

평가금액 = 현재가 X 수량

매입금액 = 매입가 X 수량

매수수수료 = 매입금액 X 수수료(모의투자 0.0035. 실거래 0.00015)

매도수수료 = 평가금액 X 수수료(모의투자 0.0035. 실거래 0.00015)

수수료합 = 매수수수료(원단위절사) + 매도수수료(원단위절사)

농특세 = 평가금액 X 10 X 0.0008

거래세 = 평가금액 X 10 X 0.0015

제세금 = 농특세 + 거래세

평가손익 = (현재가 - 매입가) X 수량 - (수수료합 + 제세금) 수익률 = 평가손익 / 매입금액 X 100

 

이걸 Python으로 간단하게 구현하는 포스팅은 아래 있으니 참고하세요.

2023.07.19 - [트레이딩] - [백테스팅] Python으로 정확하게 국내 주식 수수료, 세금, 수익금 그리고 수익률 계산하기 (키움증권 HTS/MTS와 동일)

 

[백테스팅] Python으로 정확하게 국내 주식 수수료, 세금, 수익금 그리고 수익률 계산하기 (키움증

백테스팅을 위해서 코드를 짜다보면, 반드시 종목별로 정확하게 수수료, 세금, 수익금 그리고 수익률을 구해야하는 경우가 생깁니다. 사실 이게 가치투자나 스윙매매와 같이 호흡이 긴 매매를

minsuk-sung.tistory.com

 


 

키움증권 API와 관련된 자세한 내용을 확인하고 싶으신 분들은 PDF를 확인해보시면 좋을 것 같습니다.

 

마지막으로 같이 트레이딩하는 분들과 소통하고 싶습니다. 언제든지 트레이딩이나 인공지능과 관련된 내용을 함께 공유하고 토론하고 싶으시다면 아래의 오픈 카카오톡 링크로 연락주세요.
https://open.kakao.com/me/minsuksung

 

성민석님의 오픈프로필

안암에서 인공지능을 연구하고 있습니다

open.kakao.com

 

728x90
반응형