[주식자동매매] 분할 매수/매도 코딩하기(5), 종목명/종목코드 가져오기
본문 바로가기

주식 자동매매 강의/중급반(시황 및 차트 구현)

[주식자동매매] 분할 매수/매도 코딩하기(5), 종목명/종목코드 가져오기

반응형

 지난 강의에서 감시 가격/매수수량 입력 부분을 초기화하였으며, 이번 강의에서는 분할 매수/매도하기 위한 종목명/종목코드/현재가를 가져오는 코딩을 하도록 하겠습니다.

 

1. 기본 셋팅

 종목명을 입력하면 종목코드 및 현재가를 가져오는 코딩  or 종목코드를 입력하면 종목명 및 현재가를 가져오는 코딩

  코딩을 위해서는 기초반의 코드가 필요합니다.

 

 [기초반 강의 링크 : 클릭하세요.]

 

 우선 기본적인 구성은 아래와 같습니다.

반응형

기본 구성
기본 구성

 (1) self.k = Kiwoom() : 키움 서버로 명령을 보내고 싱글턴 기반의 공용 언어를 사용하기 위해 Kiwoom() 클래스를 self.k에 인스턴스화 합니다. 그러기 위해서는 앞서 from kiwoom import Kiwoom을 통해 kiwoom 스크립트의 Kiwoom() 클래스를 가져와야 합니다. kiwoom 스크립트는 기초반에서 만들었습니다.

Kiwoom() 클래스
Kiwoom() 클래스

 (2) self.detail_account_info_event_loop = QEventLoop() : 이벤트 루프 기능을 self.detail_account_info_event_loop에 인스턴스화 합니다.

 (3) self.k.kiwoom.OnReceiveTrData.connect(self.trdata_slot) : 키움 서버로부터 수신되는 모든 데이터를 self.trdata_slot에 받기 위해 OnReceiveTrData 함수를 사용합니다. 앞서 말씀드렸다시피 키움 서버로 명령을 보내기 위해서는 self.k.kiwoom 명령어 사용이 필요합니다.

 그리고 self.additemlast라는pushbutton을 클릭하면 self.searchItem2가 실행되게 합니다. self.searchItem2는 우리가 매수/매도하려는 종목의 코드번호/현재가를 찾아오기 위함 함수입니다.

 

2. 종목명 또는 종목 코드 가져오기

 아래 그림과 같이 종목 명에 삼정전자를 입력 시 종목 코드를 가져옵니다.

종목명 입력 시 종목코드 가져오기
종목명 입력 시 종목코드 가져오기

 또는 종목 코드를 입력해도 종목명을 가져옵니다.

종목코드 입렧 시 종목명 가져오기
종목코드 입렧 시 종목명 가져오기

 아래는 위에서 설명한 것을 이행하기 위한 코드입니다.

종목 코드 또는 종목 명 가져오기
종목 코드 또는 종목 명 가져오기

 (1) 종목명 가져오기

  - 종목명을 입력하는 TextEdit의 objectName이 searchItemTextEdit2이고 입력된 값을 가져오기 위해 toPlainText() 함수를 사용하였습니다. 입력한 종목명은 self.itemName에 저장됩니다.

종목명 objectName
종목명 objectName

 - 종목명을 입력하면 종목 코드를 입력하지 않으므로 None 처리합니다.

 (2) 종목 코드 가져오기

 - 만약 self.itemName에 종목명이 들어있다면 (!= "" : 비어있지 않다면) 아래 코드를 실행합니다.

 - 코스피/코스닥 전 종목의 코드번호를 저장한 self.k.All_Stock_Code에 key() 함수를 사용하여 모든 코드번호를 가져옵니다. 이때, 3600개가 있으면 for 문을 사용하여 하나씩 code에 넘깁니다.

 - 그리고 만약 self.itemName에 저장된 종목명과 self.All_Stock_Code에 저장된 종목명이 같다면 그때의 코드번호(code)를 self.new_code에 입력합니다. 이렇게 하면 우리는 코드 명과 코드 번호를 다 가질 수 있습니다.

 (3) 종목 코드번호만 입력되었을 때 종목명 가져오기

 위의 코딩과 정 반대로 하시면 됩니다.

  - 우선적으로 종목명을 입력하는 self.itemName이 비어있다면 아래 코딩을 시작합니다.

  - 종목 코들 입력하는 TextEdit의 objectName이 searchItemTextEdit3이고 입력된 값을 가져오기 위해 toPlainText() 함수를 사용하였습니다. 또한 혹시 모를 공백을 제거하기 위해 strip() 함수를 사용합니다. 최종적으로는 입력한 코드는 self.new_code에 인스턴스화 합니다.

종목코드 objectName
종목코드 objectName

  - 나머지는 위와 정말 동일합니다.  코스피/코스닥 전 종목의 코드번호를 저장한 self.k.All_Stock_Code에 key() 함수를 사용하여 모든 코드번호를 가져옵니다. 이때, 3600개가 있으면 for 문을 사용하여 하나씩 code에 넘깁니다. 그리고 이 코드 번호와 우리가 입력한 코드번호 self.new_code와 동일할 때의 종목명을 self.itemName에 입력합니다.

 

3. 결론 및 코드

 모든 자세한 설명은 기초반에 다 되어 있습니다. 중급반에서는 약간의 응용과 반복입니다.

 위의 코딩을 마치면 우리는 입력이 종목명이 되었든 종목코드가 되었든 무조건 매수/매도하고자 하는 종목명과 종목코드를 얻을 수 있습니다.

 항상 부자 되시길 바랍니다. 감사합니다.

 

import sys                        # system specific parameters and functions : 파이썬 스크립트 관리
from PyQt5.QtWidgets import *     # GUI의 그래픽적 요소를 제어       하단의 terminal 선택, activate py37_32,  pip install pyqt5,   전부다 y
from PyQt5 import uic             # ui 파일을 가져오기위한 함수
from PyQt5.QtCore import *         # 쓰레드 함수를 불러온다.

################# 부가 기능 수행(일꾼) #####################################
from kiwoom import Kiwoom          # 키움증권 함수/공용 방 (싱글턴)

from Qthread_1 import Thread1      # 계좌평가잔고내역 가져오기
from Qthread_2 import Thread2      # 계좌 관리
from Qthread_3 import Thread3      # 실시간 자동매매 시작



###################################################
form_thirdwindow = uic.loadUiType("ALBA3.ui")[0]

class Thirdwindow(QMainWindow, QWidget, form_thirdwindow):
    def __init__(self):
        super(Thirdwindow, self).__init__()
        self.initUi()
        self.show()

        ### 초기 셋팅 : 분할 매수/매도
        self.textEdit_1.setValue(0)      # 초기 매수 금액
        self.textEdit_2.setValue(0)      # 초기 매수 금액
        self.textEdit_3.setValue(0)      # 초기 매수 금액
        self.textEdit_4.setValue(0)      # 초기 매수 금액
        self.textEdit_5.setValue(0)      # 초기 매수 금액
        self.textEdit_6.setValue(0)      # 초기 매수 금액
        self.textEdit_7.setValue(0)      # 초기 매수 금액
        self.textEdit_8.setValue(0)      # 초기 매수 금액
        self.textEdit_9.setValue(0)      # 초기 매수 금액
        self.textEdit_10.setValue(0)      # 초기 매수 금액
        self.textEdit_11.setValue(0)      # 초기 매수 금액
        self.textEdit_12.setValue(0)      # 초기 매수 금액
        self.textEdit_13.setValue(0)      # 초기 매수 금액
        self.textEdit_14.setValue(0)      # 초기 매수 금액
        self.textEdit_15.setValue(0)      # 초기 매수 금액
        self.textEdit_16.setValue(0)      # 초기 매수 금액

        ########## 더블 스핀 박스 우측정렬 및 소수점 삭제
        self.textEdit_1.setAlignment(Qt.AlignVCenter | Qt.AlignRight)
        self.textEdit_1.setDecimals(0)
        self.textEdit_2.setAlignment(Qt.AlignVCenter | Qt.AlignRight)
        self.textEdit_2.setDecimals(0)
        self.textEdit_3.setAlignment(Qt.AlignVCenter | Qt.AlignRight)
        self.textEdit_3.setDecimals(0)
        self.textEdit_4.setAlignment(Qt.AlignVCenter | Qt.AlignRight)
        self.textEdit_4.setDecimals(0)
        self.textEdit_5.setAlignment(Qt.AlignVCenter | Qt.AlignRight)
        self.textEdit_5.setDecimals(0)
        self.textEdit_6.setAlignment(Qt.AlignVCenter | Qt.AlignRight)
        self.textEdit_6.setDecimals(0)
        self.textEdit_7.setAlignment(Qt.AlignVCenter | Qt.AlignRight)
        self.textEdit_7.setDecimals(0)
        self.textEdit_8.setAlignment(Qt.AlignVCenter | Qt.AlignRight)
        self.textEdit_8.setDecimals(0)
        self.textEdit_9.setAlignment(Qt.AlignVCenter | Qt.AlignRight)
        self.textEdit_9.setDecimals(0)
        self.textEdit_10.setAlignment(Qt.AlignVCenter | Qt.AlignRight)
        self.textEdit_10.setDecimals(0)
        self.textEdit_11.setAlignment(Qt.AlignVCenter | Qt.AlignRight)
        self.textEdit_11.setDecimals(0)
        self.textEdit_12.setAlignment(Qt.AlignVCenter | Qt.AlignRight)
        self.textEdit_12.setDecimals(0)
        self.textEdit_13.setAlignment(Qt.AlignVCenter | Qt.AlignRight)
        self.textEdit_13.setDecimals(0)
        self.textEdit_14.setAlignment(Qt.AlignVCenter | Qt.AlignRight)
        self.textEdit_14.setDecimals(0)
        self.textEdit_15.setAlignment(Qt.AlignVCenter | Qt.AlignRight)
        self.textEdit_15.setDecimals(0)
        self.textEdit_16.setAlignment(Qt.AlignVCenter | Qt.AlignRight)
        self.textEdit_16.setDecimals(0)


        ####키움증권에 멸령을 보낼 수 있는 싱글턴 가져오기
        self.k = Kiwoom()                     # Kiwoom()을 실행하며 상속 받는다. Kiwoom()은 전지적인 아이다.

        ###### EventLoop
        self.detail_account_info_event_loop = QEventLoop()  # 계좌 이벤트루프


        ################# 부가기능 1 : 종목선택하기 새로운 종목 추가 및 삭제
        self.k.kiwoom.OnReceiveTrData.connect(self.trdata_slot)           # 키움서버 데이터 받는 곳
        self.additmelast.clicked.connect(self.searchItem2)                # 종목 추가




    def searchItem2(self):            # 종목추가시 사용됨.
        self.itemName = self.searchItemTextEdit2.toPlainText()
        self.new_code = None
        if self.itemName != "":
            for code in self.k.All_Stock_Code.keys():  # 포트폴리오에 저장된 코드들을 실시간 등록
                # 주식체결 정보 가져오기(틱 데이터) : 현재가, 전일대비, 등락률, 매도호가, 매수호가, 거래량, 누적거래량, 고가, 시가, 저가
                if self.itemName == self.k.All_Stock_Code[code]['종목명']:
                    self.new_code = code

        if self.new_code != "" and self.itemName == "":
            self.new_code = self.searchItemTextEdit3.toPlainText().strip()

            for code in self.k.All_Stock_Code.keys():  # 포트폴리오에 저장된 코드들을 실시간 등록
                if self.new_code == code:
                    self.itemName = self.k.All_Stock_Code[code]['종목명']

 

 

반응형

.link_tit