AUTO TRADE/[대신증권] CYBOS PLUS

대신증권 CYBOS PLUS 프로그램 구현 (6) - 전종목 종목코드 조회하기 ②

프로그램 구현 목표

  • 프로그램 로직 생각해보기
  • 전체 종목코드 조회 함수 캡슐화 완성하기 (1) : LineEdit 클래스 활용
  • 전체 종목코드 조회 함수 캡슐화 완성하기 (2) : ComboBox 클래스 활용

 

프로그램 로직 생각해보기

이전 게시글에서 구현했던 `def _GetStockListByMarket(self)` 함수를 통해 데이터를 요청하는 구조에 있어서 우리는 물론 여러 가지 구조의 코드를 구현할 수 있긴 하겠지만, 대략적으로 요약해보자면 기본적으로 그 구조는 해당 함수에 전달할 시장 구분 데이터를 어떠한 방식으로 얻어올 것인지에 따라 아래와 같이 요약할 수 있을 것이다. 

  1. 시장 구분 데이터를 별도로 전달받지 않고 함수 내부에서 직접 입력하여 데이터를 조회하고 종목코드 함수를 반환
  2. 시장 구분 데이터를 LineEdit 클래스 또는 ComboBox 클래스를 통해 종목코드 목록을 조회할 때마다 요청하기 

다만 우리가 구현하고자 하는 기능은 시장 구분과 무관하게 코스피와 코스닥에 상장되어 있는 모든 종목코드를 반환받는 함수를 구현하는 것이 목표이기 때문에 1번 방식이 아닌 2번 방식으로 조회하더라도 LineEdit나 ComboBox 클래스 내부에서 모든 종목을 조회하도록 하는 내용을 별도로 인식할 수 있게끔 전달해주면 된다. 그렇다면 기본적으로 전체 종목코드를 조회하는 함수는 아래와 같은 구조를 갖고 있을 것이다. 다만 아래와 동일한 구조로 데이터를 요청하는 데에는 다양한 방식이 있기 때문에 어떠한 방식으로 기능을 구현할지는 전적으로 개발자에게 달려있다.

## Boss.py ##
    def _GetStockListByMarket(self):
        kospi = self.codemgr._GetStockListByMarket(market_kind_code=1)
        kosdaq = self.codemgr._GetStockListByMarket(market_kind_code=2)
        itemcode_list = kospi + kosdaq

아래부터는 두 가지 방법으로 코스피와 코스닥에 상장된 종목을 조회하는 함수를 구현해볼 예정이다. 첫 번째 방법은 QLineEdit 클래스를 활용하는 방법이고, 두 번째 방법은 QComboBox 클래스를 활용하는 방법이다.

 

 

전체 종목코드 조회 함수 캡슐화 완성하기 (1) : LineEdit 클래스 활용

이제 예전에 만들던 main.ui 파일을 다시 열어서 왼쪽에 있는 LineEdit을 끌고와보도록 하자. 그 후 아래 오른쪽의 객체 탐색기를 보면 해당 객체의 이름이 `lineEdit`으로 되어 있음을 알 수 있으며 클래스는 `QLineEdit`이다.

`QLineEdit` 클래스는 가장 대표적으로 `setText()` 메서드와 `text()` 메서드가 가장 많이 활용되는데, 메서드의 이름만 봐도 알겠지만 `setText()`는 lineEdit에 텍스트를 입력하는 메서드이고, `text()` 메서드는 lineEdit에 입력되어 있는 텍스트를 가져오는 메서드이다. 이쯤되면 눈치챘겠지만, 우리는 lineEdit에 1이나 2와 같은 `market_kind_code`를 입력해준 후 종목코드 조회 버튼(`pushButton`)을 누르면 그 데이터를 가져와서 `def _GetStockListByMarket()` 함수의 인자로 전달해주는 것이다. 아래의 코드를 확인해보도록 하자.

## Boss.py ##
    def _GetStockListByMarket(self):
        market_kind = self.lineEdit.getText()
        itemcode_list = self.codemgr._GetStockListByMarket(market_kind_code=market_kind)
        print(f"[요청한 데이터:{market_kind}] 종목코드:{itemcode_list}")

이제 프로그램을 실행시킨 후 lineEdit에 1을 입력한 후 종목코드 조회 버튼을 누르면 코스피에 상장된 종목코드 목록을 모두 조회할 수 있다. 더 나아가, 프로그램을 종료하지 않고 lineEdit에 2를 입력한 후 종목코드 조회 버튼을 누르면 코스닥에 상장된 종목코드 목록을 모두 조회할 수 있다. 

코스피에 상장된 종목을 조회하는 모습

 

 


반응형
728x90

 

 

전체 종목코드 조회 함수 캡슐화 완성하기 (2) : ComboBox 클래스 활용

다음으로 활용할 클래스는 `QComboBox`이다. 아래의 이미지만 봐도 알겠지만 우리가 원하는 데이터를 넣어놓고 그 데이터가 어떤 데이터인지에 따라 각기 다른 코드가 동작하도록 할 수 있다.

이제 콤보박스를 더블클릭하여 아래와 같이 콤보박스의 목록을 추가해주도록 하자.

`QComboBox` 클래스의 주된 메서드는 바로 `currentindex()` 메서드인데, 이는 우리가 바로 앞에서 콤보 상자 편집을 통해 입력해두었던 데이터들의 인덱스(index) 번호를 가져오는 메서드이다. 즉, ComboBox 내에서 "전체 종목"은 0, "코스피"는 1, "코스닥"은 2, "K-OTC"는 3, "KRX"는 4, "KONEX"는 5라는 인덱스 번호를 갖는다는 것이다. 여기서 인덱스 번호는 원래 첫 번째 순서가 0이라는 인덱스를 갖고 시작하게 되는데, "코스피" 데이터의 인덱스가 1이 되도록 하기 위해 "전체종목" 데이터의 인덱스를 0으로 넣어주었다. (지난 게시글에서 살펴 보았듯이, 코스피에 상장된 종목코드를 조회하기 위해서는 `def _GetStockListByMarket()` 함수의 인자로 1을 전달해주어야 하며, 0은 아무런 기능도 수행하지 않는다.)

따라서 `self.comboBox.currentIndex()`라는 코드를 통해 QComboBox 클래스 내에서 활성화되어 있는 데이터의 인덱스 번호를 `market_kind`라는 변수안에 저장한 후 `print(market_kind)` 구문을 통해 인덱스 번호를 확인해보자. 

## Boss.py ##
     def _GetStockListByMarket(self):
        market_kind = self.comboBox.currentIndex()
        print(market_kind)
        itemcode_list = self.codemgr._GetStockListByMarket(market_kind_code=market_kind)
        print(f"[요청한 데이터:{market_kind}] 종목코드:{itemcode_list}")

이제 프로그램을 다시 실행시킨 후, comboBox 내에 있는 데이터를 "전체종목"으로 놓고 종목코드를 조회해보자. 그러면 인자값이 0으로 표시되면서 어떠한 종목코드도 조회하지 않는 결과를 확인할 수 있다. 다음으로, comboBox를 "코스피"로 놓고 종목코드 조회 버튼을 눌러보면 우측 하단과 같이 데이터를 올바르게 가져오는 것을 확인할 수 있다. 다른 데이터들도 직접 확인해보면 정상적으로 동작하고 있다는 것을 어렵지 않게 확인할 수 있다.

이제 `QComboBox` 클래스가 정상적으로 작동하는 것을 확인했으니, 콤보박스의 데이터가 "전체종목"의 경우에만 별도의 기능을 수행하도록 코드를 추가적으로 건드려줘야 한다. 즉, `market_kind`가 0인 경우에는 코스피와 코스닥을 함께 조회하도록 하는 코드를 만들어주는 것이다. 더 나아가, `market_kind`가 0이 아닌 경우에는 정상적으로 동작하고 있으므로 조건문을 통해 `self.comboBox`의 `.currentIndex()`를 그대로 사용하도록 하면 된다.

## Boss.py ##
    def _GetStockListByMarket(self):
        if self.comboBox.currentIndex() == 0:
            pass
        else:
            market_kind = self.comboBox.currentIndex()
            itemcode_list = self.codemgr._GetStockListByMarket(market_kind_code=market_kind)
            print(f"[요청한 데이터:{market_kind}] 종목코드:{itemcode_list}")

이제 `self.comboBox.currentIndex()`의 값이 0인 경우에는 어떠한 코드가 필요할까 ? 바로 `def _GetStockListByMarket()` 함수의 인자로 각각 1(코스피)과 2(코스닥)를 전달한 후에 결과값으로 반환되는 종목코드 목록을 합쳐주면 된다. 2024년 8월 26일 기준으로 코스피 종목의 개수는 2,239개이고 코스닥 종목의 개수는 1,752개로 도합 3,991개 종목이 상장되어 있는데, `len()` 메서드를 통해 변수 내에 있는 데이터의 개수를 출력하도록 하여 종목 코드가 올바르게 조회됐는지 확인해보도록 하자.
※ Line: 3~7

## Boss.py ##
    def _GetStockListByMarket(self):
        if self.comboBox.currentIndex() == 0:
            kospi = self.codemgr._GetStockListByMarket(1)
            kosdaq = self.codemgr._GetStockListByMarket(2)
            itemcode_list = kospi + kosdaq
            print(f"코스피:{len(kospi)} / 코스닥:{len(kosdaq)} / 전체:{len(itemcode_list)}")
            print(f"종목코드:{itemcode_list}")
        else:
            market_kind = self.comboBox.currentIndex()
            itemcode_list = self.codemgr._GetStockListByMarket(market_kind_code=market_kind)
            print(f"[요청한 데이터:{market_kind}] 종목코드:{itemcode_list}")

▶ 실행 결과 확인하기

더보기

[통신결과:1] 서버와의 연결에 성공했습니다.
로그인되어 있습니다.
[인자값:1] 종목코드 목록:('A000020', 'A000040', 'A000050', · · · (이하 생략)

[인자값:2] 종목코드 목록:('A000250', 'A000440', 'A001000', · · · (이하 생략)
코스피:2239 / 코스닥:1752 / 전체:3991
종목코드:('A000020', 'A000040', 'A000050',· · · (이하 생략)

 

 


728x90
반응형
Contents

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

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