1) 매도 코드 작성

매수와 매도 코드는 크게 다른 것이 없습니다.

kiwoom.SendOrder 시에 매수 인지 매도 인지 옵션 파라미터 값만 달라집니다.

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.6
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton, QComboBox, QLineEdit, QTextEdit, QLabel
from PyQt5.QtCore import Qt
from pykiwoom.kiwoom import Kiwoom
import sys

def get_stock_name(kiwoom, code):
    stock_info = kiwoom.GetMasterCodeName(code)
    return stock_info if stock_info else "알 수 없는 종목"

class KiwoomSellApp(QWidget):
    def __init__(self):
        super().__init__()
        self.kiwoom = Kiwoom()
        self.kiwoom.CommConnect(block=True)  # 로그인
        
        self.initUI()
    
    def initUI(self):
        layout = QVBoxLayout()
        
        # 종목 코드 입력
        self.stock_code_label = QLabel("종목 코드:")
        self.stock_code = QLineEdit()
        layout.addWidget(self.stock_code_label)
        layout.addWidget(self.stock_code)
        
        # 매도 유형 선택
        self.order_type_label = QLabel("매도 유형:")
        self.order_type = QComboBox()
        self.order_type.addItems(["시장가", "매도가"])
        self.order_type.currentIndexChanged.connect(self.order_type_changed)
        layout.addWidget(self.order_type_label)
        layout.addWidget(self.order_type)
        
        # 매도가 입력 (매도가 선택 시 활성화)
        self.order_price_label = QLabel("매도가:")
        self.order_price = QLineEdit()
        self.order_price.setDisabled(True)
        layout.addWidget(self.order_price_label)
        layout.addWidget(self.order_price)
        
        # 수량 입력
        self.order_amount_label = QLabel("수량:")
        self.order_amount = QLineEdit()
        layout.addWidget(self.order_amount_label)
        layout.addWidget(self.order_amount)
        
        # 매도 버튼
        self.sell_button = QPushButton("매도 주문")
        self.sell_button.clicked.connect(self.sell_stock)
        layout.addWidget(self.sell_button)
        
        # 로그 창
        self.log = QTextEdit()
        self.log.setReadOnly(True)
        layout.addWidget(self.log)
        
        self.setLayout(layout)
        self.setWindowTitle("Kiwoom 매도 주문 시스템")
    
    def order_type_changed(self):
        """ 매도 유형 변경 시 매도가 입력 활성화 여부 설정 """
        if self.order_type.currentText() == "매도가":
            self.order_price.setDisabled(False)
        else:
            self.order_price.setDisabled(True)
    
    def sell_stock(self):
        """ 매도 주문 실행 """
        stock_code = self.stock_code.text().strip()
        order_type = 1 if self.order_type.currentText() == "시장가" else 0  # 1: 시장가, 0: 지정가
        order_price = self.order_price.text().strip() if order_type == 0 else ""
        order_amount = self.order_amount.text().strip()
        
        if not stock_code or not order_amount:
            self.log.append("[오류] 종목 코드와 수량을 입력하세요.")
            return
        
        # 종목명 조회
        stock_name = get_stock_name(self.kiwoom, stock_code)
        
        # 매도 주문 전송
        order_id = self.kiwoom.SendOrder(
            "매도주문", "0101", self.kiwoom.GetLoginInfo("ACCNO").split(';')[0], 2, 
            stock_code, int(order_amount), int(order_price) if order_price else 0, 
            order_type, ""
        )
        
        self.log.append(f"[주문] {stock_name} ({stock_code}) 매도 주문 - 가격: {order_price if order_price else '시장가'}, 수량: {order_amount}")
        
        # 체결 이벤트 감지하여 로그 업데이트
        self.kiwoom.OnReceiveChejanData = self.order_filled
    
    def order_filled(self, gubun, item_cnt, fid_list):
        """ 체결 완료 시 로그 업데이트 """
        if gubun == "0":  # 체결 정보
            stock_code = self.kiwoom.GetChejanData(9001).strip()[1:]  # 종목코드 앞에 'A'가 붙어있음
            stock_name = get_stock_name(self.kiwoom, stock_code)
            self.log.append(f"[체결] {stock_name} ({stock_code}) 매도 주문 체결 완료")

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

코드 내용도 아래와 같이 간단합니다.

 

  • OrderType (QComboBox): "시장가" 또는 "매도가" 선택
  • OrderPrice (QLineEdit): 매도 주문가 입력 (매도가 선택 시 활성화)
  • OrderAmount (QLineEdit): 매도 수량 입력
  • StockCode (QLineEdit): 종목코드 입력
  • Log (QTextEdit): 주문 및 체결 내역 표시

아래 코드는 실제 매도 요청이 나가는 것으로 매수와 매도가 거의 유사하며 order type 이 아래 명령에는 2로 나가고 있습니다. 

order type 은 아래와 같습니다.

order_type: 1: 신규매수, 2: 신규매도, 3: 매수취소, 4: 매도취소, 5: 매수정정, 6: 매도정정

 

order_id = self.kiwoom.SendOrder(
            "매도주문", "0101", self.kiwoom.GetLoginInfo("ACCNO").split(';')[0], 2,
            stock_code, int(order_amount), int(order_price) if order_price else 0,
            order_type, ""
        )

 

2) 매도 코드 실행

실행 화면 입니다.

 

Posted by 제이브레인
,