[Python] 키움증권 API를 사용한 주문조회 코드 상세 설명 (Python, Kiwoom Open API)
주문 조회는 주식 주문 정보를 조회하고, 현재 미체결 주문 및 체결된 주문 내역을 확인하는 매우 중요한 과정입니다. 이 글에서는 키움증권 OpenAPI를 활용한 주문 조회 코드의 구성 및 실행 방법을 차근차근 설명하겠습니다.
1. 필요한 라이브러리 및 클래스
from PyQt5.QAxContainer import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from api.Kiwoom import *
import sys
주문 조회에 앞서, PyQt5 라이브러리를 사용하여 API와 연결하고, 이벤트 루프 및 화면 구성을 관리합니다. QAxWidget을 통해 키움 API와 연동되며, 주문 데이터를 받아옵니다.
2. 주문 조회 함수 정의
주문 조회의 핵심 함수는 get_order입니다. 이 함수는 서버에 주문 정보를 요청하고, 결과를 받아서 출력하거나 가공하는 역할을 합니다.
def get_order(self):
self.dynamicCall("SetInputValue(QString, QString)", "계좌번호", self.account_number) # 계좌번호 입력
self.dynamicCall("SetInputValue(QString, QString)", "전체종목구분", "0") # 전체 종목 구분
self.dynamicCall("SetInputValue(QString, QString)", "체결구분", "0") # 미체결, 체결 전체 조회
self.dynamicCall("SetInputValue(QString, QString)", "매매구분", "0") # 매수, 매도 전체 조회
self.dynamicCall("CommRqData(QString, QString, int, QString)", "opt10075_req", "opt10075", 0, "0002") # 서버에 주문 데이터 요청
self.tr_event_loop.exec_() # 이벤트 루프 실행 대기
return self.tr_data # 주문 데이터를 반환
3. 주요 호출 메서드 설명
- SetInputValue: 서버에 조회를 요청할 때 필요한 값을 설정합니다. 여기서는 계좌번호, 전체 종목 구분, 체결 구분, 매매 구분 등을 입력합니다.
- CommRqData: 실제로 주문 데이터를 서버로 요청하는 메서드입니다. 각 요청에는 고유한 이름(opt10075_req)이 지정되며, 서버 응답을 대기합니다.
- self.tr_event_loop.exec_(): 데이터를 서버로부터 응답받을 때까지 이벤트 루프가 종료되지 않도록 유지합니다.
4. 주문 데이터 처리
서버로부터 받은 주문 데이터는 _on_receive_tr_data 메서드에서 처리됩니다. 이 함수는 서버 응답을 받아서, 데이터를 추출하고 필요한 정보를 가공하여 self.tr_data에 저장합니다.
def _on_receive_tr_data(self, screen_no, rqname, trcode, record_name, next, unused1, unused2, unused3, unused4):
tr_data_cnt = self.dynamicCall("GetRepeatCnt(QString, QString)", trcode, rqname) # 반복 횟수 가져오기
if rqname == "opt10075_req": # 주문조회 요청
for i in range(tr_data_cnt):
code = self.dynamicCall("GetCommData(QString, QString, int, QString)", trcode, rqname, i, "종목코드").strip()
code_name = self.dynamicCall("GetCommData(QString, QString, int, QString)", trcode, rqname, i, "종목명").strip()
order_number = str(int(self.dynamicCall("GetCommData(QString, QString, int, QString)", trcode, rqname, i, "주문번호").strip()))
order_status = self.dynamicCall("GetCommData(QString, QString, int, QString)", trcode, rqname, i, "주문상태").strip()
order_quantity = int(self.dynamicCall("GetCommData(QString, QString, int, QString)", trcode, rqname, i, "주문수량").strip())
order_price = int(self.dynamicCall("GetCommData(QString, QString, int, QString)", trcode, rqname, i, "주문가격").strip())
current_price = int(self.dynamicCall("GetCommData(QString, QString, int, QString)", trcode, rqname, i, "현재가").strip().lstrip('+').lstrip('-'))
order_type = self.dynamicCall("GetCommData(QString, QString, int, QString)", trcode, rqname, i, "주문구분").strip()
left_quantity = int(self.dynamicCall("GetCommData(QString, QString, int, QString)", trcode, rqname, i, "미체결수량").strip())
executed_quantity = int(self.dynamicCall("GetCommData(QString, QString, int, QString)", trcode, rqname, i, "체결량").strip())
ordered_at = self.dynamicCall("GetCommData(QString, QString, int, QString)", trcode, rqname, i, "시간").strip()
fee = int(self.dynamicCall("GetCommData(QString, QString, int, QString)", trcode, rqname, i, "당일매매수수료").strip())
tax = int(self.dynamicCall("GetCommData(QString, QString, int, QString)", trcode, rqname, i, "당일매매세금").strip())
self.order[code] = {
'종목코드': code,
'종목명': code_name,
'주문번호': order_number,
'주문상태': order_status,
'주문수량': order_quantity,
'주문가격': order_price,
'현재가': current_price,
'주문구분': order_type,
'미체결수량': left_quantity,
'체결량': executed_quantity,
'주문시간': ordered_at,
'당일매매수수료': fee,
'당일매매세금': tax
}
self.tr_data = self.order # 주문 데이터를 저장
self.tr_event_loop.exit() # 이벤트 루프 종료
5. 주문 정보 항목 설명
주문 데이터는 다음과 같은 항목들로 구성됩니다.
- 종목코드 (code): 주식 종목의 코드
- 종목명 (code_name): 종목의 이름
- 주문번호 (order_number): 주문 고유 번호
- 주문상태 (order_status): 주문의 현재 상태 (접수, 체결, 미체결 등)
- 주문수량 (order_quantity): 주문한 수량
- 주문가격 (order_price): 주문 가격
- 현재가 (current_price): 현재 가격
- 주문구분 (order_type): 매수/매도 구분
- 미체결수량 (left_quantity): 미체결된 수량
- 체결량 (executed_quantity): 체결된 수량
- 주문시간 (ordered_at): 주문이 접수된 시간
- 당일매매수수료 (fee): 수수료
- 당일매매세금 (tax): 세금
6. 주문 조회 실행 예시
마지막으로, 이 코드를 실행하여 주문 내역을 조회하는 예시입니다.
# 키움증권 API에 로그인 요청
app = QApplication(sys.argv)
kiwoom = Kiwoom()
# 주문 조회 실행
orders = kiwoom.get_order()
print(orders)
app.exec_()
get_order() 함수를 실행하면 계좌의 주문 정보를 서버로부터 받아서 콘솔에 출력할 수 있습니다.
결론
주문 조회는 투자자의 계좌 내 미체결 주문과 체결된 주문 내역을 확인하는 데 필수적인 기능입니다. 위에서 설명한 방식으로 Kiwoom OpenAPI를 통해 간편하게 주문 데이터를 받아서 처리할 수 있으며, 다양한 주문 정보를 활용하여 전략적인 투자가 가능합니다.