PYTHON/AUTO TRADE SYSTEM

[자동 매매 시스템 구축하기] 주문 정보 관리하기 (2) - chejandata 이벤트 처리하기

  • -

지난 게시글에서 OnReceiveChejanData 이벤트가 발생했을 때 def receive_chejandata 함수로 연결되도록 하는 기능까지 구현했으며, 이번 게시글에서는 해당 함수 내에서 어떤 로직의 코드를 구현해야 하는지에 대해 살펴보자.

 

 

Gubun에 따른 데이터 구분하기

def receive_chejandata(self, Gubun, ItemCnt, FidList):
    """
    Gubun(string) - 0:주문체결통보, 1:국내주식잔고통보, 4:파생상품잔고통보
    FidList(string) - 데이터 구분은 ;이다.
    """
    pass

 

위의 코드에서 확인할 수 있듯이, Gubun이라는 것은 0일 경우 주문체결통보를 의미하며 1일 경우 국내주식 잔고통보를 의미한다. 자세한 설명은 넘어가고, 일단 Gubun의 값에 따라 데이터를 구분할 수 있는 조건문을 추가해보자.

def receive_chejandata(self, Gubun, ItemCnt, FidList):
    """
    Gubun(string) - 0:주문체결통보, 1:국내주식잔고통보, 4:파생상품잔고통보
    FidList(string) - 데이터 구분은 ;이다.
    """
    if Gubun == "0":
        pass

    elif Gubun == "1":
        pass

 

 

데이터를 얻어와보자.

이제 Gubun == 0인 경우 우리에게 필요한 원주문번호 등과 같은 다양한 데이터들을 얻어와야 하는데, 우리가 얻어올 수 있는 데이터의 목록에는 어떤 것들이 있을까? 이 역시 개발 가이드를 살펴보면 친절하게 알려주고 있다.

여기서 각각의 데이터는 FID 번호를 갖고 있는데, 이 FID 번호는   GetChejanData()   함수를 통해 사용하는 것이다. 그렇다면   GetChejanData()   함수는 어떻게 생겼을까? 아래의 사진을 살펴보면 알 수 있듯이, Fid 데이터 하나만 인자로 요구하고 있으며 반환값 역시 해당 FID 번호에 해당하는 데이터만을 반환한다.

 

그렇다면   GetChejanData   함수 역시 다른 함수와 마찬가지로 하나의 캡슐처럼 제작해보자. 
※ Line : 12, 13

def receive_chejandata(self, Gubun, ItemCnt, FidList):
    """
    Gubun(string) - 0:주문체결통보, 1:국내주식잔고통보, 4:파생상품잔고통보
    FidList(string) - 데이터 구분은 ;이다.
    """
    if Gubun == "0":
        pass

    elif Gubun == "1":
        pass

def __getchejandata(self, fid):
    return self.kiwoom.dynamicCall("GetChejanData(int)", fid)

 

 


728x90

 

 

데이터 얻어오기

이제   def __getchejandata()   함수를 제작했으니, 해당 함수에 FID 번호를 전달한 후 결과 데이터를 얻어오면 Gubun == 0인 경우의 모든 데이터를 얻어서 사용할 수 있는 상황이 된다. 그럼 우리는 어떤 데이터들을 얻어올 것인가? 모든 데이터를 얻어올 필요는 없겠지만, 기본적으로 얻어와야 하는 데이터들만 일단은 제작해보도록 하자. 불러온 데이터는 아래의 코드와 같다.
※ Line : 7~24

def receive_chejandata(self, Gubun, ItemCnt, FidList):
    """
    Gubun(string) - 0:주문체결통보, 1:국내주식잔고통보, 4:파생상품잔고통보
    FidList(string) - 데이터 구분은 ;이다.
    """
    if Gubun == "0":
        accno = self.__getchejandata("9201").strip()        ## 계좌번호
        orderno = self.__getchejandata("9203").strip()      ## 주문번호
        item_code = self.__getchejandata("9001").strip()    ## 종목코드
        order_gubun = self.__getchejandata("912").strip()   ## 주문 구분(JJ:주식주문, FJ:선옵, JG:주식잔고, FG:선옵잔고)
        order_status = self.__getchejandata("913").strip()  ## 주문 상태
        item_name = self.__getchejandata("302").strip()     ## 종목명
        order_quan = self.__getchejandata("900").strip()    ## 주문 수량
        order_pri = self.__getchejandata("901").strip()     ## 주문 가격
        remained_quan = self.__getchejandata("902").strip() ## 미체결량
        signed_vol = self.__getchejandata("903").strip()    ## 체결대금
        origin_ordno = self.__getchejandata("904").strip()  ## 원주문번호
        order_bns = self.__getchejandata("905").strip()     ## 주문 구분(+:매수, -:매도)
        trade_gubun = self.__getchejandata("906").strip()   ## 매수 구분(시장가, 지정가, 보통 등)
        signed_num = self.__getchejandata("909").strip()    ## 체결 번호
        signed_pri = self.__getchejandata("910").strip()    ## 체결가
        signed_quan = self.__getchejandata("911").strip()   ## 체결량
        today_com = self.__getchejandata("938").strip()     ## 당일매매 수수료
        today_tax = self.__getchejandata("939").strip()     ## 당일 매매 세금

    elif Gubun == "1":
        pass

 

이제 우리는 특정 주문이 접수됐을 때 접수된 주문으로 인해 발생한 주문번호를 얻어올 수 있게 되었다. 그렇다면 원주문번호가 정확히 어떠한 구조로 발생하는지 그리고 어떻게 사용할 수 있는지에 대해 이해해야만 정확하게 동작하는 코드를 작성할 수 있을 것이다. 

원주문번호가 사용되는 방법은 위와 같이 단순하다. 즉, 특정 주문이 접수되면 해당 주문으로 인해 주문번호가 발생하게 되며 그 원주문번호를 따로 저장하고 있다가 정정 주문을 접수할 때 그 원주문번호를 전달해서 정정 주문을 접수할 수 있다. 물론 한 번의 주문이 실행된 이후 따로 주문을 정정할 일이 전혀 없는 알고리즘을 사용한다면 이 원주문번호 데이터 역시 불필요하다. 하지만 모든 알고리즘은 고정된 하나의 로직에 따라 수행되는 경우는 극히 드물기 때문에, 결국에는 원주문번호를 얻어서 정정 주문을 접수해야 하는 일이 발생할 수밖에 없다.

그렇다면 기존의 주문에 대해 정정 주문을 접수하고자 할 때, 그 외의 다른 정보 없이 단순하게 원주문번호만 전달해주면 정정 주문은 정상적으로 동작할까? 이 질문에 대한 "그렇다."이다. 원주문번호라는 데이터는 말 그대로 하나의 주문 그 자체를 의미하는 데이터이기 때문에, 해당 주문번호만 전달해주면 그 주문번호로 접수된 주문에 대한 주문 취소나 정정 주문 등과 같은 모든 권한을 행사할 수 있게 된다. 

 

이제 다음 게시글에서는 이러한 원주문번호를 어떻게 관리해야 하는지에 대해 살펴보도록 하자.

 

 


728x90
반응형
Contents

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

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