더북(TheBook)

이름은 order고 이 딕셔너리는 종목 코드를 키(key)로 하고 주문 정보를 다시 딕셔너리로 만들어 값(value)으로 저장합니다. 따라서 order는 딕셔너리에 딕셔너리를 저장한 형태입니다(이에 대해서는 다음에 다루겠습니다).

추가로 체결이 완료되어 잔고로 이동한 종목들을 저장할 딕셔너리 이름은 balance로 정하고, 마찬가지로 종목 코드를 키로 하고 매수 정보를 다시 딕셔너리로 만들어 값으로 저장하겠습니다.

준비를 마쳤으면 _on_chejan_slot 함수의 전체 코드를 살펴보겠습니다. Kiwoom.py 파일의 _on_receive_msg 함수에 이어서 다음 코드를 작성합니다.

Kiwoom.py

(...)
def _on_chejan_slot(self, s_gubun, n_item_cnt, s_fid_list):
        print("[Kiwoom] _on_chejan_slot is called {} / {} / {}".format(s_gubun, n_item_cnt, s_fid_list))

        for fid in s_fid_list.split(";"): ------ 9201;9203;9205;9001;912;913;302;900;901;처럼 전달되는 fid 리스트를 ‘;’ 기준으로 구분 
            if fid in FID_CODES:
                code = self.dynamicCall("GetChejanData(int)", '9001')[1:] ------ 종목 코드를 얻어 와 A007700처럼 앞자리에 오는 문자를 제거 
                data = self.dynamicCall("GetChejanData(int)", fid) ------ fid를 사용하여 데이터 얻어 오기( fid:9203을 전달하면 주문 번호를 수신하여 data에 저장) 
                data = data.strip().lstrip('+').lstrip('-') ------ 데이터에 +, -가 붙어 있으면( +매수, -매도) 제거 
                if data.isdigit(): ------ 수신된 문자형 데이터 중 숫자인 항목( 매수가)을 숫자로 바꿈 
                    data = int(data)
                item_name = FID_CODES[fid] ------ fid 코드에 해당하는 항목(item_name)을 찾음( fid=9201 > item_name=계좌번호) 
                print("{}: {}".format(item_name, data)) ------ 얻어 온 데이터 출력( 주문 가격: 37600)
                if int(s_gubun) == 0: ------ 접수/체결(s_gubun=0)이면 self.order, 잔고 이동이면 self.balance에 값 저장

                    if code not in self.order.keys(): ------ 아직 order에 종목 코드가 없다면 신규 생성하는 과정 
                        self.order[code] = {}

                    self.order[code].update({item_name: data}) ------ order 딕셔너리에 데이터 저장 
                elif int(s_gubun) == 1:
                    if code not in self.balance.keys(): ------ 아직 balance에 종목 코드가 없다면 신규 생성하는 과정 
                        self.balance[code] = {}

                    self.balance[code].update({item_name: data}) ------ order 딕셔너리에 데이터 저장 

        if int(s_gubun) == 0: ------ s_gubun 값에 따라 저장한 결과 출력 
            print("* 주문 출력(self.order)")
            print(self.order)
        elif int(s_gubun) == 1:
            print("* 잔고 출력(self.balance)")
            print(self.balance)
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.