카테고리 없음

[Python] 키움증권 API를 사용한 주문조회 코드 상세 설명 (Python, Kiwoom Open API)

indigenthuman 2024. 9. 7. 14:50

[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를 통해 간편하게 주문 데이터를 받아서 처리할 수 있으며, 다양한 주문 정보를 활용하여 전략적인 투자가 가능합니다.