PYTHON/AUTO TRADE SYSTEM

[자동 매매 시스템 구축하기] 실시간 데이터 얻기 (3) - 실시간 등록하기

  • -

지난 게시글에서 GUI 내에서 종목코드를 입력하고, 해당 종목코드 정보를 얻어서 실시간으로 등록하는 버튼을 생성한 후 넘어왔다. 이번 게시글에서는 특정 버튼을 눌렀을 때   lineEdit()   객체에 입력되어 있는 종목코드 데이터를 얻어서 종목 코드를 바탕으로 실시간으로 등록하는 함수인   def __setrealreg(self, item_code)  함수를 실행하는 코드를 구현할 예정이다. GUI 상 종목코드를 입력하는 lineEdit의 객체 이름은 lineEdit이고, 실시간 등록을 요청하는 버튼(pushButton)의 객체 이름은 pushButton_3이다. 

 

 

버튼의 기능부터 구현해보자.

이전에 GUI 버튼과 함수를 연결하는 코드가   def __init__(self):  내에서 구현해두었던 것을 기억하는가? 앞으로도 생성할 모든 버튼이나 기능들은   def __init__(self):  내에서 구현할 것이니 이 점을 항상 염두에 두셨으면 한다. 앞서 생성한 실시간 등록 버튼의 기능을 수행할 함수의 이름은 버튼의 이름에서 따와서   _pushbtn_3()  로 만들어줄 것이다.
※ Line : 16, 23~24

class tradesystem(QMainWindow, form_class):
    def __init__(self):
        super().__init__()
        self.setupUi(self)  ## GUI 켜기
        self.setWindowTitle("주식 프로그램")  ## 프로그램 화면 이름 설정

        self.kiwoom = QAxWidget("KHOPENAPI.KHOpenAPICtrl.1")  ## OpenAPI 시작
        self.kiwoom.dynamicCall("CommConnect()")  ## 로그인 요청

        self.setrealreg = _df.setrealreg()
        print(self.setrealreg)

        """데이터 요청 구간"""
        self.pushButton.clicked.connect(self.request_opt10016)
        self.pushButton_2.clicked.connect(self.request_opt10080)
        self.pushButton_3.clicked.connect(self._pushbtn_3)

        """이벤트 처리 구간"""
        self.kiwoom.OnReceiveTrData.connect(self.receive_trdata)  ## 데이터 조회 요청 처리 함수
        self.kiwoom.OnEventConnect.connect(self.process_login)    ## 로그인 반환값 처리 함수
        

    def _pushbtn_3(self):
        pass

    def __setrealreg(self, item_code):
        if len(self.setrealreg['item_code']) == 0:
            self.add_to_setrealreg(item_code)
            return self.kiwoom.dynamicCall("SetRealReg(QString, QString, QString, QString)", ["0101", item_code, '10', 0])
        else:
            self.add_to_setrealreg(item_code)
            return self.kiwoom.dynamicCall("SetRealReg(QString, QString, QString, QString)", ["0101", item_code, '10', 1])


    def add_to_setrealreg(self, item_code):
        idx = len(self.setrealreg)
        self.setrealreg.loc[idx, 'item_code'] = item_code

 

 

이제 함수의 기능을 구현해보자.

앞서 pushButton_3이라는 이름을 가진 객체(버튼)가 눌렸을 때   def _pushbtn_3(self이라는 함수로 연결되도록 설정했으니, 해당 함수 내에서는 lineEdit 값을 얻어온 후에   def __setrealreg(self, item_code)  함수로 해당 종목코드 데이터를 전달해주면 된다. lineEdit에 입력돼 있는 값을 얻어오는 방법은   text()  메서드이다.
※ Line : 1, 2

    def _pushbtn_3(self):
        item_code = self.lineEdit.text()
        self.__setrealreg(item_code)

 

 


728x90

 

 

이제 실시간 등록을 하는 모든 기능이 구현되었으니, 마지막으로 구현할 부분은 실시간 등록이 이루어진 시점에서 실시간 등록이 이루어진 종목코드의 정보들을 입력한   self.setrealreg  라는 변수 내에 데이터가 정확하게 입력됐는지만 확인하면 된다. 그러면 정상적으로 등록됐는지를 확인하기 위해서는 실시간 등록을 하는 함수 내에서 실시간 등록이 모두 이루어진 이후에 해당 변수를 출력해주면 될 것이다.
※ Line : 4

    def _pushbtn_3(self):
        item_code = self.lineEdit.text()
        self.__setrealreg(item_code)
        print(self.setrealreg)

    def __setrealreg(self, item_code):
        if len(self.setrealreg['item_code']) == 0:
            self.add_to_setrealreg(item_code)
            return self.kiwoom.dynamicCall("SetRealReg(QString, QString, QString, QString)", ["0101", item_code, '10', 0])
        else:
            self.add_to_setrealreg(item_code)
            return self.kiwoom.dynamicCall("SetRealReg(QString, QString, QString, QString)", ["0101", item_code, '10', 1])

    def add_to_setrealreg(self, item_code):
        idx = len(self.setrealreg)
        self.setrealreg.loc[idx, 'item_code'] = item_code

 

이제 코드를 실행해서 lineEdit 내에 종목코드를 입력한 후 실시간 등록 버튼을 누르게 되면 아래와 같은 데이터가 출력된다는 점을 확인할 수 있다.

 

만약 여기서 또 하나의 종목을 추가한다고 했을 때, self.setrealreg 변수 내에 기존에 입력되어 있던 005930이라는 종목의 데이터가 삭제되지 않고 추가되어야 하는 만큼, 삼성전자(005930)에 이어 LG전자(066570)도 실시간으로 등록해보도록 하자.

 

차례대로 000020부터 000040, 000060까지 모두 실시간으로 등록해본 결과 아래의 사진과 같이 self.setrealreg 변수 안에 기존에 실시간으로 등록한 종목코드부터 새롭게 추가한 종목코드까지 순서대로 착착 입력되고 있으며 기존의 데이터에는 영향이 없다는 걸 확인할 수 있다.

 

 

 


728x90
반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.