주식자동매매 18강. 계좌평가잔고내역요청(6), Tr 데이터 받아오기(싱글데이터)
본문 바로가기

주식 자동매매 강의/기초반(모든 코딩의 뿌리)

주식자동매매 18강. 계좌평가잔고내역요청(6), Tr 데이터 받아오기(싱글데이터)

반응형

16강에서 키움 서버로 전송한 계좌평가 잔고내역 요청 주문을 15강에서 구현한 slot에 어떻게 수신하는지 알아보겠습니다. 복습하는 차원에서 KOA Studio를 먼저 살펴보겠습니다.

 

[유튜브 강의, 링크]와 같이 보시면 많은 도움이 되실 겁니다.

1. Tr슬롯으로 받을 수 있는 데이터 목록 알아보기

KOA Studio를 살펴보면 15강에서 말씀 드렸듯이 Tr 슬롯으로 넘어온 데이터는 크게 싱글 데이터와 멀티 데이터가 존재합니다. 싱글 데이터는 계좌의 종합 상태이며, 멀티 데이터는 계좌의 종목 하나하나의 상태를 나타냅니다.

KOA SUTIO 확인
KOA SUTIO 확인

2. 싱글데이터 받아오기

(1) def trdata_slot 구성하기 : 이 슬롯으로 우리가 주문한 모든 데이터들이 모이게 됩니다. 다양한 주문을 구분하기 위해서 화면번호/사용자 구분명/TR이름을 비교하게 됩니다. 그리고 sPrevNext를 이용해 멀티 데이터가 30개를 넘는지 확인합니다. 만약 우리 계좌에 35개 이상의 종목이 존재하면 2라는 숫자가 넘어와 30개 이상이라고 알리게 됩니다.

 

  ◈ BSTR sScrNo,   // 화면번호
   BSTR sRQName,  // 사용자 구분명
  ◈ BSTR sTrCode,  // TR이름
  ◈ BSTR sPrevNext //다음이 이는지 

싱글데이터 코드
싱글데이터 코드

  ◈ if sRQName == "계좌평가잔고내역요청" 일 때 아래 코드가 실행되라는 의미입니다.

 

(2) column_head =.... 이 부분은 19강에서 심층적으로 다루겠습니다. 우리가 받아온 데이터를 GUI에 출력해야 하며, 이때 표로 출력할 예정입니다. 그러기 위해서는 테이블 위젯을 사용해야 하며, 이를 어떻게 구성하는지에 대한 설명입니다.

 

(3) 총 매입금액/총평가금액/추정 예탁자산/총평가손익 금액/총 수익률(%) 데이터 가져오기

  ◈ int/float : int는 정수(소수점이 없는 수), float은 부동 소수점(소수점이 있는 수)을 뜻합니다. 예를 들어 3% 수익을 나타내고 싶으면 int, 3.14%를 나타내고 싶으면 float을 사용하시면 됩니다.

  ◈ self.k를 이용해 키움 함수(클래스)를 사용할 준비를 합니다.

  ◈ kiwoom.dynamicCall을 이용해 키움 서버에 특정 메시지를 전송합니다.

  ◈ GetCommData를 이용해 "계좌평가 잔고내역 요청"으로 들어오는 데이터 중 "총 매입금액/총평가금액/추정 예탁자산/총평가손익 금액/총 수익률(%)을 받아옵니다. 이때, 총 수익률(%)은 float을 사용하여 조금 더 정밀하게 계좌를 확인합니다.

 

GetCommData
GetCommData

  ◈ 각각의 데이터를 totalBuyingPrice~total_profit_loss_rate에 저장합니다.(인스턴스화 합니다.)

 

반응형

3. 요약 및 전체 코드

  키움 써버에 특정 명령을 요청하면 반드시 Tr 슬롯에 요청한 데이터가 수신됩니다. 만약 상당히 많은 명령을 요청한 경우 명령의 구분 방법은 " sRQName,  // 사용자 구분명"입니다. 그리고 TR에서 얻어 오려는 출력 항목 이름은 KOA Studio와 동일하게 적어주셔야 하며, 입력 값들은 아래 코드와 같습니다.

반응형
def trdata_slot(self, sScrNo, sRQName, sTrCode, sRecordName, sPrevNext):

    if sRQName == "계좌평가잔고내역요청":

        column_head = ["종목번호", "종목명", "보유수량", "매입가", "현재가", "평가손익", "수익률(%)"]
        colCount = len(column_head)
        rowCount = self.k.kiwoom.dynamicCall("GetRepeatCnt(QString, QString)", sTrCode, sRQName)
        self.parent.stocklistTableWidget_2.setColumnCount(colCount)                 # 행 갯수
        self.parent.stocklistTableWidget_2.setRowCount(rowCount)                    # 열 갯수 (종목 수)
        self.parent.stocklistTableWidget_2.setHorizontalHeaderLabels(column_head)   # 행의 이름 삽입

        self.rowCount = rowCount

        print("계좌에 들어있는 종목 수 %s" % rowCount)

        totalBuyingPrice = int(self.k.kiwoom.dynamicCall("GetCommData(QString, QString, int, QString)", sTrCode, sRQName, 0, "총매입금액"))
        currentTotalPrice = int(self.k.kiwoom.dynamicCall("GetCommData(QString, QString, int, QString)", sTrCode, sRQName, 0, "총평가금액"))
        balanceAsset = int(self.k.kiwoom.dynamicCall("GetCommData(QString, QString, int, QString)", sTrCode, sRQName, 0, "추정예탁자산"))
        totalEstimateProfit = int(self.k.kiwoom.dynamicCall("GetCommData(QString, QString, int, QString)", sTrCode, sRQName, 0, "총평가손익금액"))
        total_profit_loss_rate = float(self.k.kiwoom.dynamicCall("GetCommData(String, String, int, String)", sTrCode, sRQName, 0, "총수익률(%)"))

 

19강 바로가기 : GUI 중 QTableWidget 사용법 알아보기(멀티데이터 받아오기 위해)

반응형

.link_tit