import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import logging
logging.basicConfig(
format='%(asctime)s [%(levelname)s] %(message)s - %(filename)s:%(lineno)d',
level=logging.DEBUG)
logging.getLogger('matplotlib').setLevel(logging.WARNING)
from koapy import KiwoomOpenApiPlusEntrypoint
2021-07-20 10:24:37,545 [DEBUG] Checking module path from config - GetAPIModulePath.py:14 2021-07-20 10:24:37,547 [DEBUG] Checking module path in-directly in 64bit - GetAPIModulePath.py:45 2021-07-20 10:24:42,795 [DEBUG] Reading file C:\OpenAPI\data\nkrealtime.dat - KiwoomOpenApiPlusRealType.py:116
entrypoint = KiwoomOpenApiPlusEntrypoint()
2021-07-20 10:24:45,351 [DEBUG] Testing if client is ready... - KiwoomOpenApiPlusEntrypoint.py:56 2021-07-20 10:24:55,355 [DEBUG] Client is not ready, creating a new server - KiwoomOpenApiPlusEntrypoint.py:58
주요한 기능들은 해당 엔트리포인트의 멤버함수로써 제공된다.
예를 들어 아래와 같이 서버 접속 이전에도 실행 가능한 아래 함수를 활용하면 OpenAPI 가 정상적으로 로드되었는지 간접적으로 확인 가능하다.
module_path = entrypoint.GetAPIModulePath()
module_path
'C:\\OpenAPI'
entrypoint.EnsureConnected()
0
자동 로그인 설정이 되어있는 경우 로그인이 자동으로 처리되며, 그렇지 않은 경우에는 수동으로 아이디, 비밀번호 등 로그인 정보를 입력해 처리해주어야 한다.
credential = {
'user_id': 'id',
'user_password': 'password',
'cert_password': 'password',
'is_simulation': True,
'account_passwords': {
'0000000000': '0000',
}
}
entrypoint.EnsureConnected(credential)
0
참고로 여기서는 이미 로그인이 되어있는 상황이므로 위의 함수가 추가적인 로그인처리를 진행하지는 않게 된다.
다시 한번 기본 함수를 통해 접속상태를 확인해보자. 아래 값이 1 인 경우 정상 접속 상태이다. 접속되어 있지 않은 경우라면 0 을 반환한다.
entrypoint.GetConnectState()
1
이후 예시들에서 사용하기 위해 삼성전자의 코드를 확인한다.
codes = entrypoint.GetCodeListByMarketAsList('0')
names = [entrypoint.GetMasterCodeName(code) for code in codes]
codes_by_name = dict(zip(names, codes))
위에서 GetCodeListByMarketAsList()
함수는 기존의 GetCodeListByMarket()
함수 호출시 나오는 문자열 형태의 결과를 편의를 위해 리스트 형태로 변환해서 제공한다.
code = samsung_code = codes_by_name['삼성전자']
code
'005930'
몇가지 자주 쓰이는 TR 들에 대해서는 요청 및 결과 이벤트 처리까지 완료해서 결과물만 반환하는 상위함수를 제공하고 있다.
info = entrypoint.GetStockBasicInfoAsDict(code) # opt10001
info
{'종목코드': '005930', '종목명': '삼성전자', '결산월': '12', '액면가': '100', '자본금': '7780', '상장주식': '5969783', '신용비율': '+0.16', '연중최고': '+96800', '연중최저': '-78400', '시가총액': '4698219', '시가총액비중': '', '외인소진률': '+53.43', '대용가': '63200', 'PER': '20.49', 'EPS': '3841', 'ROE': '10.0', 'PBR': '2.00', 'EV': '5.51', 'BPS': '39406', '매출액': '2368070', '영업이익': '359939', '당기순이익': '264078', '250최고': '+96800', '250최저': '-53700', '시가': '-78500', '고가': '-78900', '저가': '-78400', '상한가': '+102500', '하한가': '-55300', '기준가': '79000', '예상체결가': '-0', '예상체결수량': '0', '250최고가일': '20210111', '250최고가대비율': '-18.70', '250최저가일': '20200724', '250최저가대비율': '+46.55', '현재가': '-78700', '대비기호': '5', '전일대비': '-300', '등락율': '-0.38', '거래량': '4672311', '거래대비': '-35.52', '액면가단위': '원', '유통주식': '4454030', '유통비율': '74.6'}
data = entrypoint.GetDailyStockDataAsDataFrame(code) # opt10081
2021-07-20 10:25:07,842 [DEBUG] Received 600 records from 2021-07-20 00:00:00 to 2019-02-19 00:00:00 for code 005930 - KiwoomOpenApiPlusServiceClientStubWrapper.py:599 2021-07-20 10:25:08,204 [DEBUG] Received 600 records from 2019-02-18 00:00:00 to 2016-09-01 00:00:00 for code 005930 - KiwoomOpenApiPlusServiceClientStubWrapper.py:599 2021-07-20 10:25:08,568 [DEBUG] Received 600 records from 2016-08-31 00:00:00 to 2014-03-26 00:00:00 for code 005930 - KiwoomOpenApiPlusServiceClientStubWrapper.py:599 2021-07-20 10:25:08,919 [DEBUG] Received 600 records from 2014-03-25 00:00:00 to 2011-10-25 00:00:00 for code 005930 - KiwoomOpenApiPlusServiceClientStubWrapper.py:599 2021-07-20 10:25:25,825 [DEBUG] Received 600 records from 2011-10-24 00:00:00 to 2009-06-03 00:00:00 for code 005930 - KiwoomOpenApiPlusServiceClientStubWrapper.py:599 2021-07-20 10:25:26,184 [DEBUG] Received 600 records from 2009-06-02 00:00:00 to 2006-12-27 00:00:00 for code 005930 - KiwoomOpenApiPlusServiceClientStubWrapper.py:599 2021-07-20 10:25:26,571 [DEBUG] Received 600 records from 2006-12-26 00:00:00 to 2004-08-02 00:00:00 for code 005930 - KiwoomOpenApiPlusServiceClientStubWrapper.py:599 2021-07-20 10:25:26,937 [DEBUG] Received 600 records from 2004-07-30 00:00:00 to 2002-02-22 00:00:00 for code 005930 - KiwoomOpenApiPlusServiceClientStubWrapper.py:599 2021-07-20 10:25:27,289 [DEBUG] Received 600 records from 2002-02-21 00:00:00 to 1999-09-07 00:00:00 for code 005930 - KiwoomOpenApiPlusServiceClientStubWrapper.py:599 2021-07-20 10:25:43,822 [DEBUG] Received 600 records from 1999-09-06 00:00:00 to 1997-07-11 00:00:00 for code 005930 - KiwoomOpenApiPlusServiceClientStubWrapper.py:599 2021-07-20 10:25:44,184 [DEBUG] Received 600 records from 1997-07-10 00:00:00 to 1995-06-24 00:00:00 for code 005930 - KiwoomOpenApiPlusServiceClientStubWrapper.py:599 2021-07-20 10:25:44,549 [DEBUG] Received 600 records from 1995-06-23 00:00:00 to 1993-06-15 00:00:00 for code 005930 - KiwoomOpenApiPlusServiceClientStubWrapper.py:599 2021-07-20 10:25:44,953 [DEBUG] Received 600 records from 1993-06-14 00:00:00 to 1991-05-29 00:00:00 for code 005930 - KiwoomOpenApiPlusServiceClientStubWrapper.py:599 2021-07-20 10:25:45,340 [DEBUG] Received 600 records from 1991-05-28 00:00:00 to 1989-05-04 00:00:00 for code 005930 - KiwoomOpenApiPlusServiceClientStubWrapper.py:599 2021-07-20 10:26:01,829 [DEBUG] Received 600 records from 1989-05-03 00:00:00 to 1987-04-14 00:00:00 for code 005930 - KiwoomOpenApiPlusServiceClientStubWrapper.py:599 2021-07-20 10:26:02,197 [DEBUG] Received 600 records from 1987-04-13 00:00:00 to 1985-03-29 00:00:00 for code 005930 - KiwoomOpenApiPlusServiceClientStubWrapper.py:599 2021-07-20 10:26:02,228 [DEBUG] Received 69 records from 1985-03-28 00:00:00 to 1985-01-04 00:00:00 for code 005930 - KiwoomOpenApiPlusServiceClientStubWrapper.py:599
data
종목코드 | 현재가 | 거래량 | 거래대금 | 일자 | 시가 | 고가 | 저가 | 수정주가구분 | 수정비율 | 대업종구분 | 소업종구분 | 종목정보 | 수정주가이벤트 | 전일종가 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 005930 | 78700 | 4672315 | 367197 | 20210720 | 78500 | 78900 | 78400 | |||||||
1 | 79000 | 13155414 | 1039019 | 20210719 | 79100 | 79200 | 78800 | ||||||||
2 | 79800 | 10859399 | 865953 | 20210716 | 80100 | 80100 | 79500 | ||||||||
3 | 80600 | 13766279 | 1102123 | 20210715 | 79800 | 80600 | 79500 | ||||||||
4 | 79500 | 11575636 | 918601 | 20210714 | 79400 | 79600 | 79100 | ||||||||
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
9664 | 8010 | 4970 | 1 | 19850109 | 8240 | 8240 | 7950 | ||||||||
9665 | 8300 | 12930 | 4 | 19850108 | 8400 | 8400 | 8300 | ||||||||
9666 | 8410 | 11810 | 3 | 19850107 | 8400 | 8500 | 8390 | ||||||||
9667 | 8390 | 1660 | 0 | 19850105 | 8400 | 8440 | 8390 | ||||||||
9668 | 8450 | 1710 | 0 | 19850104 | 8500 | 8500 | 8450 |
9669 rows × 15 columns
데이터가 최대한 있는 그대로 (주로 문자열 형태로) 반환되기 때문에 필요하다면 타입 변환을 거쳐 사용한다.
dates = pd.to_datetime(data['일자'], format='%Y%m%d')
closes = pd.to_numeric(data['현재가'])
plt.plot(dates, closes)
[<matplotlib.lines.Line2D at 0x17cb8832730>]
주가 데이터에서 수정주가가 필요한 경우에는 adjusted_price=True
파라미터를 설정해 호출한다.
data_adjusted = entrypoint.GetDailyStockDataAsDataFrame(code, adjusted_price=True)
2021-07-20 10:26:02,984 [DEBUG] Received 600 records from 2021-07-20 00:00:00 to 2019-02-19 00:00:00 for code 005930 - KiwoomOpenApiPlusServiceClientStubWrapper.py:599 2021-07-20 10:26:03,362 [DEBUG] Received 600 records from 2019-02-18 00:00:00 to 2016-09-01 00:00:00 for code 005930 - KiwoomOpenApiPlusServiceClientStubWrapper.py:599 2021-07-20 10:26:19,849 [DEBUG] Received 600 records from 2016-08-31 00:00:00 to 2014-03-26 00:00:00 for code 005930 - KiwoomOpenApiPlusServiceClientStubWrapper.py:599 2021-07-20 10:26:20,206 [DEBUG] Received 600 records from 2014-03-25 00:00:00 to 2011-10-25 00:00:00 for code 005930 - KiwoomOpenApiPlusServiceClientStubWrapper.py:599 2021-07-20 10:26:20,561 [DEBUG] Received 600 records from 2011-10-24 00:00:00 to 2009-06-03 00:00:00 for code 005930 - KiwoomOpenApiPlusServiceClientStubWrapper.py:599 2021-07-20 10:26:21,000 [DEBUG] Received 600 records from 2009-06-02 00:00:00 to 2006-12-27 00:00:00 for code 005930 - KiwoomOpenApiPlusServiceClientStubWrapper.py:599 2021-07-20 10:26:21,372 [DEBUG] Received 600 records from 2006-12-26 00:00:00 to 2004-08-02 00:00:00 for code 005930 - KiwoomOpenApiPlusServiceClientStubWrapper.py:599 2021-07-20 10:26:37,880 [DEBUG] Received 600 records from 2004-07-30 00:00:00 to 2002-02-22 00:00:00 for code 005930 - KiwoomOpenApiPlusServiceClientStubWrapper.py:599 2021-07-20 10:26:38,237 [DEBUG] Received 600 records from 2002-02-21 00:00:00 to 1999-09-07 00:00:00 for code 005930 - KiwoomOpenApiPlusServiceClientStubWrapper.py:599 2021-07-20 10:26:38,609 [DEBUG] Received 600 records from 1999-09-06 00:00:00 to 1997-07-11 00:00:00 for code 005930 - KiwoomOpenApiPlusServiceClientStubWrapper.py:599 2021-07-20 10:26:39,012 [DEBUG] Received 600 records from 1997-07-10 00:00:00 to 1995-06-24 00:00:00 for code 005930 - KiwoomOpenApiPlusServiceClientStubWrapper.py:599 2021-07-20 10:26:39,369 [DEBUG] Received 600 records from 1995-06-23 00:00:00 to 1993-06-15 00:00:00 for code 005930 - KiwoomOpenApiPlusServiceClientStubWrapper.py:599 2021-07-20 10:26:55,853 [DEBUG] Received 600 records from 1993-06-14 00:00:00 to 1991-05-29 00:00:00 for code 005930 - KiwoomOpenApiPlusServiceClientStubWrapper.py:599 2021-07-20 10:26:56,338 [DEBUG] Received 600 records from 1991-05-28 00:00:00 to 1989-05-04 00:00:00 for code 005930 - KiwoomOpenApiPlusServiceClientStubWrapper.py:599 2021-07-20 10:26:56,663 [DEBUG] Received 600 records from 1989-05-03 00:00:00 to 1987-04-14 00:00:00 for code 005930 - KiwoomOpenApiPlusServiceClientStubWrapper.py:599 2021-07-20 10:26:57,031 [DEBUG] Received 600 records from 1987-04-13 00:00:00 to 1985-03-29 00:00:00 for code 005930 - KiwoomOpenApiPlusServiceClientStubWrapper.py:599 2021-07-20 10:26:57,067 [DEBUG] Received 69 records from 1985-03-28 00:00:00 to 1985-01-04 00:00:00 for code 005930 - KiwoomOpenApiPlusServiceClientStubWrapper.py:599
dates = pd.to_datetime(data_adjusted['일자'], format='%Y%m%d')
closes = pd.to_numeric(data_adjusted['현재가'])
plt.plot(dates, closes)
[<matplotlib.lines.Line2D at 0x17cbc5f70d0>]
만약에 필요한 TR 에 대한 편의함수가 제공되지 않는 경우라면 아래처럼 직접 TR 요청에 필요한 입력값을 설정해 요청하고, 이후 스트림 형태로 들어오는 이벤트 또한 직접 처리해주는 방식으로 사용할 수 있다.
rqname = '주식기본정보요청'
trcode = 'opt10001'
screen_no = '0001' # 화면번호, 0000 을 제외한 4자리 숫자 임의로 지정, None 의 경우 내부적으로 화면번호 자동할당
inputs = {'종목코드': code}
output = {}
logging.info('Requesting data for request name: %s', rqname)
for event in entrypoint.TransactionCall(rqname, trcode, screen_no, inputs):
logging.info('Got event for request: %s', rqname)
names = event.single_data.names
values = event.single_data.values
for name, value in zip(names, values):
output[name] = value
2021-07-20 10:26:57,296 [INFO] Requesting data for request name: 주식기본정보요청 - <ipython-input-27-84e17a5232d0>:1 2021-07-20 10:27:13,444 [INFO] Got event for request: 주식기본정보요청 - <ipython-input-27-84e17a5232d0>:3
output
{'종목코드': '005930', '종목명': '삼성전자', '결산월': '12', '액면가': '100', '자본금': '7780', '상장주식': '5969783', '신용비율': '+0.16', '연중최고': '+96800', '연중최저': '-78400', '시가총액': '4698219', '시가총액비중': '', '외인소진률': '+53.43', '대용가': '63200', 'PER': '20.49', 'EPS': '3841', 'ROE': '10.0', 'PBR': '2.00', 'EV': '5.51', 'BPS': '39406', '매출액': '2368070', '영업이익': '359939', '당기순이익': '264078', '250최고': '+96800', '250최저': '-53700', '시가': '-78500', '고가': '-78900', '저가': '-78400', '상한가': '+102500', '하한가': '-55300', '기준가': '79000', '예상체결가': '-0', '예상체결수량': '0', '250최고가일': '20210111', '250최고가대비율': '-18.70', '250최저가일': '20200724', '250최저가대비율': '+46.55', '현재가': '-78700', '대비기호': '5', '전일대비': '-300', '등락율': '-0.38', '거래량': '4698491', '거래대비': '-35.72', '액면가단위': '원', '유통주식': '4454030', '유통비율': '74.6'}
위의 코드에서 TransactionCall()
함수의 경우 반환되는 스트림의 event
객체는 ListenResponse
타입의 gRPC 메시지 형태로 반환된다.
from pprint import PrettyPrinter
from google.protobuf.json_format import MessageToDict
pp = PrettyPrinter()
def pprint_event(event):
pp.pprint(MessageToDict(event, preserving_proto_field_name=True))
pprint_event(event)
{'arguments': [{'string_value': '0001'}, {'string_value': '주식기본정보요청'}, {'string_value': 'opt10001'}, {'string_value': ''}, {'string_value': '0'}], 'name': 'OnReceiveTrData', 'single_data': {'names': ['종목코드', '종목명', '결산월', '액면가', '자본금', '상장주식', '신용비율', '연중최고', '연중최저', '시가총액', '시가총액비중', '외인소진률', '대용가', 'PER', 'EPS', 'ROE', 'PBR', 'EV', 'BPS', '매출액', '영업이익', '당기순이익', '250최고', '250최저', '시가', '고가', '저가', '상한가', '하한가', '기준가', '예상체결가', '예상체결수량', '250최고가일', '250최고가대비율', '250최저가일', '250최저가대비율', '현재가', '대비기호', '전일대비', '등락율', '거래량', '거래대비', '액면가단위', '유통주식', '유통비율'], 'values': ['005930', '삼성전자', '12', '100', '7780', '5969783', '+0.16', '+96800', '-78400', '4698219', '', '+53.43', '63200', '20.49', '3841', '10.0', '2.00', '5.51', '39406', '2368070', '359939', '264078', '+96800', '-53700', '-78500', '-78900', '-78400', '+102500', '-55300', '79000', '-0', '0', '20210111', '-18.70', '20200724', '+46.55', '-78700', '5', '-300', '-0.38', '4698491', '-35.72', '원', '4454030', '74.6']}}
해당 메시지의 형태는 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
를 통해 프로그램 내에서 확인할 수 있다.
from koapy import KiwoomOpenApiPlusTrInfo
2021-07-20 10:27:13,508 [DEBUG] Reading files under C:\OpenAPI\data - KiwoomOpenApiPlusTrInfo.py:218 2021-07-20 10:27:13,509 [DEBUG] Reading file OPT10001.dat inside C:\OpenAPI\data\opt10001.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,511 [DEBUG] Reading file OPT10059.dat inside C:\OpenAPI\data\opt10001.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,512 [DEBUG] Reading file OPT10087.dat inside C:\OpenAPI\data\opt10001.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,513 [DEBUG] Reading file OPT50037.dat inside C:\OpenAPI\data\opt10001.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,514 [DEBUG] Reading file OPT90005.dat inside C:\OpenAPI\data\opt10001.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,515 [DEBUG] Reading file OPT10002.dat inside C:\OpenAPI\data\opt10002.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,516 [DEBUG] Reading file OPT10003.dat inside C:\OpenAPI\data\opt10003.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,518 [DEBUG] Reading file OPT10004.dat inside C:\OpenAPI\data\opt10004.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,520 [DEBUG] Reading file OPT10005.dat inside C:\OpenAPI\data\opt10005.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,522 [DEBUG] Reading file OPT10006.dat inside C:\OpenAPI\data\opt10006.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,524 [DEBUG] Reading file OPT10007.dat inside C:\OpenAPI\data\opt10007.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,525 [DEBUG] Reading file OPT10008.dat inside C:\OpenAPI\data\opt10008.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,527 [DEBUG] Reading file OPT10009.dat inside C:\OpenAPI\data\opt10009.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,529 [DEBUG] Reading file OPT10010.dat inside C:\OpenAPI\data\opt10010.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,530 [DEBUG] Reading file OPT10011.dat inside C:\OpenAPI\data\opt10011.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,531 [DEBUG] Reading file OPT10012.dat inside C:\OpenAPI\data\opt10012.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,533 [DEBUG] Reading file OPT10013.dat inside C:\OpenAPI\data\opt10013.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,534 [DEBUG] Reading file OPT10014.dat inside C:\OpenAPI\data\opt10014.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,535 [DEBUG] Reading file OPT10015.dat inside C:\OpenAPI\data\opt10015.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,537 [DEBUG] Reading file OPT10016.dat inside C:\OpenAPI\data\opt10016.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,538 [DEBUG] Reading file OPT10017.dat inside C:\OpenAPI\data\opt10017.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,539 [DEBUG] Reading file OPT10018.dat inside C:\OpenAPI\data\opt10018.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,541 [DEBUG] Reading file OPT10019.dat inside C:\OpenAPI\data\opt10019.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,543 [DEBUG] Reading file OPT10020.dat inside C:\OpenAPI\data\opt10020.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,544 [DEBUG] Reading file OPT10021.dat inside C:\OpenAPI\data\opt10021.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,546 [DEBUG] Reading file OPT10022.dat inside C:\OpenAPI\data\opt10022.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,547 [DEBUG] Reading file OPT10023.dat inside C:\OpenAPI\data\opt10023.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,548 [DEBUG] Reading file OPT10024.dat inside C:\OpenAPI\data\opt10024.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,549 [DEBUG] Reading file OPT10025.dat inside C:\OpenAPI\data\opt10025.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,550 [DEBUG] Reading file OPT10026.dat inside C:\OpenAPI\data\opt10026.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,552 [DEBUG] Reading file OPT10027.dat inside C:\OpenAPI\data\opt10027.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,553 [DEBUG] Reading file OPT10028.dat inside C:\OpenAPI\data\opt10028.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,554 [DEBUG] Reading file OPT10029.dat inside C:\OpenAPI\data\opt10029.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,555 [DEBUG] Reading file OPT10030.dat inside C:\OpenAPI\data\opt10030.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,556 [DEBUG] Reading file OPT10031.dat inside C:\OpenAPI\data\opt10031.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,557 [DEBUG] Reading file OPT10032.dat inside C:\OpenAPI\data\opt10032.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,558 [DEBUG] Reading file OPT10033.dat inside C:\OpenAPI\data\opt10033.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,559 [DEBUG] Reading file OPT10034.dat inside C:\OpenAPI\data\opt10034.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,560 [DEBUG] Reading file OPT10035.dat inside C:\OpenAPI\data\opt10035.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,562 [DEBUG] Reading file OPT10036.dat inside C:\OpenAPI\data\opt10036.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,563 [DEBUG] Reading file OPT10037.dat inside C:\OpenAPI\data\opt10037.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,564 [DEBUG] Reading file OPT10038.dat inside C:\OpenAPI\data\opt10038.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,565 [DEBUG] Reading file OPT10039.dat inside C:\OpenAPI\data\opt10039.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,566 [DEBUG] Reading file OPT10040.dat inside C:\OpenAPI\data\opt10040.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,567 [DEBUG] Reading file OPT10041.dat inside C:\OpenAPI\data\opt10041.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,568 [DEBUG] Reading file OPT10042.dat inside C:\OpenAPI\data\opt10042.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,569 [DEBUG] Reading file OPT10043.dat inside C:\OpenAPI\data\opt10043.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,571 [DEBUG] Reading file OPT10044.dat inside C:\OpenAPI\data\opt10044.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,572 [DEBUG] Reading file OPT10045.dat inside C:\OpenAPI\data\opt10045.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,573 [DEBUG] Reading file OPT10046.dat inside C:\OpenAPI\data\opt10046.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,574 [DEBUG] Reading file OPT10047.dat inside C:\OpenAPI\data\opt10047.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,575 [DEBUG] Reading file OPT10048.dat inside C:\OpenAPI\data\opt10048.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,575 [DEBUG] Reading file OPT10049.dat inside C:\OpenAPI\data\opt10049.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,576 [DEBUG] Reading file OPT10050.dat inside C:\OpenAPI\data\opt10050.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,577 [DEBUG] Reading file OPT10051.dat inside C:\OpenAPI\data\opt10051.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,578 [DEBUG] Reading file OPT10052.dat inside C:\OpenAPI\data\opt10052.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,579 [DEBUG] Reading file OPT10053.dat inside C:\OpenAPI\data\opt10053.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,581 [DEBUG] Reading file OPT10054.dat inside C:\OpenAPI\data\opt10054.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,582 [DEBUG] Reading file OPT10055.dat inside C:\OpenAPI\data\opt10055.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,583 [DEBUG] Reading file OPT10058.dat inside C:\OpenAPI\data\opt10058.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,585 [DEBUG] Reading file OPT10059.dat inside C:\OpenAPI\data\opt10059.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,586 [DEBUG] Reading file OPT10060.dat inside C:\OpenAPI\data\opt10060.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,588 [DEBUG] Reading file OPT10061.dat inside C:\OpenAPI\data\opt10061.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,589 [DEBUG] Reading file OPT10062.dat inside C:\OpenAPI\data\opt10062.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,590 [DEBUG] Reading file OPT10063.dat inside C:\OpenAPI\data\opt10063.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,591 [DEBUG] Reading file OPT10064.dat inside C:\OpenAPI\data\opt10064.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,592 [DEBUG] Reading file OPT10065.dat inside C:\OpenAPI\data\opt10065.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,593 [DEBUG] Reading file OPT10066.dat inside C:\OpenAPI\data\opt10066.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,594 [DEBUG] Reading file OPT10067.dat inside C:\OpenAPI\data\opt10067.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,595 [DEBUG] Reading file OPT10068.dat inside C:\OpenAPI\data\opt10068.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,596 [DEBUG] Reading file OPT10069.dat inside C:\OpenAPI\data\opt10069.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,597 [DEBUG] Reading file OPT10070.dat inside C:\OpenAPI\data\opt10070.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,599 [DEBUG] Reading file OPT10071.dat inside C:\OpenAPI\data\opt10071.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,600 [DEBUG] Reading file OPT10072.dat inside C:\OpenAPI\data\opt10072.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,601 [DEBUG] Reading file OPT10073.dat inside C:\OpenAPI\data\opt10073.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,602 [DEBUG] Reading file OPT10074.dat inside C:\OpenAPI\data\opt10074.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,603 [DEBUG] Reading file OPT10075.dat inside C:\OpenAPI\data\opt10075.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,605 [DEBUG] Reading file OPT10076.dat inside C:\OpenAPI\data\opt10076.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,606 [DEBUG] Reading file OPT10077.dat inside C:\OpenAPI\data\opt10077.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,607 [DEBUG] Reading file OPT10078.dat inside C:\OpenAPI\data\opt10078.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,608 [DEBUG] Reading file OPT10079.dat inside C:\OpenAPI\data\opt10079.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,609 [DEBUG] Reading file OPT10080.dat inside C:\OpenAPI\data\opt10080.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,611 [DEBUG] Reading file OPT10081.dat inside C:\OpenAPI\data\opt10081.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,612 [DEBUG] Reading file OPT10082.dat inside C:\OpenAPI\data\opt10082.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,613 [DEBUG] Reading file OPT10083.dat inside C:\OpenAPI\data\opt10083.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,614 [DEBUG] Reading file OPT10084.dat inside C:\OpenAPI\data\opt10084.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,615 [DEBUG] Reading file OPT10085.dat inside C:\OpenAPI\data\opt10085.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,616 [DEBUG] Reading file OPT10086.dat inside C:\OpenAPI\data\opt10086.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,617 [DEBUG] Reading file OPT10087.dat inside C:\OpenAPI\data\opt10087.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,618 [DEBUG] Reading file OPT10094.dat inside C:\OpenAPI\data\opt10094.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,620 [DEBUG] Reading file OPT20001.dat inside C:\OpenAPI\data\opt20001.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,622 [DEBUG] Reading file OPT20002.dat inside C:\OpenAPI\data\opt20002.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,623 [DEBUG] Reading file OPT20003.dat inside C:\OpenAPI\data\opt20003.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,624 [DEBUG] Reading file OPT20004.dat inside C:\OpenAPI\data\opt20004.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,625 [DEBUG] Reading file OPT20005.dat inside C:\OpenAPI\data\opt20005.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,626 [DEBUG] Reading file OPT20006.dat inside C:\OpenAPI\data\opt20006.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,627 [DEBUG] Reading file OPT20007.dat inside C:\OpenAPI\data\opt20007.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,628 [DEBUG] Reading file OPT20008.dat inside C:\OpenAPI\data\opt20008.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,629 [DEBUG] Reading file OPT20009.dat inside C:\OpenAPI\data\opt20009.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,630 [DEBUG] Reading file OPT20019.dat inside C:\OpenAPI\data\opt20019.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,631 [DEBUG] Reading file OPT20068.dat inside C:\OpenAPI\data\opt20068.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,632 [DEBUG] Reading file OPT30001.dat inside C:\OpenAPI\data\opt30001.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,633 [DEBUG] Reading file OPT30002.dat inside C:\OpenAPI\data\opt30002.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,634 [DEBUG] Reading file OPT30003.dat inside C:\OpenAPI\data\opt30003.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,635 [DEBUG] Reading file OPT30004.dat inside C:\OpenAPI\data\opt30004.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,636 [DEBUG] Reading file OPT30005.dat inside C:\OpenAPI\data\opt30005.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,637 [DEBUG] Reading file OPT30006.dat inside C:\OpenAPI\data\opt30006.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,638 [DEBUG] Reading file OPT30007.dat inside C:\OpenAPI\data\opt30007.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,640 [DEBUG] Reading file OPT30008.dat inside C:\OpenAPI\data\opt30008.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,641 [DEBUG] Reading file OPT30009.dat inside C:\OpenAPI\data\opt30009.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,642 [DEBUG] Reading file OPT30010.dat inside C:\OpenAPI\data\opt30010.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,643 [DEBUG] Reading file OPT30011.dat inside C:\OpenAPI\data\opt30011.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,644 [DEBUG] Reading file OPT30012.dat inside C:\OpenAPI\data\opt30012.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,645 [DEBUG] Reading file OPT40001.dat inside C:\OpenAPI\data\opt40001.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,647 [DEBUG] Reading file OPT40002.dat inside C:\OpenAPI\data\opt40002.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,648 [DEBUG] Reading file OPT40003.dat inside C:\OpenAPI\data\opt40003.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,649 [DEBUG] Reading file OPT40004.dat inside C:\OpenAPI\data\opt40004.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,650 [DEBUG] Reading file OPT40005.dat inside C:\OpenAPI\data\opt40005.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,651 [DEBUG] Reading file OPT40006.dat inside C:\OpenAPI\data\opt40006.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,652 [DEBUG] Reading file OPT40007.dat inside C:\OpenAPI\data\opt40007.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,653 [DEBUG] Reading file OPT40008.dat inside C:\OpenAPI\data\opt40008.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,654 [DEBUG] Reading file OPT40009.dat inside C:\OpenAPI\data\opt40009.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,655 [DEBUG] Reading file OPT40010.dat inside C:\OpenAPI\data\opt40010.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,656 [DEBUG] Reading file OPT50001.dat inside C:\OpenAPI\data\opt50001.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,658 [DEBUG] Reading file OPT50002.dat inside C:\OpenAPI\data\opt50002.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,659 [DEBUG] Reading file OPT50003.dat inside C:\OpenAPI\data\opt50003.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,660 [DEBUG] Reading file OPT50004.dat inside C:\OpenAPI\data\opt50004.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,661 [DEBUG] Reading file OPT50005.dat inside C:\OpenAPI\data\opt50005.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,662 [DEBUG] Reading file OPT50006.dat inside C:\OpenAPI\data\opt50006.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,663 [DEBUG] Reading file OPT50007.dat inside C:\OpenAPI\data\opt50007.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,664 [DEBUG] Reading file OPT50008.dat inside C:\OpenAPI\data\opt50008.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,665 [DEBUG] Reading file OPT50009.dat inside C:\OpenAPI\data\opt50009.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,666 [DEBUG] Reading file OPT50010.dat inside C:\OpenAPI\data\opt50010.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,667 [DEBUG] Reading file OPT50011.dat inside C:\OpenAPI\data\opt50011.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,669 [DEBUG] Reading file OPT50012.dat inside C:\OpenAPI\data\opt50012.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,670 [DEBUG] Reading file OPT50013.dat inside C:\OpenAPI\data\opt50013.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,671 [DEBUG] Reading file OPT50014.dat inside C:\OpenAPI\data\opt50014.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,672 [DEBUG] Reading file OPT50015.dat inside C:\OpenAPI\data\opt50015.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,673 [DEBUG] Reading file OPT50016.dat inside C:\OpenAPI\data\opt50016.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,675 [DEBUG] Reading file OPT50017.dat inside C:\OpenAPI\data\opt50017.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,676 [DEBUG] Reading file OPT50018.dat inside C:\OpenAPI\data\opt50018.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,677 [DEBUG] Reading file OPT50019.dat inside C:\OpenAPI\data\opt50019.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,678 [DEBUG] Reading file OPT50020.dat inside C:\OpenAPI\data\opt50020.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,679 [DEBUG] Reading file OPT50021.dat inside C:\OpenAPI\data\opt50021.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,681 [DEBUG] Reading file OPT50022.dat inside C:\OpenAPI\data\opt50022.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,683 [DEBUG] Reading file OPT50023.dat inside C:\OpenAPI\data\opt50023.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,684 [DEBUG] Reading file OPT50024.dat inside C:\OpenAPI\data\opt50024.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,685 [DEBUG] Reading file OPT50025.dat inside C:\OpenAPI\data\opt50025.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,686 [DEBUG] Reading file OPT50026.dat inside C:\OpenAPI\data\opt50026.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,687 [DEBUG] Reading file OPT50027.dat inside C:\OpenAPI\data\opt50027.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,688 [DEBUG] Reading file OPT50028.dat inside C:\OpenAPI\data\opt50028.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,689 [DEBUG] Reading file OPT50029.dat inside C:\OpenAPI\data\opt50029.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,690 [DEBUG] Reading file OPT50030.dat inside C:\OpenAPI\data\opt50030.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,691 [DEBUG] Reading file OPT50031.dat inside C:\OpenAPI\data\opt50031.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,692 [DEBUG] Reading file OPT50032.dat inside C:\OpenAPI\data\opt50032.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,693 [DEBUG] Reading file OPT50033.dat inside C:\OpenAPI\data\opt50033.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,695 [DEBUG] Reading file OPT50034.dat inside C:\OpenAPI\data\opt50034.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,696 [DEBUG] Reading file OPT50035.dat inside C:\OpenAPI\data\opt50035.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,697 [DEBUG] Reading file OPT50036.dat inside C:\OpenAPI\data\opt50036.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,698 [DEBUG] Reading file OPT50037.dat inside C:\OpenAPI\data\opt50037.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,699 [DEBUG] Reading file OPT50038.dat inside C:\OpenAPI\data\opt50038.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,700 [DEBUG] Reading file OPT50039.dat inside C:\OpenAPI\data\opt50039.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,701 [DEBUG] Reading file OPT50040.dat inside C:\OpenAPI\data\opt50040.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,702 [DEBUG] Reading file OPT50043.dat inside C:\OpenAPI\data\opt50043.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,703 [DEBUG] Reading file OPT50044.dat inside C:\OpenAPI\data\opt50044.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,704 [DEBUG] Reading file OPT50062.dat inside C:\OpenAPI\data\opt50062.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,705 [DEBUG] Reading file OPT50063.dat inside C:\OpenAPI\data\opt50063.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,706 [DEBUG] Reading file OPT50064.dat inside C:\OpenAPI\data\opt50064.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,707 [DEBUG] Reading file OPT50065.dat inside C:\OpenAPI\data\opt50065.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,708 [DEBUG] Reading file OPT50066.dat inside C:\OpenAPI\data\opt50066.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,709 [DEBUG] Reading file OPT50067.dat inside C:\OpenAPI\data\opt50067.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,710 [DEBUG] Reading file OPT50068.dat inside C:\OpenAPI\data\opt50068.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,711 [DEBUG] Reading file OPT50071.dat inside C:\OpenAPI\data\opt50071.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,712 [DEBUG] Reading file OPT50072.dat inside C:\OpenAPI\data\opt50072.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,713 [DEBUG] Reading file OPT50073.dat inside C:\OpenAPI\data\opt50073.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,714 [DEBUG] Reading file OPT90001.dat inside C:\OpenAPI\data\opt90001.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,715 [DEBUG] Reading file OPT90002.dat inside C:\OpenAPI\data\opt90002.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,716 [DEBUG] Reading file OPT90003.dat inside C:\OpenAPI\data\opt90003.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,717 [DEBUG] Reading file OPT90004.dat inside C:\OpenAPI\data\opt90004.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,719 [DEBUG] Reading file OPT90005.dat inside C:\OpenAPI\data\opt90005.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,720 [DEBUG] Reading file OPT90006.dat inside C:\OpenAPI\data\opt90006.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,721 [DEBUG] Reading file OPT90007.dat inside C:\OpenAPI\data\opt90007.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,722 [DEBUG] Reading file OPT90008.dat inside C:\OpenAPI\data\opt90008.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,723 [DEBUG] Reading file OPT90009.dat inside C:\OpenAPI\data\opt90009.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,724 [DEBUG] Reading file OPT90010.dat inside C:\OpenAPI\data\opt90010.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,725 [DEBUG] Reading file OPT90011.dat inside C:\OpenAPI\data\opt90011.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,726 [DEBUG] Reading file OPT90012.dat inside C:\OpenAPI\data\opt90012.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,727 [DEBUG] Reading file OPT90013.dat inside C:\OpenAPI\data\opt90013.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,728 [DEBUG] Reading file OPT99999.dat inside C:\OpenAPI\data\opt99999.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,729 [DEBUG] Reading file OPTFOFID.dat inside C:\OpenAPI\data\optfofid.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,731 [DEBUG] Reading file OPTKWFID.dat inside C:\OpenAPI\data\optkwfid.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,732 [DEBUG] Reading file OPTKWINV.dat inside C:\OpenAPI\data\optkwinv.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,733 [DEBUG] Reading file OPTKWPRO.dat inside C:\OpenAPI\data\optkwpro.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,735 [DEBUG] Reading file OPW00001.dat inside C:\OpenAPI\data\opw00001.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,736 [DEBUG] Reading file OPW00002.dat inside C:\OpenAPI\data\opw00002.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,737 [DEBUG] Reading file OPW00003.dat inside C:\OpenAPI\data\opw00003.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,738 [DEBUG] Reading file OPW00004.dat inside C:\OpenAPI\data\opw00004.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,739 [DEBUG] Reading file OPW00005.dat inside C:\OpenAPI\data\opw00005.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,741 [DEBUG] Reading file OPW00006.dat inside C:\OpenAPI\data\opw00006.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,742 [DEBUG] Reading file OPW00007.dat inside C:\OpenAPI\data\opw00007.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,743 [DEBUG] Reading file OPW00008.dat inside C:\OpenAPI\data\opw00008.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,744 [DEBUG] Reading file OPW00009.dat inside C:\OpenAPI\data\opw00009.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,745 [DEBUG] Reading file OPW00010.dat inside C:\OpenAPI\data\opw00010.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,746 [DEBUG] Reading file OPW00011.dat inside C:\OpenAPI\data\opw00011.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,747 [DEBUG] Reading file OPW00012.dat inside C:\OpenAPI\data\opw00012.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,749 [DEBUG] Reading file OPW00013.dat inside C:\OpenAPI\data\opw00013.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,750 [DEBUG] Reading file OPW00014.dat inside C:\OpenAPI\data\opw00014.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,751 [DEBUG] Reading file OPW00015.dat inside C:\OpenAPI\data\opw00015.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,752 [DEBUG] Reading file OPW00016.dat inside C:\OpenAPI\data\opw00016.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,753 [DEBUG] Reading file OPW00017.dat inside C:\OpenAPI\data\opw00017.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,754 [DEBUG] Reading file OPW00018.dat inside C:\OpenAPI\data\opw00018.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,756 [DEBUG] Reading file OPW20001.dat inside C:\OpenAPI\data\opw20001.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,757 [DEBUG] Reading file OPW20002.dat inside C:\OpenAPI\data\opw20002.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,758 [DEBUG] Reading file OPW20003.dat inside C:\OpenAPI\data\opw20003.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,759 [DEBUG] Reading file OPW20004.dat inside C:\OpenAPI\data\opw20004.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,760 [DEBUG] Reading file OPW20005.dat inside C:\OpenAPI\data\opw20005.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,762 [DEBUG] Reading file OPW20006.dat inside C:\OpenAPI\data\opw20006.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,763 [DEBUG] Reading file OPW20007.dat inside C:\OpenAPI\data\opw20007.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,764 [DEBUG] Reading file OPW20008.dat inside C:\OpenAPI\data\opw20008.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,765 [DEBUG] Reading file OPW20009.dat inside C:\OpenAPI\data\opw20009.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,766 [DEBUG] Reading file OPW20010.dat inside C:\OpenAPI\data\opw20010.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,767 [DEBUG] Reading file OPW20011.dat inside C:\OpenAPI\data\opw20011.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,768 [DEBUG] Reading file OPW20012.dat inside C:\OpenAPI\data\opw20012.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,769 [DEBUG] Reading file OPW20013.dat inside C:\OpenAPI\data\opw20013.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,770 [DEBUG] Reading file OPW20014.dat inside C:\OpenAPI\data\opw20014.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,771 [DEBUG] Reading file OPW20015.dat inside C:\OpenAPI\data\opw20015.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,772 [DEBUG] Reading file OPW20016.dat inside C:\OpenAPI\data\opw20016.enc - KiwoomOpenApiPlusTrInfo.py:232 2021-07-20 10:27:13,774 [DEBUG] Reading file OPW20017.dat inside C:\OpenAPI\data\opw20017.enc - KiwoomOpenApiPlusTrInfo.py:232
tr_info = KiwoomOpenApiPlusTrInfo.get_trinfo_by_code('opt10001')
tr_info.inputs
[KiwoomOpenApiPlusTrInfo.Field('종목코드', 0, 6, 9001)]
tr_info.single_outputs
[KiwoomOpenApiPlusTrInfo.Field('종목코드', 0, 20, 389), KiwoomOpenApiPlusTrInfo.Field('종목명', 20, 50, 302), KiwoomOpenApiPlusTrInfo.Field('결산월', 40, 20, 315), KiwoomOpenApiPlusTrInfo.Field('액면가', 60, 20, 310), KiwoomOpenApiPlusTrInfo.Field('자본금', 80, 20, 309), KiwoomOpenApiPlusTrInfo.Field('상장주식', 100, 20, 312), KiwoomOpenApiPlusTrInfo.Field('신용비율', 120, 20, 329), KiwoomOpenApiPlusTrInfo.Field('연중최고', 140, 20, 1006), KiwoomOpenApiPlusTrInfo.Field('연중최저', 160, 20, 1009), KiwoomOpenApiPlusTrInfo.Field('시가총액', 180, 20, 311), KiwoomOpenApiPlusTrInfo.Field('시가총액비중', 200, 20, 336), KiwoomOpenApiPlusTrInfo.Field('외인소진률', 220, 20, 314), KiwoomOpenApiPlusTrInfo.Field('대용가', 240, 20, 308), KiwoomOpenApiPlusTrInfo.Field('PER', 260, 20, 1600), KiwoomOpenApiPlusTrInfo.Field('EPS', 280, 20, 1604), KiwoomOpenApiPlusTrInfo.Field('ROE', 300, 20, 1630), KiwoomOpenApiPlusTrInfo.Field('PBR', 320, 20, 1601), KiwoomOpenApiPlusTrInfo.Field('EV', 340, 20, 1608), KiwoomOpenApiPlusTrInfo.Field('BPS', 360, 20, 1605), KiwoomOpenApiPlusTrInfo.Field('매출액', 380, 20, 1610), KiwoomOpenApiPlusTrInfo.Field('영업이익', 400, 20, 1611), KiwoomOpenApiPlusTrInfo.Field('당기순이익', 420, 20, 1614), KiwoomOpenApiPlusTrInfo.Field('250최고', 440, 20, 1000), KiwoomOpenApiPlusTrInfo.Field('250최저', 460, 20, 1003), KiwoomOpenApiPlusTrInfo.Field('시가', 480, 20, 16), KiwoomOpenApiPlusTrInfo.Field('고가', 500, 20, 17), KiwoomOpenApiPlusTrInfo.Field('저가', 520, 20, 18), KiwoomOpenApiPlusTrInfo.Field('상한가', 540, 20, 305), KiwoomOpenApiPlusTrInfo.Field('하한가', 560, 20, 306), KiwoomOpenApiPlusTrInfo.Field('기준가', 580, 20, 307), KiwoomOpenApiPlusTrInfo.Field('예상체결가', 600, 20, 10023), KiwoomOpenApiPlusTrInfo.Field('예상체결수량', 620, 20, 10024), KiwoomOpenApiPlusTrInfo.Field('250최고가일', 640, 20, 1001), KiwoomOpenApiPlusTrInfo.Field('250최고가대비율', 660, 20, 1002), KiwoomOpenApiPlusTrInfo.Field('250최저가일', 680, 20, 1004), KiwoomOpenApiPlusTrInfo.Field('250최저가대비율', 700, 20, 1005), KiwoomOpenApiPlusTrInfo.Field('현재가', 720, 20, 10), KiwoomOpenApiPlusTrInfo.Field('대비기호', 740, 20, 25), KiwoomOpenApiPlusTrInfo.Field('전일대비', 760, 20, 11), KiwoomOpenApiPlusTrInfo.Field('등락율', 780, 20, 12), KiwoomOpenApiPlusTrInfo.Field('거래량', 800, 20, 13), KiwoomOpenApiPlusTrInfo.Field('거래대비', 820, 20, 30), KiwoomOpenApiPlusTrInfo.Field('액면가단위', 840, 20, 796), KiwoomOpenApiPlusTrInfo.Field('유통주식', 840, 20, 1683), KiwoomOpenApiPlusTrInfo.Field('유통비율', 840, 20, 1684)]
tr_info.multi_outputs
[]
조건검색을 사용하기 위해서는 먼저 서버에 저장된 조건들을 불러와야 한다.
entrypoint.EnsureConditionLoaded()
1
불러온 조건들의 목록은 아래 함수로 확인이 가능하다.
conditions = entrypoint.GetConditionNameListAsList()
conditions
[(0, '대형 저평가 우량주'), (1, '중소형 저평가주')]
이후 예시의 정상동작을 위해서는 아래에서 사용되는 조건들과 같은 이름을 가지는 조건들이 미리 저장되어 있어야 한다.
위의 조건식들은 키움에서 예시로 제공하는 추천식들을 그대로 이름을 똑같이 해서 저장한 것들이다. 참고로 조건들을 편집하고 저장하는건 영웅문 HTS 내부에서만 가능하기 때문에 따로 HTS 를 열어 편집해주어야 한다.
조건식이 편집된 이후에 해당 조건식을 기존에 동작중인 OpenAPI 에도 갱신하고 싶은 경우, 아래 함수를 통해 편집된 조건식을 새로 불러온다.
entrypoint.LoadCondition()
1
condition_name = '대형 저평가 우량주'
codes, info = entrypoint.GetCodeListByCondition(condition_name, with_info=True)
위의 함수에서 with_info=True
로 호출하게 되면 조건을 만족하는 코드 목록 (codes
) 뿐만 아니라 해당 종목들에 대한 기본정보들도 (info
) 같이 가져와 DataFrame 형태로 제공한다.
info
종목코드 | 종목명 | 현재가 | 기준가 | 전일대비 | 전일대비기호 | 등락율 | 거래량 | 거래대금 | 체결량 | ... | ELW만기일 | 미결제약정 | 미결제전일대비 | 이론가 | 내재변동성 | 델타 | 감마 | 쎄타 | 베가 | 로 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 000240 | 한국앤컴퍼니 | -18350 | 18400 | -50 | 5 | -0.27 | 56841 | 1037 | +2 | ... | 00000000 | |||||||||
1 | 001630 | 종근당홀딩스 | -105500 | 106000 | -500 | 5 | -0.47 | 4612 | 485 | -21 | ... | 00000000 | |||||||||
2 | 001800 | 오리온홀딩스 | -16800 | 16850 | -50 | 5 | -0.30 | 65403 | 1091 | +1 | ... | 00000000 | |||||||||
3 | 001880 | DL건설 | -34750 | 35150 | -400 | 5 | -1.14 | 19708 | 683 | -69 | ... | 00000000 | |||||||||
4 | 003230 | 삼양식품 | -93700 | 94100 | -400 | 5 | -0.43 | 23617 | 2201 | +1 | ... | 00000000 | |||||||||
5 | 003550 | LG | -96900 | 97000 | -100 | 5 | -0.10 | 65226 | 6303 | +1 | ... | 00000000 | |||||||||
6 | 003800 | 에이스침대 | -47500 | 47850 | -350 | 5 | -0.73 | 211 | 10 | +4 | ... | 00000000 | |||||||||
7 | 004000 | 롯데정밀화학 | -72100 | 74500 | -2400 | 5 | -3.22 | 166819 | 12117 | +7 | ... | 00000000 | |||||||||
8 | 006040 | 동원산업 | -250500 | 251000 | -500 | 5 | -0.20 | 998 | 249 | +2 | ... | 00000000 | |||||||||
9 | 006390 | 한일현대시멘트 | -35250 | 35550 | -300 | 5 | -0.84 | 9076 | 320 | +5 | ... | 00000000 | |||||||||
10 | 006650 | 대한유화 | +283000 | 275500 | +7500 | 2 | +2.72 | 230909 | 65009 | -5 | ... | 00000000 | |||||||||
11 | 008490 | 서흥 | -54600 | 55100 | -500 | 5 | -0.91 | 2894 | 158 | +1 | ... | 00000000 | |||||||||
12 | 009970 | 영원무역홀딩스 | -46850 | 47600 | -750 | 5 | -1.58 | 4131 | 194 | -11 | ... | 00000000 | |||||||||
13 | 011780 | 금호석유 | -219000 | 223500 | -4500 | 5 | -2.01 | 170090 | 37370 | -56 | ... | 00000000 | |||||||||
14 | 012630 | HDC | -12600 | 12700 | -100 | 5 | -0.79 | 149460 | 1876 | +2 | ... | 00000000 | |||||||||
15 | 013120 | 동원개발 | -6440 | 6470 | -30 | 5 | -0.46 | 84679 | 542 | +3 | ... | 00000000 | |||||||||
16 | 014830 | 유니드 | -80700 | 81200 | -500 | 5 | -0.62 | 37012 | 2945 | -10 | ... | 00000000 | |||||||||
17 | 017960 | 한국카본 | 11950 | 11950 | 0 | 3 | 0.00 | 486979 | 5866 | -29 | ... | 00000000 | |||||||||
18 | 020000 | 한섬 | -38950 | 39700 | -750 | 5 | -1.89 | 25477 | 995 | +1 | ... | 00000000 | |||||||||
19 | 021240 | 코웨이 | +78000 | 77800 | +200 | 2 | +0.26 | 53619 | 4180 | -50 | ... | 00000000 | |||||||||
20 | 024720 | 한국콜마홀딩스 | -28800 | 28950 | -150 | 5 | -0.52 | 43091 | 1255 | -30 | ... | 00000000 | |||||||||
21 | 033290 | 코웰패션 | -7670 | 7750 | -80 | 5 | -1.03 | 684770 | 5274 | -2 | ... | 00000000 | |||||||||
22 | 033780 | KT&G | -82900 | 83300 | -400 | 5 | -0.48 | 104402 | 8655 | -5 | ... | 00000000 | |||||||||
23 | 036830 | 솔브레인홀딩스 | +37250 | 36900 | +350 | 2 | +0.95 | 24305 | 897 | +1 | ... | 00000000 | |||||||||
24 | 049070 | 인탑스 | -29950 | 30150 | -200 | 5 | -0.66 | 38134 | 1133 | +1 | ... | 00000000 | |||||||||
25 | 053210 | 스카이라이프 | -11450 | 11700 | -250 | 5 | -2.14 | 51000 | 581 | -30 | ... | 00000000 | |||||||||
26 | 056190 | 에스에프에이 | +40700 | 40650 | +50 | 2 | +0.12 | 16516 | 671 | +11 | ... | 00000000 | |||||||||
27 | 060150 | 인선이엔티 | -12750 | 12850 | -100 | 5 | -0.78 | 159197 | 2021 | +28 | ... | 00000000 | |||||||||
28 | 069080 | 웹젠 | 30250 | 30250 | 0 | 3 | 0.00 | 45546 | 1367 | +1 | ... | 00000000 | |||||||||
29 | 084010 | 대한제강 | -21400 | 21450 | -50 | 5 | -0.23 | 114720 | 2409 | +1 | ... | 00000000 | |||||||||
30 | 095660 | 네오위즈 | -27550 | 27900 | -350 | 5 | -1.25 | 91021 | 2520 | -1 | ... | 00000000 | |||||||||
31 | 096530 | 씨젠 | +78800 | 77400 | +1400 | 2 | +1.81 | 673516 | 53141 | +2 | ... | 00000000 | |||||||||
32 | 102710 | 이엔에프테크놀로지 | +35550 | 34900 | +650 | 2 | +1.86 | 61037 | 2162 | -2 | ... | 00000000 | |||||||||
33 | 111770 | 영원무역 | -40100 | 40700 | -600 | 5 | -1.47 | 36648 | 1469 | +1 | ... | 00000000 | |||||||||
34 | 161890 | 한국콜마 | -54600 | 54900 | -300 | 5 | -0.55 | 50520 | 2753 | -50 | ... | 00000000 | |||||||||
35 | 192080 | 더블유게임즈 | +62900 | 61000 | +1900 | 2 | +3.11 | 533735 | 34105 | +1 | ... | 00000000 | |||||||||
36 | 192400 | 쿠쿠홀딩스 | +125000 | 122000 | +3000 | 2 | +2.46 | 8572 | 1063 | +2 | ... | 00000000 | |||||||||
37 | 204270 | 제이앤티씨 | -9630 | 9650 | -20 | 5 | -0.21 | 22188 | 213 | +3 | ... | 00000000 | |||||||||
38 | 206640 | 바디텍메드 | -22950 | 23300 | -350 | 5 | -1.50 | 144168 | 3331 | +6 | ... | 00000000 | |||||||||
39 | 243070 | 휴온스 | -62600 | 63500 | -900 | 5 | -1.42 | 21906 | 1376 | +166 | ... | 00000000 | |||||||||
40 | 281820 | 케이씨텍 | +28700 | 28600 | +100 | 2 | +0.35 | 56825 | 1624 | -271 | ... | 00000000 | |||||||||
41 | 284740 | 쿠쿠홈시스 | +44300 | 44250 | +50 | 2 | +0.11 | 14155 | 626 | -8 | ... | 00000000 | |||||||||
42 | 285130 | SK케미칼 | +253500 | 253000 | +500 | 2 | +0.20 | 14990 | 3788 | -1 | ... | 00000000 | |||||||||
43 | 294870 | HDC현대산업개발 | -31650 | 31950 | -300 | 5 | -0.94 | 169341 | 5333 | +3 | ... | 00000000 | |||||||||
44 | 300720 | 한일시멘트 | -172000 | 172500 | -500 | 5 | -0.29 | 7106 | 1210 | -1 | ... | 00000000 |
45 rows × 63 columns
같은 조건식은 1분에 1건 제한이므로 예시 실행시 제한을 회피하기 위해서 새로 설정한다.
condition_name = '중소형 저평가주'
logging.info('Start listening realtime condition stream...')
stream = entrypoint.GetCodeListByConditionAsStream(condition_name)
2021-07-20 10:27:14,498 [INFO] Start listening realtime condition stream... - <ipython-input-44-f04b6a919f1c>:1
실시간 조건검색의 경우 조건에 만족/불만족하는 종목이 편입/이탈할때마다 계속해서 이벤트를 반환한다. 예시에서는 10초 동안만 이벤트를 확인해본다.
import threading
def stop_listening():
logging.info('Stop listening realtime condition events...')
stream.cancel()
threading.Timer(65.0, stop_listening).start() # 65초 이후에 gRPC 커넥션 종료하도록 설정
import grpc
events = []
try:
for event in stream:
events.append(event)
pprint_event(event)
except grpc.RpcError as e:
print(e)
{'arguments': [{'string_value': '7079'}, {'string_value': '900290;900310;900340;002170;037710;042420;210540;225220;352700;900280;900250;'}, {'string_value': '중소형 저평가주'}, {'long_value': '1'}, {'long_value': '0'}], 'name': 'OnReceiveTrCondition'}
2021-07-20 10:28:19,522 [INFO] Stop listening realtime condition events... - <ipython-input-45-679886c13a31>:4
<_MultiThreadedRendezvous of RPC that terminated with: status = StatusCode.CANCELLED details = "Locally cancelled by application!" debug_error_string = "None" >
위에서 stream
결과는 grpc
의 _MultiThreadedRendezvous
객체인데 사실 해당 타입은 직접적으로 외부에 노출되는 타입은 아니다. 대신에 해당 타입은 내부적으로 grpc.RpcError
, grpc.RpcContext
, grpc.Call
, grpc.Future
인터페이스를 구현하고 있으므로 해당 객체의 사용법과 관련해서는 각각의 인터페이스를 참고하자.
최초 이벤트로 반환되는 코드 목록들에 대해서 앞선 일반조건 검색 예시에서와 같이 종목들의 기본정보들을 별도로 가져오고 싶다면 대략 아래처럼 해볼 수 있다.
codes = events[0].arguments[1].string_value.strip(';').split(';')
info = entrypoint.GetStockQuoteInfoAsDataFrame(codes)
info
종목코드 | 종목명 | 현재가 | 기준가 | 전일대비 | 전일대비기호 | 등락율 | 거래량 | 거래대금 | 체결량 | ... | ELW만기일 | 미결제약정 | 미결제전일대비 | 이론가 | 내재변동성 | 델타 | 감마 | 쎄타 | 베가 | 로 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 900290 | GRT | 951 | 951 | 0 | 3 | 0.00 | 0 | 0 | ... | 00000000 | ||||||||||
1 | 900310 | 컬러레이 | -1975 | 2000 | -25 | 5 | -1.25 | 88017 | 173 | -500 | ... | 00000000 | |||||||||
2 | 900340 | 윙입푸드 | -1500 | 1525 | -25 | 5 | -1.64 | 78495 | 117 | +10 | ... | 00000000 | |||||||||
3 | 002170 | 삼양통상 | -75000 | 75400 | -400 | 5 | -0.53 | 2332 | 175 | +1 | ... | 00000000 | |||||||||
4 | 037710 | 광주신세계 | -185500 | 187500 | -2000 | 5 | -1.07 | 241 | 45 | +3 | ... | 00000000 | |||||||||
5 | 042420 | 네오위즈홀딩스 | -29850 | 30150 | -300 | 5 | -1.00 | 14304 | 426 | +3 | ... | 00000000 | |||||||||
6 | 210540 | 디와이파워 | -15700 | 15950 | -250 | 5 | -1.57 | 25482 | 400 | +5 | ... | 00000000 | |||||||||
7 | 225220 | 제놀루션 | -18550 | 18800 | -250 | 5 | -1.33 | 106245 | 1989 | -50 | ... | 00000000 | |||||||||
8 | 352700 | 씨앤투스성진 | -20800 | 20900 | -100 | 5 | -0.48 | 23631 | 489 | +30 | ... | 00000000 | |||||||||
9 | 900280 | 골든센츄리 | -525 | 536 | -11 | 5 | -2.05 | 1378758 | 723 | +50 | ... | 00000000 | |||||||||
10 | 900250 | 크리스탈신소재 | -1555 | 1560 | -5 | 5 | -0.32 | 101699 | 157 | +17 | ... | 00000000 |
11 rows × 63 columns
아니면 stream
생성시에 with_info=True
를 주는 경우 매 조건 이벤트마다 바로 뒤에 관심종목정보요청 이벤트를 이어서 반환하는데, 결국은 약간의 별도 데이터 처리가 필요하다.
condition_name = '중소형 저평가주'
logging.info('Start listening realtime condition stream...')
stream = entrypoint.GetCodeListByConditionAsStream(condition_name, with_info=True)
2021-07-20 10:28:19,664 [INFO] Start listening realtime condition stream... - <ipython-input-50-433baeb2b447>:1
실시간 조건검색의 경우 조건에 만족/불만족하는 종목이 편입/이탈할때마다 계속해서 이벤트를 반환한다. 예시에서는 10초 동안만 이벤트를 확인해본다.
import threading
def stop_listening():
logging.info('Stop listening realtime condition events...')
stream.cancel()
threading.Timer(10.0, stop_listening).start() # 10초 이후에 gRPC 커넥션 종료하도록 설정
import grpc
events = []
try:
for event in stream:
events.append(event)
pprint_event(event)
except grpc.RpcError as e:
print(e)
{'arguments': [{'string_value': '5505'}, {'string_value': '900290;900310;900340;002170;037710;042420;210540;225220;352700;900280;900250;'}, {'string_value': '중소형 저평가주'}, {'long_value': '1'}, {'long_value': '0'}], 'name': 'OnReceiveTrCondition'} {'arguments': [{'string_value': '5505'}, {'string_value': '관심종목정보요청'}, {'string_value': 'OPTKWFID'}, {'string_value': ''}, {'string_value': '0'}], 'multi_data': {'names': ['종목코드', '종목명', '현재가', '기준가', '전일대비', '전일대비기호', '등락율', '거래량', '거래대금', '체결량', '체결강도', '전일거래량대비', '매도호가', '매수호가', '매도1차호가', '매도2차호가', '매도3차호가', '매도4차호가', '매도5차호가', '매수1차호가', '매수2차호가', '매수3차호가', '매수4차호가', '매수5차호가', '상한가', '하한가', '시가', '고가', '저가', '종가', '체결시간', '예상체결가', '예상체결량', '자본금', '액면가', '시가총액', '주식수', '호가시간', '일자', '우선매도잔량', '우선매수잔량', '우선매도건수', '우선매수건수', '총매도잔량', '총매수잔량', '총매도건수', '총매수건수', '패리티', '기어링', '손익분기', '자본지지', 'ELW행사가', '전환비율', 'ELW만기일', '미결제약정', '미결제전일대비', '이론가', '내재변동성', '델타', '감마', '쎄타', '베가', '로'], 'values': [{'values': ['900290', 'GRT', '951', '951', '0', '3', '0.00', '0', '0', '', '0.00', '0.00', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '+1235', '-666', '0', '0', '0', '951', '000000', '-0', '0', '770', '0.00', '641', '67375', '000000', '20210720', '0', '0', '', '', '0', '0', '0', '', '0.00', '0.00', '0.00', '0.00', '0', '0.0000', '00000000', '', '', '', '', '', '', '', '', '']}, {'values': ['900310', '컬러레이', '-1975', '2000', '-25', '5', '-1.25', '88017', '173', '-500', '89.19', '-57.66', '-1980', '-1975', '-1980', '-1985', '-1990', '-1995', '2000', '-1975', '-1970', '-1965', '-1960', '-1955', '+2600', '-1400', '-1955', '-1995', '-1955', '-1975', '102637', '-1955', '7433', '336', '0.00', '1067', '54000', '102800', '20210720', '348', '567', '', '', '7091', '55224', '0', '', '0.00', '0.00', '0.00', '0.00', '0', '0.0000', '00000000', '', '', '', '', '', '', '', '', '']}, {'values': ['900340', '윙입푸드', '-1500', '1525', '-25', '5', '-1.64', '78495', '117', '+10', '55.22', '-38.32', '-1500', '-1495', '-1500', '-1505', '-1510', '-1515', '-1520', '-1495', '-1490', '-1485', '-1480', '-1475', '+1980', '-1070', '-1485', '-1505', '-1480', '-1500', '102659', '-1485', '8385', '294', '0.00', '720', '47973', '102810', '20210720', '6730', '641', '', '', '46811', '178112', '0', '', '0.00', '0.00', '0.00', '0.00', '0', '0.0000', '00000000', '', '', '', '', '', '', '', '', '']}, {'values': ['002170', '삼양통상', '-75000', '75400', '-400', '5', '-0.53', '2332', '175', '+1', '63.99', '-75.30', '-75000', '-74800', '-75000', '-75100', '-75300', '+75500', '+75700', '-74800', '-74700', '-74600', '-74500', '-74400', '+98000', '-52800', '-75200', '+75500', '-74500', '-75000', '102702', '-75200', '28', '150', '5000', '2250', '3000', '102706', '20210720', '19', '69', '', '', '929', '861', '0', '', '0.00', '0.00', '0.00', '0.00', '0', '0.0000', '00000000', '', '', '', '', '', '', '', '', '']}, {'values': ['037710', '광주신세계', '-185500', '187500', '-2000', '5', '-1.07', '241', '45', '+3', '86.67', '-20.13', '-185500', '-184500', '-185500', '-186000', '-186500', '187500', '+188500', '-184500', '-184000', '-183500', '-183000', '-182500', '+243500', '-131500', '-185500', '-186000', '-184000', '-185500', '102703', '-185500', '17', '80', '5000', '2968', '1600', '102744', '20210720', '15', '15', '', '', '932', '1082', '0', '', '0.00', '0.00', '0.00', '0.00', '0', '0.0000', '00000000', '', '', '', '', '', '', '', '', '']}, {'values': ['042420', '네오위즈홀딩스', '-29850', '30150', '-300', '5', '-1.00', '14304', '426', '+3', '58.64', '-55.07', '-29850', '-29800', '-29850', '-29900', '-30000', '-30050', '-30100', '-29800', '-29750', '-29700', '-29650', '-29600', '+39150', '-21150', '-29900', '-30050', '-29700', '-29850', '102550', '-29900', '455', '47', '500', '2644', '8857', '102809', '20210720', '411', '161', '', '', '3945', '7116', '0', '', '0.00', '0.00', '0.00', '0.00', '0', '0.0000', '00000000', '', '', '', '', '', '', '', '', '']}, {'values': ['210540', '디와이파워', '-15700', '15950', '-250', '5', '-1.57', '25482', '400', '+5', '61.81', '-48.94', '-15700', '-15600', '-15700', '-15750', '-15800', '-15850', '-15900', '-15600', '-15550', '-15500', '-15450', '-15400', '+20700', '-11200', '-15550', '-15850', '-15550', '-15700', '102755', '-15550', '2048', '55', '500', '1734', '11042', '102815', '20210720', '46', '3394', '', '', '7114', '26245', '0', '', '0.00', '0.00', '0.00', '0.00', '0', '0.0000', '00000000', '', '', '', '', '', '', '', '', '']}, {'values': ['225220', '제놀루션', '-18550', '18800', '-250', '5', '-1.33', '106245', '1989', '-50', '63.59', '-46.84', '-18600', '-18550', '-18600', '-18650', '-18700', '-18750', '18800', '-18550', '-18500', '-18450', '-18400', '-18350', '+24400', '-13200', '-18550', '+19100', '-18500', '-18550', '102655', '-18550', '3285', '48', '500', '1775', '9567', '102812', '20210720', '200', '2601', '', '', '16400', '29192', '0', '', '0.00', '0.00', '0.00', '0.00', '0', '0.0000', '00000000', '', '', '', '', '', '', '', '', '']}, {'values': ['352700', '씨앤투스성진', '-20800', '20900', '-100', '5', '-0.48', '23631', '489', '+30', '94.15', '-15.93', '-20800', '-20750', '-20800', '-20850', '20900', '+20950', '+21000', '-20750', '-20700', '-20650', '-20600', '-20550', '+27150', '-14650', '-20700', '-20850', '-20500', '-20800', '102705', '-20700', '686', '50', '500', '2079', '9996', '102727', '20210720', '197', '68', '', '', '12055', '11326', '0', '', '0.00', '0.00', '0.00', '0.00', '0', '0.0000', '00000000', '', '', '', '', '', '', '', '', '']}, {'values': ['900280', '골든센츄리', '-525', '536', '-11', '5', '-2.05', '1378758', '723', '+50', '38.06', '-25.67', '-525', '-524', '-525', '-526', '-527', '-528', '-529', '-524', '-523', '-522', '-521', '-520', '+696', '-376', '-525', '-531', '-518', '-525', '102814', '-525', '32885', '35', '0.20', '927', '176574', '102818', '20210720', '4039', '10829', '', '', '87605', '569902', '0', '', '0.00', '0.00', '0.00', '0.00', '0', '0.0000', '00000000', '', '', '', '', '', '', '', '', '']}, {'values': ['900250', '크리스탈신소재', '-1555', '1560', '-5', '5', '-0.32', '101699', '157', '+17', '75.31', '-47.97', '-1555', '-1550', '-1555', '1560', '+1565', '+1570', '+1575', '-1550', '-1545', '-1540', '-1535', '-1530', '+2025', '-1095', '-1535', '1560', '-1535', '-1555', '102752', '-1535', '13649', '34', '0.50', '1054', '67784', '102758', '20210720', '4788', '9906', '', '', '82046', '215639', '0', '', '0.00', '0.00', '0.00', '0.00', '0', '0.0000', '00000000', '', '', '', '', '', '', '', '', '']}]}, 'name': 'OnReceiveTrData'}
2021-07-20 10:28:29,682 [INFO] Stop listening realtime condition events... - <ipython-input-51-c769dc00f6f7>:4
<_MultiThreadedRendezvous of RPC that terminated with: status = StatusCode.CANCELLED details = "Locally cancelled by application!" debug_error_string = "None" >
condition_event = events[0]
info_event = events[1]
records = [values.values for values in info_event.multi_data.values]
columns = info_event.multi_data.names
info = pd.DataFrame.from_records(records, columns=columns)
info
종목코드 | 종목명 | 현재가 | 기준가 | 전일대비 | 전일대비기호 | 등락율 | 거래량 | 거래대금 | 체결량 | ... | ELW만기일 | 미결제약정 | 미결제전일대비 | 이론가 | 내재변동성 | 델타 | 감마 | 쎄타 | 베가 | 로 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 900290 | GRT | 951 | 951 | 0 | 3 | 0.00 | 0 | 0 | ... | 00000000 | ||||||||||
1 | 900310 | 컬러레이 | -1975 | 2000 | -25 | 5 | -1.25 | 88017 | 173 | -500 | ... | 00000000 | |||||||||
2 | 900340 | 윙입푸드 | -1500 | 1525 | -25 | 5 | -1.64 | 78495 | 117 | +10 | ... | 00000000 | |||||||||
3 | 002170 | 삼양통상 | -75000 | 75400 | -400 | 5 | -0.53 | 2332 | 175 | +1 | ... | 00000000 | |||||||||
4 | 037710 | 광주신세계 | -185500 | 187500 | -2000 | 5 | -1.07 | 241 | 45 | +3 | ... | 00000000 | |||||||||
5 | 042420 | 네오위즈홀딩스 | -29850 | 30150 | -300 | 5 | -1.00 | 14304 | 426 | +3 | ... | 00000000 | |||||||||
6 | 210540 | 디와이파워 | -15700 | 15950 | -250 | 5 | -1.57 | 25482 | 400 | +5 | ... | 00000000 | |||||||||
7 | 225220 | 제놀루션 | -18550 | 18800 | -250 | 5 | -1.33 | 106245 | 1989 | -50 | ... | 00000000 | |||||||||
8 | 352700 | 씨앤투스성진 | -20800 | 20900 | -100 | 5 | -0.48 | 23631 | 489 | +30 | ... | 00000000 | |||||||||
9 | 900280 | 골든센츄리 | -525 | 536 | -11 | 5 | -2.05 | 1378758 | 723 | +50 | ... | 00000000 | |||||||||
10 | 900250 | 크리스탈신소재 | -1555 | 1560 | -5 | 5 | -0.32 | 101699 | 157 | +17 | ... | 00000000 |
11 rows × 63 columns
first_account_no = entrypoint.GetFirstAvailableAccount()
request_name = "삼성전자 1주 시장가 신규 매수" # 사용자 구분명, 구분가능한 임의의 문자열
screen_no = "0001" # 화면번호, 0000 을 제외한 4자리 숫자 임의로 지정, None 의 경우 내부적으로 화면번호 자동할당
account_no = first_account_no # 계좌번호 10자리, 여기서는 계좌번호 목록에서 첫번째로 발견한 계좌번호로 매수처리
order_type = 1 # 주문유형, 1 : 신규매수
code = samsung_code # 종목코드, 앞의 삼성전자 종목코드
quantity = 1 # 주문수량, 1주 매수
price = 0 # 주문가격, 시장가 매수는 가격설정 의미없음
quote_type = "03" # 거래구분, 03 : 시장가
original_order_no = "" # 원주문번호, 주문 정정/취소 등에서 사용
주문유형 및 거래구분 등과 관련된 자세한 정보들은 KOAStudio 프로그램에서 확인할 수 있다.
주문처리는 실제 시장이 열려있는 동안에만 테스트해볼 수 있기 때문에, 현재 장이 열려 있는지 먼저 확인하고 해당 경우에 한정해서 테스트를 진행한다.
from pandas import Timestamp
from exchange_calendars import get_calendar
krx_calendar = get_calendar('XKRX')
def is_currently_in_session():
now = Timestamp.now(krx_calendar.tz)
previous_open = krx_calendar.previous_open(now).astimezone(krx_calendar.tz)
next_close = krx_calendar.next_close(previous_open).astimezone(krx_calendar.tz)
return previous_open <= now <= next_close
2021-07-20 10:28:30,088 [INFO] Note: NumExpr detected 12 cores but "NUMEXPR_MAX_THREADS" not set, so enforcing safe limit of 8. - utils.py:129 2021-07-20 10:28:30,088 [INFO] NumExpr defaulting to 8 threads. - utils.py:141
if is_currently_in_session():
logging.info('Sending order to buy %s, quantity of 1 stock, at market price...', code)
for event in entrypoint.OrderCall(request_name, screen_no, account_no, order_type, code, quantity, price, quote_type, original_order_no):
pprint_event(event)
else:
logging.info('Cannot send an order while market is not open, skipping...')
2021-07-20 10:28:30,378 [INFO] Sending order to buy 005930, quantity of 1 stock, at market price... - <ipython-input-58-37048f99b24d>:2
{'arguments': [{'string_value': '0001'}, {'string_value': '삼성전자 1주 시장가 신규 매수'}, {'string_value': 'KOA_NORMAL_BUY_KP_ORD'}, {'string_value': '[100000] 모의투자 매수주문완료'}], 'name': 'OnReceiveMsg'} {'arguments': [{'string_value': '0001'}, {'string_value': '삼성전자 1주 시장가 신규 매수'}, {'string_value': 'KOA_NORMAL_BUY_KP_ORD'}, {'string_value': ''}, {'string_value': ''}], 'name': 'OnReceiveTrData', 'single_data': {'names': ['주문번호'], 'values': ['0092073']}} {'arguments': [{'string_value': '0'}, {'long_value': '35'}, {'string_value': '9201;9203;9205;9001;912;913;302;900;901;902;903;904;905;906;907;908;909;910;911;10;27;28;914;915;938;939;919;920;921;922;923;949;10010;969;819'}], 'name': 'OnReceiveChejanData', 'single_data': {'names': ['계좌번호', '주문번호', '관리사번', '종목코드', '주문업무구분', '주문상태', '종목명', '주문수량', '주문가격', '미체결수량', '체결누계금액', '원주문번호', '주문구분', '매매구분', '매도수구분', '주문/체결시간', '체결번호', '체결가', '체결량', '현재가', '매도호가', '매수호가', '단위체결가', '단위체결량', '당일매매수수료', '당일매매세금', '거부사유', '화면번호', '터미널번호', '신용구분(실시간체결용)', '대출일(실시간체결용)', '949', '시간외단일가_현재가', '969', '819'], 'values': ['8003297811', '0092073', '', 'A005930', 'JJ', '접수', '삼성전자', '1', '0', '1', '0', '0000000', '+매수', '시장가', '2', '102829', '', '', '', '-78700', '-78700', '-78600', '', '', '0', '0', '0', '0001', '', '00', '00000000', '3', '-78900', '0', '0']}} {'arguments': [{'string_value': '0'}, {'long_value': '35'}, {'string_value': '9201;9203;9205;9001;912;913;302;900;901;902;903;904;905;906;907;908;909;910;911;10;27;28;914;915;938;939;919;920;921;922;923;949;10010;969;819'}], 'name': 'OnReceiveChejanData', 'single_data': {'names': ['계좌번호', '주문번호', '관리사번', '종목코드', '주문업무구분', '주문상태', '종목명', '주문수량', '주문가격', '미체결수량', '체결누계금액', '원주문번호', '주문구분', '매매구분', '매도수구분', '주문/체결시간', '체결번호', '체결가', '체결량', '현재가', '매도호가', '매수호가', '단위체결가', '단위체결량', '당일매매수수료', '당일매매세금', '거부사유', '화면번호', '터미널번호', '신용구분(실시간체결용)', '대출일(실시간체결용)', '949', '시간외단일가_현재가', '969', '819'], 'values': ['8003297811', '0092073', '', 'A005930', 'JJ', '체결', '삼성전자', '1', '0', '0', '78600', '0000000', '+매수', '시장가', '2', '102830', '660666', '78600', '1', '-78600', '-78700', '-78600', '78600', '1', '270', '0', '0', '0001', '', '00', '00000000', '3', '-78900', '0', '0']}} {'arguments': [{'string_value': '1'}, {'long_value': '34'}, {'string_value': '9201;9001;917;916;302;10;930;931;932;933;945;946;950;951;27;28;307;8019;957;958;918;990;991;992;993;959;924;10010;25;11;12;306;305;970'}], 'name': 'OnReceiveChejanData', 'single_data': {'names': ['계좌번호', '종목코드', '신용구분', '대출일', '종목명', '현재가', '보유수량', '매입단가', '총매입가', '주문가능수량', '당일순매수수량', '매도/매수구분', '당일총매도손익', '예수금', '매도호가', '매수호가', '기준가', '손익율', '신용금액', '신용이자', '만기일', '당일실현손익(유가)', '당일실현손익률(유가)', '당일실현손익(신용)', '당일실현손익률(신용)', '담보대출수량', '여분아이템', '시간외단일가_현재가', '전일대비기호', '전일대비', '등락율', '하한가', '상한가', '970'], 'values': ['8003297811', 'A005930', '00', '00000000', '삼성전자', '-78600', '4', '78725', '314900', '4', '3', '2', '0', '0', '-78700', '-78600', '79000', '0.00', '0', '0', '00000000', '0', '0.00', '0', '0.00', '0', '0', '-78900', '5', '-400', '-0.51', '-55300', '+102500', '10']}}
주문 이벤트는 기본적으로 주문수량이 모두 소진되기 전까지 이벤트를 듣도록 되어있으며, 다른 이벤트 스트림과 동일하게 stream.cancel()
의 형태로 이벤트 스트림을 더이상 듣지 않도록 하는것이 가능하다. 다만 이벤트 스트림을 취소하는 것이 기존 주문까지 취소하는 것은 아니기 때문에 주문취소나 정정등을 위해서는 별도의 취소/정정 주문을 넣어줘야 한다.
여기서 반환되는 이벤트 객체 역시 앞선 TR 예시에서와 동일하게 ListenResponse
타입의 gRPC 메시지 형태로 반환된다.
from koapy import KiwoomOpenApiPlusRealType
code_list = [code]
fid_list = KiwoomOpenApiPlusRealType.get_fids_by_realtype_name('주식시세')
opt_type = '0' # 기존 화면에 추가가 아니라 신규 생성, 1 의 경우 기존 화면번호에 추가
logging.info('Start listening realtime stock data for code: %s', code)
stream = entrypoint.GetRealDataForCodesAsStream(
code_list,
fid_list,
opt_type,
screen_no=None, # 화면번호, 0000 을 제외한 4자리 숫자 임의로 지정, None 의 경우 내부적으로 화면번호 자동할당
infer_fids=True, # True 로 설정 시 주어진 fid_list 를 고집하지 말고 이벤트 처리 함수의 인자로 전달받는 실시간데이터 이름에 따라 유연하게 fid_list 를 추론
readable_names=True, # True 로 설정 시 각 fid 마다 숫자 대신 읽을 수 있는 이름으로 변환하여 반환
fast_parse=False, # True 로 설정 시 이벤트 처리 함수내에서 데이터 값 읽기 시 GetCommRealData() 함수 호출 대신, 이벤트 처리 함수의 인자로 넘어오는 데이터를 직접 활용, infer_fids 가 True 로 설정된 경우만 유의미함
)
2021-07-20 10:28:30,992 [INFO] Start listening realtime stock data for code: 005930 - <ipython-input-61-d908d1a08033>:1
import threading
def stop_listening():
logging.info('Stop listening realtime events...')
stream.cancel()
threading.Timer(10.0, stop_listening).start() # 10초 이후에 gRPC 커넥션 종료하도록 설정
import grpc
try:
for i, event in enumerate(stream):
if i < 10:
pprint_event(event) # 노트북 출력이 너무 길어질 수 있어 최초 10개만 출력
except grpc.RpcError as e:
print(e)
{'arguments': [{'string_value': '005930'}, {'string_value': '주식체결'}, {'string_value': '102830\t-78700\t-300\t-0.38\t-78700\t-78600\t' '+5\t4712130\t370328\t-78500\t-78900\t-78400\t' '5\t-8443284\t-668690789300\t-35.82\t0.08\t' '206\t90.18\t4698219\t2\t0\t-35.64\t000000\t' '000000\t8615\t090027\t093541\t091501\t' '2270204\t2047349\t-47.42\t12457\t53886\t' '+393\t 0\t+5\t+5\t7870\t6296\t78590\t419'}], 'name': 'OnReceiveRealData', 'single_data': {'names': ['체결시간', '현재가', '전일대비', '등락율', '매도호가', '매수호가', '거래량', '누적거래량', '누적거래대금', '시가', '고가', '저가', '전일대비기호', '거래량전일대비', '거래대금증감', '전일거래량대비율', '거래회전율', '거래비용', '체결강도', '시가총액', '장구분', 'KO접근도', '822', '상한가발생시간', '하한가발생시간', '851', '1890', '1891', '1892', '1030', '1031', '1032', '1071', '1072', '1313', '1315', '1316', '1314', '1497', '1498', '620', '732'], 'values': ['102830', '-78700', '-300', '-0.38', '-78700', '-78600', '+5', '4712130', '370328', '-78500', '-78900', '-78400', '5', '-8443284', '-668690789300', '-35.82', '0.08', '206', '90.18', '4698219', '2', '0', '-35.64', '000000', '000000', '8615', '090027', '093541', '091501', '2270204', '2047349', '-47.42', '12457', '53886', '+393', ' 0', '+5', '+5', '7870', '6296', '78590', '419']}} {'arguments': [{'string_value': '005930'}, {'string_value': '주식체결'}, {'string_value': '102831\t-78700\t-300\t-0.38\t-78700\t-78600\t' '+1\t4712131\t370328\t-78500\t-78900\t-78400\t' '5\t-8443283\t-668690710600\t-35.82\t0.08\t' '206\t90.18\t4698219\t2\t0\t-35.64\t000000\t' '000000\t8615\t090027\t093541\t091501\t' '2270204\t2047350\t-47.42\t12457\t53887\t+78\t ' '0\t+1\t+1\t7870\t6296\t78590\t419'}], 'name': 'OnReceiveRealData', 'single_data': {'names': ['체결시간', '현재가', '전일대비', '등락율', '매도호가', '매수호가', '거래량', '누적거래량', '누적거래대금', '시가', '고가', '저가', '전일대비기호', '거래량전일대비', '거래대금증감', '전일거래량대비율', '거래회전율', '거래비용', '체결강도', '시가총액', '장구분', 'KO접근도', '822', '상한가발생시간', '하한가발생시간', '851', '1890', '1891', '1892', '1030', '1031', '1032', '1071', '1072', '1313', '1315', '1316', '1314', '1497', '1498', '620', '732'], 'values': ['102831', '-78700', '-300', '-0.38', '-78700', '-78600', '+1', '4712131', '370328', '-78500', '-78900', '-78400', '5', '-8443283', '-668690710600', '-35.82', '0.08', '206', '90.18', '4698219', '2', '0', '-35.64', '000000', '000000', '8615', '090027', '093541', '091501', '2270204', '2047350', '-47.42', '12457', '53887', '+78', ' 0', '+1', '+1', '7870', '6296', '78590', '419']}} {'arguments': [{'string_value': '005930'}, {'string_value': '주식체결'}, {'string_value': '102831\t-78700\t-300\t-0.38\t-78700\t-78600\t' '+1\t4712132\t370328\t-78500\t-78900\t-78400\t' '5\t-8443282\t-668690631900\t-35.82\t0.08\t' '206\t90.18\t4698219\t2\t0\t-35.64\t000000\t' '000000\t8615\t090027\t093541\t091501\t' '2270204\t2047351\t-47.42\t12457\t53888\t+78\t ' '0\t+1\t+1\t7870\t6296\t78590\t419'}], 'name': 'OnReceiveRealData', 'single_data': {'names': ['체결시간', '현재가', '전일대비', '등락율', '매도호가', '매수호가', '거래량', '누적거래량', '누적거래대금', '시가', '고가', '저가', '전일대비기호', '거래량전일대비', '거래대금증감', '전일거래량대비율', '거래회전율', '거래비용', '체결강도', '시가총액', '장구분', 'KO접근도', '822', '상한가발생시간', '하한가발생시간', '851', '1890', '1891', '1892', '1030', '1031', '1032', '1071', '1072', '1313', '1315', '1316', '1314', '1497', '1498', '620', '732'], 'values': ['102831', '-78700', '-300', '-0.38', '-78700', '-78600', '+1', '4712132', '370328', '-78500', '-78900', '-78400', '5', '-8443282', '-668690631900', '-35.82', '0.08', '206', '90.18', '4698219', '2', '0', '-35.64', '000000', '000000', '8615', '090027', '093541', '091501', '2270204', '2047351', '-47.42', '12457', '53888', '+78', ' 0', '+1', '+1', '7870', '6296', '78590', '419']}} {'arguments': [{'string_value': '005930'}, {'string_value': '주식체결'}, {'string_value': '102831\t-78700\t-300\t-0.38\t-78700\t-78600\t' '+100\t4712232\t370336\t-78500\t-78900\t' '-78400\t5\t-8443182\t-668682761900\t-35.82\t' '0.08\t206\t90.19\t4698219\t2\t0\t-35.64\t' '000000\t000000\t8616\t090027\t093541\t091501\t' '2270204\t2047451\t-47.42\t12457\t53889\t' '+7870\t 0\t+100\t+100\t7870\t6296\t78590\t' '419'}], 'name': 'OnReceiveRealData', 'single_data': {'names': ['체결시간', '현재가', '전일대비', '등락율', '매도호가', '매수호가', '거래량', '누적거래량', '누적거래대금', '시가', '고가', '저가', '전일대비기호', '거래량전일대비', '거래대금증감', '전일거래량대비율', '거래회전율', '거래비용', '체결강도', '시가총액', '장구분', 'KO접근도', '822', '상한가발생시간', '하한가발생시간', '851', '1890', '1891', '1892', '1030', '1031', '1032', '1071', '1072', '1313', '1315', '1316', '1314', '1497', '1498', '620', '732'], 'values': ['102831', '-78700', '-300', '-0.38', '-78700', '-78600', '+100', '4712232', '370336', '-78500', '-78900', '-78400', '5', '-8443182', '-668682761900', '-35.82', '0.08', '206', '90.19', '4698219', '2', '0', '-35.64', '000000', '000000', '8616', '090027', '093541', '091501', '2270204', '2047451', '-47.42', '12457', '53889', '+7870', ' 0', '+100', '+100', '7870', '6296', '78590', '419']}} {'arguments': [{'string_value': '005930'}, {'string_value': '주식체결'}, {'string_value': '102831\t-78700\t-300\t-0.38\t-78700\t-78600\t' '+1\t4712233\t370336\t-78500\t-78900\t-78400\t' '5\t-8443181\t-668682683200\t-35.82\t0.08\t' '206\t90.19\t4698219\t2\t0\t-35.64\t000000\t' '000000\t8616\t090027\t093541\t091501\t' '2270204\t2047452\t-47.42\t12457\t53890\t+78\t ' '0\t+1\t+1\t7870\t6296\t78590\t419'}], 'name': 'OnReceiveRealData', 'single_data': {'names': ['체결시간', '현재가', '전일대비', '등락율', '매도호가', '매수호가', '거래량', '누적거래량', '누적거래대금', '시가', '고가', '저가', '전일대비기호', '거래량전일대비', '거래대금증감', '전일거래량대비율', '거래회전율', '거래비용', '체결강도', '시가총액', '장구분', 'KO접근도', '822', '상한가발생시간', '하한가발생시간', '851', '1890', '1891', '1892', '1030', '1031', '1032', '1071', '1072', '1313', '1315', '1316', '1314', '1497', '1498', '620', '732'], 'values': ['102831', '-78700', '-300', '-0.38', '-78700', '-78600', '+1', '4712233', '370336', '-78500', '-78900', '-78400', '5', '-8443181', '-668682683200', '-35.82', '0.08', '206', '90.19', '4698219', '2', '0', '-35.64', '000000', '000000', '8616', '090027', '093541', '091501', '2270204', '2047452', '-47.42', '12457', '53890', '+78', ' 0', '+1', '+1', '7870', '6296', '78590', '419']}} {'arguments': [{'string_value': '005930'}, {'string_value': '주식체결'}, {'string_value': '102831\t-78600\t-400\t-0.51\t-78700\t-78600\t' '-10\t4712243\t370337\t-78500\t-78900\t-78400\t' '5\t-8443171\t-668681897200\t-35.82\t0.08\t' '205\t90.19\t4692249\t2\t0\t-35.64\t000000\t' '000000\t8616\t090027\t093541\t091501\t' '2270214\t2047452\t-47.42\t12458\t53890\t-786\t' '-10\t 0\t-10\t7860\t6288\t78590\t419'}], 'name': 'OnReceiveRealData', 'single_data': {'names': ['체결시간', '현재가', '전일대비', '등락율', '매도호가', '매수호가', '거래량', '누적거래량', '누적거래대금', '시가', '고가', '저가', '전일대비기호', '거래량전일대비', '거래대금증감', '전일거래량대비율', '거래회전율', '거래비용', '체결강도', '시가총액', '장구분', 'KO접근도', '822', '상한가발생시간', '하한가발생시간', '851', '1890', '1891', '1892', '1030', '1031', '1032', '1071', '1072', '1313', '1315', '1316', '1314', '1497', '1498', '620', '732'], 'values': ['102831', '-78600', '-400', '-0.51', '-78700', '-78600', '-10', '4712243', '370337', '-78500', '-78900', '-78400', '5', '-8443171', '-668681897200', '-35.82', '0.08', '205', '90.19', '4692249', '2', '0', '-35.64', '000000', '000000', '8616', '090027', '093541', '091501', '2270214', '2047452', '-47.42', '12458', '53890', '-786', '-10', ' 0', '-10', '7860', '6288', '78590', '419']}} {'arguments': [{'string_value': '005930'}, {'string_value': '주식체결'}, {'string_value': '102831\t-78700\t-300\t-0.38\t-78700\t-78600\t' '+2\t4712245\t370337\t-78500\t-78900\t-78400\t' '5\t-8443169\t-668681739800\t-35.82\t0.08\t' '206\t90.19\t4698219\t2\t0\t-35.64\t000000\t' '000000\t8616\t090027\t093541\t091501\t' '2270214\t2047454\t-47.42\t12458\t53891\t' '+157\t 0\t+2\t+2\t7870\t6296\t78590\t419'}], 'name': 'OnReceiveRealData', 'single_data': {'names': ['체결시간', '현재가', '전일대비', '등락율', '매도호가', '매수호가', '거래량', '누적거래량', '누적거래대금', '시가', '고가', '저가', '전일대비기호', '거래량전일대비', '거래대금증감', '전일거래량대비율', '거래회전율', '거래비용', '체결강도', '시가총액', '장구분', 'KO접근도', '822', '상한가발생시간', '하한가발생시간', '851', '1890', '1891', '1892', '1030', '1031', '1032', '1071', '1072', '1313', '1315', '1316', '1314', '1497', '1498', '620', '732'], 'values': ['102831', '-78700', '-300', '-0.38', '-78700', '-78600', '+2', '4712245', '370337', '-78500', '-78900', '-78400', '5', '-8443169', '-668681739800', '-35.82', '0.08', '206', '90.19', '4698219', '2', '0', '-35.64', '000000', '000000', '8616', '090027', '093541', '091501', '2270214', '2047454', '-47.42', '12458', '53891', '+157', ' 0', '+2', '+2', '7870', '6296', '78590', '419']}} {'arguments': [{'string_value': '005930'}, {'string_value': '주식체결'}, {'string_value': '102831\t-78700\t-300\t-0.38\t-78700\t-78600\t' '+1\t4712246\t370337\t-78500\t-78900\t-78400\t' '5\t-8443168\t-668681661100\t-35.82\t0.08\t' '206\t90.19\t4698219\t2\t0\t-35.64\t000000\t' '000000\t8616\t090027\t093541\t091501\t' '2270214\t2047455\t-47.42\t12458\t53892\t+78\t ' '0\t+1\t+1\t7870\t6296\t78590\t419'}], 'name': 'OnReceiveRealData', 'single_data': {'names': ['체결시간', '현재가', '전일대비', '등락율', '매도호가', '매수호가', '거래량', '누적거래량', '누적거래대금', '시가', '고가', '저가', '전일대비기호', '거래량전일대비', '거래대금증감', '전일거래량대비율', '거래회전율', '거래비용', '체결강도', '시가총액', '장구분', 'KO접근도', '822', '상한가발생시간', '하한가발생시간', '851', '1890', '1891', '1892', '1030', '1031', '1032', '1071', '1072', '1313', '1315', '1316', '1314', '1497', '1498', '620', '732'], 'values': ['102831', '-78700', '-300', '-0.38', '-78700', '-78600', '+1', '4712246', '370337', '-78500', '-78900', '-78400', '5', '-8443168', '-668681661100', '-35.82', '0.08', '206', '90.19', '4698219', '2', '0', '-35.64', '000000', '000000', '8616', '090027', '093541', '091501', '2270214', '2047455', '-47.42', '12458', '53892', '+78', ' 0', '+1', '+1', '7870', '6296', '78590', '419']}} {'arguments': [{'string_value': '005930'}, {'string_value': '주식체결'}, {'string_value': '102832\t-78700\t-300\t-0.38\t-78700\t-78600\t' '+1\t4712247\t370338\t-78500\t-78900\t-78400\t' '5\t-8443167\t-668681582400\t-35.82\t0.08\t' '206\t90.19\t4698219\t2\t0\t-35.64\t000000\t' '000000\t8616\t090027\t093541\t091501\t' '2270214\t2047456\t-47.42\t12458\t53893\t+78\t ' '0\t+1\t+1\t7870\t6296\t78590\t419'}], 'name': 'OnReceiveRealData', 'single_data': {'names': ['체결시간', '현재가', '전일대비', '등락율', '매도호가', '매수호가', '거래량', '누적거래량', '누적거래대금', '시가', '고가', '저가', '전일대비기호', '거래량전일대비', '거래대금증감', '전일거래량대비율', '거래회전율', '거래비용', '체결강도', '시가총액', '장구분', 'KO접근도', '822', '상한가발생시간', '하한가발생시간', '851', '1890', '1891', '1892', '1030', '1031', '1032', '1071', '1072', '1313', '1315', '1316', '1314', '1497', '1498', '620', '732'], 'values': ['102832', '-78700', '-300', '-0.38', '-78700', '-78600', '+1', '4712247', '370338', '-78500', '-78900', '-78400', '5', '-8443167', '-668681582400', '-35.82', '0.08', '206', '90.19', '4698219', '2', '0', '-35.64', '000000', '000000', '8616', '090027', '093541', '091501', '2270214', '2047456', '-47.42', '12458', '53893', '+78', ' 0', '+1', '+1', '7870', '6296', '78590', '419']}} {'arguments': [{'string_value': '005930'}, {'string_value': '주식체결'}, {'string_value': '102832\t-78700\t-300\t-0.38\t-78700\t-78600\t' '+1\t4712248\t370338\t-78500\t-78900\t-78400\t' '5\t-8443166\t-668681503700\t-35.82\t0.08\t' '206\t90.19\t4698219\t2\t0\t-35.64\t000000\t' '000000\t8616\t090027\t093541\t091501\t' '2270214\t2047457\t-47.42\t12458\t53894\t+78\t ' '0\t+1\t+1\t7870\t6296\t78590\t419'}], 'name': 'OnReceiveRealData', 'single_data': {'names': ['체결시간', '현재가', '전일대비', '등락율', '매도호가', '매수호가', '거래량', '누적거래량', '누적거래대금', '시가', '고가', '저가', '전일대비기호', '거래량전일대비', '거래대금증감', '전일거래량대비율', '거래회전율', '거래비용', '체결강도', '시가총액', '장구분', 'KO접근도', '822', '상한가발생시간', '하한가발생시간', '851', '1890', '1891', '1892', '1030', '1031', '1032', '1071', '1072', '1313', '1315', '1316', '1314', '1497', '1498', '620', '732'], 'values': ['102832', '-78700', '-300', '-0.38', '-78700', '-78600', '+1', '4712248', '370338', '-78500', '-78900', '-78400', '5', '-8443166', '-668681503700', '-35.82', '0.08', '206', '90.19', '4698219', '2', '0', '-35.64', '000000', '000000', '8616', '090027', '093541', '091501', '2270214', '2047457', '-47.42', '12458', '53894', '+78', ' 0', '+1', '+1', '7870', '6296', '78590', '419']}}
2021-07-20 10:28:41,019 [INFO] Stop listening realtime events... - <ipython-input-62-f9a2c4046337>:4
<_MultiThreadedRendezvous of RPC that terminated with: status = StatusCode.CANCELLED details = "Locally cancelled by application!" debug_error_string = "None" >