키움증권 OpenAPI+ 사용 예시

1. 엔트리포인트 객체 생성

์ฃผ์š”ํ•œ ๊ธฐ๋Šฅ๋“ค์€ ํ•ด๋‹น ์—”ํŠธ๋ฆฌํฌ์ธํŠธ์˜ ๋ฉค๋ฒ„ํ•จ์ˆ˜๋กœ์จ ์ œ๊ณต๋œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์•„๋ž˜์™€ ๊ฐ™์ด ์„œ๋ฒ„ ์ ‘์† ์ด์ „์—๋„ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์•„๋ž˜ ํ•จ์ˆ˜๋ฅผ ํ™œ์šฉํ•˜๋ฉด OpenAPI ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋กœ๋“œ๋˜์—ˆ๋Š”์ง€ ๊ฐ„์ ‘์ ์œผ๋กœ ํ™•์ธ ๊ฐ€๋Šฅํ•˜๋‹ค.

2. 서버 접속

์ž๋™ ๋กœ๊ทธ์ธ ์„ค์ •์ด ๋˜์–ด์žˆ๋Š” ๊ฒฝ์šฐ ๋กœ๊ทธ์ธ์ด ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๋ฉฐ, ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋Š” ์ˆ˜๋™์œผ๋กœ ์•„์ด๋””, ๋น„๋ฐ€๋ฒˆํ˜ธ ๋“ฑ ๋กœ๊ทธ์ธ ์ •๋ณด๋ฅผ ์ž…๋ ฅํ•ด ์ฒ˜๋ฆฌํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

๋งŒ์•ฝ์— ํ•จ์ˆ˜ ์ธ์ž๋กœ credential ์ •๋ณด๋ฅผ ์ฃผ๋Š” ๊ฒฝ์šฐ pywinauto ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ž๋™์œผ๋กœ ๋กœ๊ทธ์ธ ์ฒ˜๋ฆฌ๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค. ์•ž์„œ ์–ธ๊ธ‰ํ•œ ํ‚ค์›€์ฆ๊ถŒ์—์„œ ๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ์ž๋™ ๋กœ๊ทธ์ธ์ด ์•„๋‹ˆ๋ผ ๊ธฐ์กด์— ์ˆ˜๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋˜ ๊ณผ์ •์„ ๋งคํฌ๋กœ ํ˜•ํƒœ๋กœ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ์ฐธ๊ณ ๋กœ pywinauto ์‚ฌ์šฉ์„ ์œ„ํ•ด์„œ๋Š” ๊ด€๋ฆฌ์ž ๊ถŒํ•œ์ด ํ•„์š”ํ•˜๋‹ค.

์ฐธ๊ณ ๋กœ ์—ฌ๊ธฐ์„œ๋Š” ์ด๋ฏธ ๋กœ๊ทธ์ธ์ด ๋˜์–ด์žˆ๋Š” ์ƒํ™ฉ์ด๋ฏ€๋กœ ์œ„์˜ ํ•จ์ˆ˜๊ฐ€ ์ถ”๊ฐ€์ ์ธ ๋กœ๊ทธ์ธ์ฒ˜๋ฆฌ๋ฅผ ์ง„ํ–‰ํ•˜์ง€๋Š” ์•Š๊ฒŒ ๋œ๋‹ค.

3. 기본 함수 실행

๋‹ค์‹œ ํ•œ๋ฒˆ ๊ธฐ๋ณธ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ ‘์†์ƒํƒœ๋ฅผ ํ™•์ธํ•ด๋ณด์ž. ์•„๋ž˜ ๊ฐ’์ด 1 ์ธ ๊ฒฝ์šฐ ์ •์ƒ ์ ‘์† ์ƒํƒœ์ด๋‹ค. ์ ‘์†๋˜์–ด ์žˆ์ง€ ์•Š์€ ๊ฒฝ์šฐ๋ผ๋ฉด 0 ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์ดํ›„ ์˜ˆ์‹œ๋“ค์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์‚ผ์„ฑ์ „์ž์˜ ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•œ๋‹ค.

์œ„์—์„œ GetCodeListByMarketAsList() ํ•จ์ˆ˜๋Š” ๊ธฐ์กด์˜ GetCodeListByMarket() ํ•จ์ˆ˜ ํ˜ธ์ถœ์‹œ ๋‚˜์˜ค๋Š” ๋ฌธ์ž์—ด ํ˜•ํƒœ์˜ ๊ฒฐ๊ณผ๋ฅผ ํŽธ์˜๋ฅผ ์œ„ํ•ด ๋ฆฌ์ŠคํŠธ ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•ด์„œ ์ œ๊ณตํ•œ๋‹ค.

4. TR 요청 예시

상위 함수 사용 예시

๋ช‡๊ฐ€์ง€ ์ž์ฃผ ์“ฐ์ด๋Š” TR ๋“ค์— ๋Œ€ํ•ด์„œ๋Š” ์š”์ฒญ ๋ฐ ๊ฒฐ๊ณผ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ๊นŒ์ง€ ์™„๋ฃŒํ•ด์„œ ๊ฒฐ๊ณผ๋ฌผ๋งŒ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ƒ์œ„ํ•จ์ˆ˜๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋‹ค.

๋ฐ์ดํ„ฐ๊ฐ€ ์ตœ๋Œ€ํ•œ ์žˆ๋Š” ๊ทธ๋Œ€๋กœ (์ฃผ๋กœ ๋ฌธ์ž์—ด ํ˜•ํƒœ๋กœ) ๋ฐ˜ํ™˜๋˜๊ธฐ ๋•Œ๋ฌธ์— ํ•„์š”ํ•˜๋‹ค๋ฉด ํƒ€์ž… ๋ณ€ํ™˜์„ ๊ฑฐ์ณ ์‚ฌ์šฉํ•œ๋‹ค.

์ฃผ๊ฐ€ ๋ฐ์ดํ„ฐ์—์„œ ์ˆ˜์ •์ฃผ๊ฐ€๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋Š” adjusted_price=True ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์„ค์ •ํ•ด ํ˜ธ์ถœํ•œ๋‹ค.

하위 함수 사용 예시

๋งŒ์•ฝ์— ํ•„์š”ํ•œ TR ์— ๋Œ€ํ•œ ํŽธ์˜ํ•จ์ˆ˜๊ฐ€ ์ œ๊ณต๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋ผ๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ ์ง์ ‘ TR ์š”์ฒญ์— ํ•„์š”ํ•œ ์ž…๋ ฅ๊ฐ’์„ ์„ค์ •ํ•ด ์š”์ฒญํ•˜๊ณ , ์ดํ›„ ์ŠคํŠธ๋ฆผ ํ˜•ํƒœ๋กœ ๋“ค์–ด์˜ค๋Š” ์ด๋ฒคํŠธ ๋˜ํ•œ ์ง์ ‘ ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์œ„์˜ ์ฝ”๋“œ์—์„œ TransactionCall() ํ•จ์ˆ˜์˜ ๊ฒฝ์šฐ ๋ฐ˜ํ™˜๋˜๋Š” ์ŠคํŠธ๋ฆผ์˜ event ๊ฐ์ฒด๋Š” ListenResponse ํƒ€์ž…์˜ gRPC ๋ฉ”์‹œ์ง€ ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜๋œ๋‹ค.

ํ•ด๋‹น ๋ฉ”์‹œ์ง€์˜ ํ˜•ํƒœ๋Š” koapy/backend/kiwoom_open_api_plus/grpc/KiwoomOpenApiPlusService.proto ํŒŒ์ผ์˜ ๋‚ด์šฉ, ๊ตฌ์ฒด์ ์œผ๋กœ ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฉ”์‹œ์ง€์˜ ์ •์˜ ๋ถ€๋ถ„์„ ์ฐธ๊ณ ํ•˜๊ธฐ ๋ฐ”๋ž€๋‹ค.

message ListenResponse {
  string name = 1;
  repeated Argument arguments = 2;
  SingleData single_data = 3;
  MultiData multi_data = 4;
}

๊ฐ TR ์— ๋”ฐ๋ผ ์‹ฑ๊ธ€๋ฐ์ดํ„ฐ/๋ฉ€ํ‹ฐ๋ฐ์ดํ„ฐ๊ฐ€ ์„ ํƒ์ ์œผ๋กœ ์„ค์ •๋˜์–ด ๋ฐ˜ํ™˜๋˜๋Š”๋ฐ, ๊ทธ๋Ÿฌํ•œ ์ž…๋ ฅ/์ถœ๋ ฅ๊ณผ ๊ด€๋ จ๋œ ์ •๋ณด๋“ค์€ KOAStudio ํ”„๋กœ๊ทธ๋žจ์„ ํ™œ์šฉํ•˜๊ฑฐ๋‚˜ ์•„๋‹ˆ๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ KiwoomOpenApiPlusTrInfo ๋ฅผ ํ†ตํ•ด ํ”„๋กœ๊ทธ๋žจ ๋‚ด์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

5. 조건검색 예시

์กฐ๊ฑด๊ฒ€์ƒ‰์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋จผ์ € ์„œ๋ฒ„์— ์ €์žฅ๋œ ์กฐ๊ฑด๋“ค์„ ๋ถˆ๋Ÿฌ์™€์•ผ ํ•œ๋‹ค.

๋ถˆ๋Ÿฌ์˜จ ์กฐ๊ฑด๋“ค์˜ ๋ชฉ๋ก์€ ์•„๋ž˜ ํ•จ์ˆ˜๋กœ ํ™•์ธ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

์ดํ›„ ์˜ˆ์‹œ์˜ ์ •์ƒ๋™์ž‘์„ ์œ„ํ•ด์„œ๋Š” ์•„๋ž˜์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์กฐ๊ฑด๋“ค๊ณผ ๊ฐ™์€ ์ด๋ฆ„์„ ๊ฐ€์ง€๋Š” ์กฐ๊ฑด๋“ค์ด ๋ฏธ๋ฆฌ ์ €์žฅ๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค.

์œ„์˜ ์กฐ๊ฑด์‹๋“ค์€ ํ‚ค์›€์—์„œ ์˜ˆ์‹œ๋กœ ์ œ๊ณตํ•˜๋Š” ์ถ”์ฒœ์‹๋“ค์„ ๊ทธ๋Œ€๋กœ ์ด๋ฆ„์„ ๋˜‘๊ฐ™์ด ํ•ด์„œ ์ €์žฅํ•œ ๊ฒƒ๋“ค์ด๋‹ค. ์ฐธ๊ณ ๋กœ ์กฐ๊ฑด๋“ค์„ ํŽธ์ง‘ํ•˜๊ณ  ์ €์žฅํ•˜๋Š”๊ฑด ์˜์›…๋ฌธ HTS ๋‚ด๋ถ€์—์„œ๋งŒ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋”ฐ๋กœ HTS ๋ฅผ ์—ด์–ด ํŽธ์ง‘ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

์กฐ๊ฑด์‹์ด ํŽธ์ง‘๋œ ์ดํ›„์— ํ•ด๋‹น ์กฐ๊ฑด์‹์„ ๊ธฐ์กด์— ๋™์ž‘์ค‘์ธ OpenAPI ์—๋„ ๊ฐฑ์‹ ํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ, ์•„๋ž˜ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ํŽธ์ง‘๋œ ์กฐ๊ฑด์‹์„ ์ƒˆ๋กœ ๋ถˆ๋Ÿฌ์˜จ๋‹ค.

일반 조건검색 예시

์œ„์˜ ํ•จ์ˆ˜์—์„œ with_info=True ๋กœ ํ˜ธ์ถœํ•˜๊ฒŒ ๋˜๋ฉด ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ์ฝ”๋“œ ๋ชฉ๋ก (codes) ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ•ด๋‹น ์ข…๋ชฉ๋“ค์— ๋Œ€ํ•œ ๊ธฐ๋ณธ์ •๋ณด๋“ค๋„ (info) ๊ฐ™์ด ๊ฐ€์ ธ์™€ DataFrame ํ˜•ํƒœ๋กœ ์ œ๊ณตํ•œ๋‹ค.

실시간 조건검색 예시

๊ฐ™์€ ์กฐ๊ฑด์‹์€ 1๋ถ„์— 1๊ฑด ์ œํ•œ์ด๋ฏ€๋กœ ์˜ˆ์‹œ ์‹คํ–‰์‹œ ์ œํ•œ์„ ํšŒํ”ผํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ƒˆ๋กœ ์„ค์ •ํ•œ๋‹ค.

์‹ค์‹œ๊ฐ„ ์กฐ๊ฑด๊ฒ€์ƒ‰์˜ ๊ฒฝ์šฐ ์กฐ๊ฑด์— ๋งŒ์กฑ/๋ถˆ๋งŒ์กฑํ•˜๋Š” ์ข…๋ชฉ์ด ํŽธ์ž…/์ดํƒˆํ• ๋•Œ๋งˆ๋‹ค ๊ณ„์†ํ•ด์„œ ์ด๋ฒคํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์˜ˆ์‹œ์—์„œ๋Š” 10์ดˆ ๋™์•ˆ๋งŒ ์ด๋ฒคํŠธ๋ฅผ ํ™•์ธํ•ด๋ณธ๋‹ค.

์œ„์—์„œ stream ๊ฒฐ๊ณผ๋Š” grpc ์˜ _MultiThreadedRendezvous ๊ฐ์ฒด์ธ๋ฐ ์‚ฌ์‹ค ํ•ด๋‹น ํƒ€์ž…์€ ์ง์ ‘์ ์œผ๋กœ ์™ธ๋ถ€์— ๋…ธ์ถœ๋˜๋Š” ํƒ€์ž…์€ ์•„๋‹ˆ๋‹ค. ๋Œ€์‹ ์— ํ•ด๋‹น ํƒ€์ž…์€ ๋‚ด๋ถ€์ ์œผ๋กœ grpc.RpcError, grpc.RpcContext, grpc.Call, grpc.Future ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ํ•ด๋‹น ๊ฐ์ฒด์˜ ์‚ฌ์šฉ๋ฒ•๊ณผ ๊ด€๋ จํ•ด์„œ๋Š” ๊ฐ๊ฐ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ฐธ๊ณ ํ•˜์ž.

์ตœ์ดˆ ์ด๋ฒคํŠธ๋กœ ๋ฐ˜ํ™˜๋˜๋Š” ์ฝ”๋“œ ๋ชฉ๋ก๋“ค์— ๋Œ€ํ•ด์„œ ์•ž์„  ์ผ๋ฐ˜์กฐ๊ฑด ๊ฒ€์ƒ‰ ์˜ˆ์‹œ์—์„œ์™€ ๊ฐ™์ด ์ข…๋ชฉ๋“ค์˜ ๊ธฐ๋ณธ์ •๋ณด๋“ค์„ ๋ณ„๋„๋กœ ๊ฐ€์ ธ์˜ค๊ณ  ์‹ถ๋‹ค๋ฉด ๋Œ€๋žต ์•„๋ž˜์ฒ˜๋Ÿผ ํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์•„๋‹ˆ๋ฉด stream ์ƒ์„ฑ์‹œ์— with_info=True ๋ฅผ ์ฃผ๋Š” ๊ฒฝ์šฐ ๋งค ์กฐ๊ฑด ์ด๋ฒคํŠธ๋งˆ๋‹ค ๋ฐ”๋กœ ๋’ค์— ๊ด€์‹ฌ์ข…๋ชฉ์ •๋ณด์š”์ฒญ ์ด๋ฒคํŠธ๋ฅผ ์ด์–ด์„œ ๋ฐ˜ํ™˜ํ•˜๋Š”๋ฐ, ๊ฒฐ๊ตญ์€ ์•ฝ๊ฐ„์˜ ๋ณ„๋„ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

์‹ค์‹œ๊ฐ„ ์กฐ๊ฑด๊ฒ€์ƒ‰์˜ ๊ฒฝ์šฐ ์กฐ๊ฑด์— ๋งŒ์กฑ/๋ถˆ๋งŒ์กฑํ•˜๋Š” ์ข…๋ชฉ์ด ํŽธ์ž…/์ดํƒˆํ• ๋•Œ๋งˆ๋‹ค ๊ณ„์†ํ•ด์„œ ์ด๋ฒคํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์˜ˆ์‹œ์—์„œ๋Š” 10์ดˆ ๋™์•ˆ๋งŒ ์ด๋ฒคํŠธ๋ฅผ ํ™•์ธํ•ด๋ณธ๋‹ค.

6. 주문처리 예시

์ฃผ๋ฌธ์œ ํ˜• ๋ฐ ๊ฑฐ๋ž˜๊ตฌ๋ถ„ ๋“ฑ๊ณผ ๊ด€๋ จ๋œ ์ž์„ธํ•œ ์ •๋ณด๋“ค์€ KOAStudio ํ”„๋กœ๊ทธ๋žจ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฃผ๋ฌธ์ฒ˜๋ฆฌ๋Š” ์‹ค์ œ ์‹œ์žฅ์ด ์—ด๋ ค์žˆ๋Š” ๋™์•ˆ์—๋งŒ ํ…Œ์ŠคํŠธํ•ด๋ณผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ํ˜„์žฌ ์žฅ์ด ์—ด๋ ค ์žˆ๋Š”์ง€ ๋จผ์ € ํ™•์ธํ•˜๊ณ  ํ•ด๋‹น ๊ฒฝ์šฐ์— ํ•œ์ •ํ•ด์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค.

์ฃผ๋ฌธ ์ด๋ฒคํŠธ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ฃผ๋ฌธ์ˆ˜๋Ÿ‰์ด ๋ชจ๋‘ ์†Œ์ง„๋˜๊ธฐ ์ „๊นŒ์ง€ ์ด๋ฒคํŠธ๋ฅผ ๋“ฃ๋„๋ก ๋˜์–ด์žˆ์œผ๋ฉฐ, ๋‹ค๋ฅธ ์ด๋ฒคํŠธ ์ŠคํŠธ๋ฆผ๊ณผ ๋™์ผํ•˜๊ฒŒ stream.cancel() ์˜ ํ˜•ํƒœ๋กœ ์ด๋ฒคํŠธ ์ŠคํŠธ๋ฆผ์„ ๋”์ด์ƒ ๋“ฃ์ง€ ์•Š๋„๋ก ํ•˜๋Š”๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๋‹ค๋งŒ ์ด๋ฒคํŠธ ์ŠคํŠธ๋ฆผ์„ ์ทจ์†Œํ•˜๋Š” ๊ฒƒ์ด ๊ธฐ์กด ์ฃผ๋ฌธ๊นŒ์ง€ ์ทจ์†Œํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ๋ฌธ์ทจ์†Œ๋‚˜ ์ •์ •๋“ฑ์„ ์œ„ํ•ด์„œ๋Š” ๋ณ„๋„์˜ ์ทจ์†Œ/์ •์ • ์ฃผ๋ฌธ์„ ๋„ฃ์–ด์ค˜์•ผ ํ•œ๋‹ค.

์—ฌ๊ธฐ์„œ ๋ฐ˜ํ™˜๋˜๋Š” ์ด๋ฒคํŠธ ๊ฐ์ฒด ์—ญ์‹œ ์•ž์„  TR ์˜ˆ์‹œ์—์„œ์™€ ๋™์ผํ•˜๊ฒŒ ListenResponse ํƒ€์ž…์˜ gRPC ๋ฉ”์‹œ์ง€ ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜๋œ๋‹ค.

7. 실시간 데이터 처리 예시