pykiwoom 이라는 kiwoom api 라이브러리를 사용하여 매수를 하는 예제를 만들어보겠습니다.

pykiwoom 모듈은 키움증권의 Open API+를 파이썬에서 보다 쉽게 사용할 수 있도록 매수, 매도, 조회 등의 기본적인 기능을 손쉽게 사용할 수 있도록 만들어 놓은 모듈입니다.

1) pykiwoom 모듈 설치

conda activate py38_32
pip install pykiwoom

 

이미  pykiwoom 모듈이 설치되어 있는 경우 업데이트를 해주는 것이 좋습니다.

해당 모듈은 계속적으로 업데이트되기 때문입니다.

pip install -U pykiwoom

2) 매수 코드 작성

ChatGPT 프로프트는 다음과 같습니다.

키움증권 api 라이브러리인 pykiwoom 을 사용하여 매수하는 코드를 만들어주세요. 
pyqt 와도 같이 연결해주세요. 
OrderType이라는 이름을 가진 ComboBox 로 시장가, 매수가 선택이 있고 매수가 선택시 OrderPrice라는 LineEdit 에서 매수가를 불러옵니다. 
그리고 수량을 입력한 OrderAmount라는 LineEdit 도 있습니다. 
그리고 종목코드를 입력한 StockCode라는 LineEdit 도 있습니다. 
매수 주문이 나가면 Log라는 TextEdit에 종목코드에 해당하는 종목명을 가져와서 종목명이 매수가 얼마에 몇개가 주문되었다고 표시합니다.
그리고 매수가 체결이 되면 매수가 체결되었다라는 메시지를 표시합니다.
파이썬 코드를 만들고 주석도 추가해주세요

 

생성된 코드는 다음과 같습니다.

아래 코드는 다음 위치에서 다운 받는 것이 가능합니다.

git clone https://github.com/jbpark/JbTraderExample.git
cd JbTraderExample/jbtrader/ch5.5
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QLineEdit, QLabel, QComboBox, QTextEdit
from pykiwoom.kiwoom import Kiwoom

class KiwoomAPI(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Kiwoom Stock Buyer")
        self.setGeometry(100, 100, 500, 300)
        
        # Kiwoom API 객체 생성
        self.kiwoom = Kiwoom()
        self.kiwoom.CommConnect(block=True)  # 로그인 실행 (블록킹 방식)
        
        # UI 요소 설정
        self.stock_label = QLabel("종목코드:", self)
        self.stock_label.move(20, 30)
        self.StockCode = QLineEdit(self)
        self.StockCode.setGeometry(100, 30, 100, 20)
        
        self.qty_label = QLabel("수량:", self)
        self.qty_label.move(20, 70)
        self.OrderAmount = QLineEdit(self)
        self.OrderAmount.setGeometry(100, 70, 100, 20)
        
        self.price_label = QLabel("가격:", self)
        self.price_label.move(20, 110)
        self.OrderPrice = QLineEdit(self)
        self.OrderPrice.setGeometry(100, 110, 100, 20)
        self.OrderPrice.setEnabled(False)  # 기본적으로 비활성화
        
        self.order_type_label = QLabel("주문유형:", self)
        self.order_type_label.move(20, 150)
        self.OrderType = QComboBox(self)
        self.OrderType.setGeometry(100, 150, 100, 20)
        self.OrderType.addItems(["시장가", "매수가"])
        self.OrderType.currentIndexChanged.connect(self.update_price_input)
        
        self.buy_button = QPushButton("매수", self)
        self.buy_button.setGeometry(100, 190, 100, 30)
        self.buy_button.clicked.connect(self.buy_stock)
        
        self.log_label = QLabel("Log:", self)
        self.log_label.move(220, 30)
        self.Log = QTextEdit(self)
        self.Log.setGeometry(220, 50, 250, 200)
        self.Log.setReadOnly(True)
        
        # 체결 이벤트 연결
        self.kiwoom.OnReceiveChejanData = self.receive_chejan_data
        
    def update_price_input(self):
        """주문 유형에 따라 가격 입력 활성화/비활성화"""
        if self.OrderType.currentText() == "매수가":
            self.OrderPrice.setEnabled(True)
        else:
            self.OrderPrice.setEnabled(False)
            self.OrderPrice.clear()
        
    def buy_stock(self):
        """키움 API를 이용하여 주식 매수 주문 실행"""
        account = self.kiwoom.GetLoginInfo("ACCNO").split(';')[0]  # 계좌번호 가져오기
        code = self.StockCode.text()
        qty = self.OrderAmount.text()
        price = self.OrderPrice.text() if self.OrderPrice.isEnabled() else "0"  # 시장가 주문일 경우 가격 0
        
        if not code or not qty:
            self.Log.append("종목코드와 수량을 입력하세요.")
            return
        
        # 종목명 가져오기
        stock_name = self.kiwoom.GetMasterCodeName(code)
        
        order_type = 1  # 1: 매수
        hoga = "00" if self.OrderPrice.isEnabled() else "03"  # 00: 지정가, 03: 시장가
        
        self.kiwoom.SendOrder(
            "매수주문", "0101", account, order_type, code, int(qty), int(price), hoga, ""
        )
        self.Log.append(f"{stock_name}({code}) {qty}주 매수 주문 실행 ({'지정가' if self.OrderPrice.isEnabled() else '시장가'})")
        
    def receive_chejan_data(self, gubun, item_cnt, fid_list):
        """체결 데이터 수신 이벤트 처리"""
        if gubun == "0":  # 주문 체결
            stock_name = self.kiwoom.GetChejanData(302)  # 종목명
            price = self.kiwoom.GetChejanData(910)  # 체결가
            qty = self.kiwoom.GetChejanData(911)  # 체결 수량
            self.Log.append(f"{stock_name} {qty}주 체결 완료 (가격: {price})")

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = KiwoomAPI()
    window.show()
    sys.exit(app.exec_())

 

3) 매수 코드 실행

실행 시 다음과 같이 매수에 필요한 가장 간단한 기능으로 실행됩니다.

종목 코드 입력 후 수량 입력하고 매수 버튼을 클릭하면 매수가 진행됩니다.

 

해당 코드는 기능은 아래와 같이 간단하게 요약 할 수 있습니다.

 

  • OrderType(ComboBox)에서 매수가 선택 시 OrderPrice(LineEdit) 활성화
  • 주문이 실행되면 Log(QTextEdit)에 종목명, 매수가, 주문 수량 출력
  • 주문이 체결되면 체결 정보를 Log에 표시

 

실제 주문은 SendOrder 함수에 의해 실행됩니다.

self.kiwoom.SendOrder(
            "매수주문", "0101", account, order_type, code, int(qty), int(price), hoga, ""
        )

 

Posted by 제이브레인
,