본문 바로가기

정리된 글/코딩

[python][자동매매] 강의가 끝나고, 머릿속 정리 2. Login

반응형

kiwoom.py의 순서대로 다음 코드를 보자.

 

    def get_ocx_instance(self):
        self.setControl("KHOPENAPI.KHOpenAPICtrl.1")

    def event_slots(self):
        self.OnEventConnect.connect(self.login_slot)
        self.OnReceiveTrData.connect(self.trdata_slot)

    def real_event_slots(self):
        self.OnReceiveRealData.connect(self.realdata_slot)
        self.OnReceiveChejanData.connect(self.chejan_slot)

 

get_ocx_instance(self)는 KHOpenAPI를 자동으로 실행시키는 역할을 한다.

아래의 set.Control대로 불러온다.

event_slots(self)는 이름그대로 event Slot이다.

 self.OnEventConnect.connect(self.login_slot)를 통해 login slot과 연결되기도 하며,
 self.OnReceiveTrData.connect(self.trdata_slot)를 통해 trdata_slot과 연결되기도 한다.

복잡하긴한데, Slot은 그냥 함수라고 생각하자. 상기 slot들은 후술한다!! 

real_event_slots(self)는 위의 event_slot(self)를 real time 거래를 할 때의 버전으로 생각하면 된다.

기능은 동일하지만, 실시간 체결정보 등의 signal을 받아 동작하는 slot이다.

 

 

이어서 가보자!

 

def signal_login_commConnect(self):
    self.dynamicCall("CommConnect()")
   # self.login_event_loop = QEventLoop()
    self.login_event_loop.exec_()

def login_slot(self, errCode):
    print(errors(errCode))

    self.login_event_loop.exit()#d이거 뭔지 확인

signal_login_commConnect(self)는 login event loop가 시작되는곳이다.

login signal을 받을때까지 event loop를 돌린다.

login_slot(self, errCode)는 login_slot, 즉 login 결과를 받는 곳이다.

결과는 errCode라는 곳에서 오는데...

생각해보니 errCode를 적지 않았다.

errCode.py는 별도로 불러오는 모듈처럼 구성돼있는데, 이 녀석의 생김새만 보는 것으로 마무리하자.

 

def errors(err_code):
    err_dic={0: ('OP_ERR_NONE','정상처리'),
               -10: ('OPP_ERR_FAIL','실패'),
               -100: ('OPP_ERR_LOGIN','사용자정보교환실패'),
               -101: ('OPP_ERR_CONNECT','서버접속실패'),
               -102: ('OPP_ERR_VERSION','버전처리실패'),
               -103: ('OPP_ERR_FIREWALL','개인방화벽실패'),
               -104: ('OPP_ERR_MEMORY','메모리보호실패'),
               -105: ('OPP_ERR_INPUT','함수입력값오류'),
               -106: ('OPP_ERR_SOCKET_CLOSED','통신연결종료'),
               -200: ('OPP_ERR_SISE_OVERFLOW','시세조회과부하'),
               -201: ('OPP_ERR_RQ_STRUCT_FAIL','전문작성초기화실패'),
               -202: ('OPP_ERR_RQ_STRING_FAIL','전문작성입력값오류'),
               -203: ('OPP_ERR_NO_DATA','데이터없음'),
               -204: ('OPP_ERR_OVER_MAX_DATA','조회가능한종목수초과'),
               -205: ('OPP_ERR_DATA_RCV_FAIL','데이터수신실패'),
               -206: ('OPP_ERR_OVER_MAX_FID','조회가능한FID수초과'),
               -207: ('OPP_ERR_REAL_CANCEL','실시간해제오류'),
               -300: ('OPP_ERR_ORD_WRONG_INPUT','입력값오류'),
               -301: ('OPP_ERR_ORD_WRONG_ACCTNO','계좌비밀번호없음'),
               -302: ('OPP_ERR_OTHER_ACC_USE','타인계좌사용오류'),
               -303: ('OPP_ERR_MIS_2BILL_EXC','주문가격이20억원을초과'),
               -304: ('OPP_ERR_MIS_5BILL_EXC','주문가격이50억원을초과'),
               -305: ('OPP_ERR_MIS_1PER_EXC','주문수량이총발행주수의1%초과오류'),
               -306: ('OPP_ERR_MIS_3PER_EXC','주문수량은총발행주수의3%초과오류'),
               -307: ('OPP_ERR_SEND_FAIL','주문전송실패'),
               -308: ('OPP_ERR_ORD_OVERFLOW','주문전송과부하'),
               -309: ('OPP_ERR_MIS_300CNT_EXC','주문수량300계약초과'),
               -310: ('OPP_ERR_MIS_500CNT_EXC','주문수량500계약초과'),
               -340: ('OPP_ERR_ORD_WRONG_ACCTINFO','계좌정보없음'),
               -500: ('OPP_ERR_SYMCODE_EMPTY','종목코드없음'),
               }
    result = err_dic[err_code]

    return(result)

 

반응형