def request(self, input, output, isNext=False): if not input: input = {"InBlock": {}} if not isNext: self.query.reset() self._parseInput(input) self._parseOutput(output) Query.sleep() #input setting for k,v in self.input.items(): self.query.SetFieldData(self.type + self.inputName, k, 0, v) #call request Query.resetTime() if hasattr(self, "service"): # log.info(" - Call requestService") requestCode = self.query.RequestService(self.type, self.service) else: # log.info(" - Call request (isNext:%s)" % isNext) requestCode = self.query.Request(isNext) if requestCode < 0: log.critical(xacom.parseErrorCode(requestCode)) return while self.query.status == 0: pythoncom.PumpWaitingMessages() time.sleep(0.1) #output setting for k,v in self.output.items(): if isinstance(v, DataFrame): #occur df =v if self.compress: self.query.Decompress(self.type + k) startIndex = len(df) for p in range(0,self.query.GetBlockCount(self.type + k)): for col in list(df.columns.values): df.set_value(p + startIndex, col, self.query.GetFieldData(self.type + k, col, p)) else: for col in v.keys(): v[col] = self.query.GetFieldData(self.type + k, col, 0) if self.query.IsNext: self.input[col] = v[col] self.query.status = 0 if self.query.IsNext: if self.callNext: return self.request(input, output, True) else: # log.debug(">>>>> [Query] 결과(callNext=False):%s" % self.output) return self.output else: # log.debug(">>>>> [Query] 결과(callNext=True):%s" % self.output) return self.output
def login(self, server, user): self.session.reset() self.session.ConnectServer(server["address"], server["port"]) self.session.Login(user["id"], user["passwd"], user["certificate_passwd"], server["type"], 0) while self.session.code == -1: pythoncom.PumpWaitingMessages() time.sleep(0.1) if self.session.code == "0000": log.info("로그인 성공") return True else: log.critical("로그인 실패 : %s" % xacom.parseErrorCode(self.session.code)) return False
def login(self, **kwargs): if "certification_passwd" not in kwargs or "account_pass" not in kwargs: log.info("certification_passwd or account_pass are not given." "Trying demo server...") self.login_demo(**kwargs) else: self.login_real(**kwargs) while self.session.code == -1: pythoncom.PumpWaitingMessages() time.sleep(0.1) if self.session.code == "0000": log.info("로그인 성공") return True else: log.critical( "로그인 실패 : %s" % xacom.parseErrorCode(self.session.code)) return False
def request(self, input, output, stopCond=[], isNext=False): """TR을 요청한다. :param input: TR의 input block 정보 :type input: object { "InBlock" : { ... } } :param output: TR의 output block 정보. output block을 여러개가 존재할 수 있으며, DataFrame타입일 경우, occur 데이터를 반환한다. :type output: object { "OutBlock" : DataFrame or tuple, "OutBlock1" : DataFrame or tuple} } :param isNext: 연속 조회를 사용하기 위한 내부 파라미터로서 직접 사용하지 않는다. :param stopCond: stop condition. 연속 조회시 언제 stop할지 조건을 넣는다. :return: output으로 지정한 형태로 값이 채워져서 반환된다. :rtype: object .. note:: input 키값이 "Service"인 경우, RequestService 로 요청할 수 있다. 예) 종목검색(씽API용), ChartIndex(차트지표데이터 조회) TR .. warning:: 절대 개발자가 isNext값을 지정하지 않는다. :: Query("t8407").request({ "InBlock" : { "nrec" : 2, "shcode" : "".join(["005930","035420"]) } },{ "OutBlock1" : DataFrame(columns=("shcode","hname","price","open","high", "low","sign","change","diff","volume")) }) # 반환값 { # output에서 지정한 DataFrame에 row값이 채워진 DataFrame이 반환된다. "OutBlock1" : DataFrame } Query("t1101", False).request({ "InBlock" : { "shcode" : "005930" } },{ "OutBlock" : ("hname","price", "sign", "change", "diff", "volume", "jnilclose", "offerho1", "bidho1", "offerrem1", "bidrem1", "preoffercha1","prebidcha1", "offerho2", "bidho2", "offerrem2", "bidrem2", "preoffercha2","prebidcha2", "offerho3", "bidho3", "offerrem3", "bidrem3", "preoffercha3","prebidcha3", "offerho4", "bidho4", "offerrem4", "bidrem4", "preoffercha4","prebidcha4", "offerho5", "bidho5", "offerrem5", "bidrem5", "preoffercha5","prebidcha5", "offerho6", "bidho6", "offerrem6", "bidrem6", "preoffercha6","prebidcha6", "offerho7", "bidho7", "offerrem7", "bidrem7", "preoffercha7","prebidcha7", "offerho8", "bidho8", "offerrem8", "bidrem8", "preoffercha8","prebidcha8", "offerho9", "bidho9", "offerrem9", "bidrem9", "preoffercha9","prebidcha9", "offerho10", "bidho10", "offerrem10", "bidrem10", "preoffercha10","prebidcha10", "offer", "bid", "preoffercha", "prebidcha", "uplmtprice", "dnlmtprice", "open", "high", "low", "ho_status", "hotime" ) }) # 반환값 { # output에서 지정한 DataFrame에 row값이 채워진 DataFrame이 반환된다. "OutBlock" : DataFrame } Query("t1833").request({ "Service" : filepath }, { "OutBlock" : ("JongCnt",), "OutBlock1" : DataFrame(columns=("shcode", "hname", "close", "change","diff")) }) # 반환값 { # output에서 지정한 tuple은 키와 값이 있는 direction으로 변경되어 반환된다. "OutBlock" : { "JongCnt": ... }, # output에서 지정한 DataFrame에 row값이 채워진 DataFrame이 반환된다. "OutBlock1" : DataFrame } """ try: if not input: input = {"InBlock": {}} if not isNext: self.query.reset() self._parseInput(input) self._parseOutput(output) # Query.sleep() #input setting for k, v in self.input.items(): self.query.SetFieldData(self.type + self.inputName, k, 0, v) # stop condition setting if stopCond: for subStopCondStr in stopCond: subStopCond = subStopCondStr.split() if "date" in subStopCond[0]: try: left_side = eval(subStopCond[0]) datetime.strptime( subStopCond[2], '%Y%m%d') # check YYYYMMDD format expr = "datetime.strptime(left_side, '%Y%m%d') " + subStopCond[ 1] + " datetime.strptime(subStopCond[2], '%Y%m%d')" if eval(expr): log.info("end with stopCondition : %s", subStopCondStr) return self.output except (ValueError, SyntaxError): # print ("stop condition error : " + expr) pass #call request # Query._sleepTime() Query.sleep(isNext) if hasattr(self, "service"): log.info(" - Call requestService") requestCode = self.query.RequestService( self.type, self.service) else: log.info(" - Call request (isNext:%s)" % isNext) requestCode = self.query.Request(isNext) if requestCode < 0: log.critical(xacom.parseErrorCode(requestCode)) return while self.query.status == 0: pythoncom.PumpWaitingMessages() time.sleep(0.1) #output setting for k, v in self.output.items(): if isinstance(v, DataFrame): #occur df = v if self.compress: self.query.Decompress(self.type + k) startIndex = len(df) for p in range(0, self.query.GetBlockCount(self.type + k)): for col in list(df.columns.values): df.set_value( p + startIndex, col, self.query.GetFieldData(self.type + k, col, p)) else: for col in v.keys(): v[col] = self.query.GetFieldData(self.type + k, col, 0) if self.query.IsNext: self.input[col] = v[col] self.query.status = 0 if self.query.IsNext: if self.callNext: return self.request(input, output, stopCond, True) else: # log.debug("<<<<< [%s-Query] 결과(callNext=False):%s" % (self.type,self.output)) return self.output else: # log.debug("<<<<< [%s-Query] 결과(callNext=True):%s" % (self.type,self.output)) return self.output except Exception: traceback.print_exc(file=sys.stdout)
def login(self, *argv): """서버 연결을 요청한다 :type argv: list :param argv: 설정 파일(argv가 1개일 경우, str 타입) 또는 서버, 사용자 정보 (argv가 2개인 경우, object) :param configfile: 설정 파일 :type configfile: bool :param server: 서버 정보 :type server: object {address:"서버주소", port:서버포트, type: 서버타입} :param user: 사용자 정보 :type user: object {id:"아이디", passwd:"비밀번호", account_passwd:"계좌비밀번호", certificate_passwd:"공인인증서비밀번호"} :return: 로그인이 성공하면 True, 실패하면 Fasle :rtype: bool :: session = Session() # 설정 파일을 읽어 로그인 하는 경우 session.login("config.conf") # 서버와 사용자 정보를 입력하여, 로그인 하는 경우 server = { "address" :"hts.ebestsec.co.kr", # 서버주소 "port" : 20001, # 서버포트 "type" : 0 # 서버 타입 } user = { "id" : "sculove", # 아이디 "passwd" : "12345678", # 비밀번호 "account_passwd" : "1234", # 계좌 비밀번호 "certificate_passwd" : "12345678" # 공인인증서 비밀번호 } session.login(server, user) """ argvCount = len(argv) if argvCount == 1: rst = self.load(argv[0]) server = rst["server"] user = rst["user"] elif argvCount >= 2: server = argv[0] user = argv[1] if not user["id"] or not user["passwd"]: log.critical("로그인 실패 : 서버와 사용자 정보를 입력해주세요") return False self.session.reset() self.session.ConnectServer(server["address"], server["port"]) self.session.Login(user["id"], user["passwd"], user["certificate_passwd"], server["type"], 0) while self.session.code == -1: pythoncom.PumpWaitingMessages() time.sleep(0.1) if self.session.code == "0000": log.info("로그인 성공") return True else: log.critical("로그인 실패 : %s" % xacom.parseErrorCode(self.session.code)) return False
def request(self, input, output, isNext=False): """TR을 요청한다. :param input: TR의 input block 정보 :type input: object { "InBlock" : { ... } } :param output: TR의 output block 정보. output block을 여러개가 존재할 수 있으며, DataFrame타입일 경우, occur 데이터를 반환한다. :type output: object { "OutBlock" : DataFrame or tuple, "OutBlock1" : DataFrame or tuple} } :param isNext: 연속 조회를 사용하기 위한 내부 파라미터로서 직접 사용하지 않는다. :return: output으로 지정한 형태로 값이 채워져서 반환된다. :rtype: object .. note:: input 키값이 "Service"인 경우, RequestService 로 요청할 수 있다. 예) 종목검색(씽API용), ChartIndex(차트지표데이터 조회) TR .. warning:: 절대 개발자가 isNext값을 지정하지 않는다. :: Query("t8407").request({ "InBlock" : { "nrec" : 2, "shcode" : "".join(["005930","035420"]) } },{ "OutBlock1" : DataFrame(columns=("shcode","hname","price","open","high", "low","sign","change","diff","volume")) }) # 반환값 { # output에서 지정한 DataFrame에 row값이 채워진 DataFrame이 반환된다. "OutBlock1" : DataFrame } Query("t1101", False).request({ "InBlock" : { "shcode" : "005930" } },{ "OutBlock" : ("hname","price", "sign", "change", "diff", "volume", "jnilclose", "offerho1", "bidho1", "offerrem1", "bidrem1", "preoffercha1","prebidcha1", "offerho2", "bidho2", "offerrem2", "bidrem2", "preoffercha2","prebidcha2", "offerho3", "bidho3", "offerrem3", "bidrem3", "preoffercha3","prebidcha3", "offerho4", "bidho4", "offerrem4", "bidrem4", "preoffercha4","prebidcha4", "offerho5", "bidho5", "offerrem5", "bidrem5", "preoffercha5","prebidcha5", "offerho6", "bidho6", "offerrem6", "bidrem6", "preoffercha6","prebidcha6", "offerho7", "bidho7", "offerrem7", "bidrem7", "preoffercha7","prebidcha7", "offerho8", "bidho8", "offerrem8", "bidrem8", "preoffercha8","prebidcha8", "offerho9", "bidho9", "offerrem9", "bidrem9", "preoffercha9","prebidcha9", "offerho10", "bidho10", "offerrem10", "bidrem10", "preoffercha10","prebidcha10", "offer", "bid", "preoffercha", "prebidcha", "uplmtprice", "dnlmtprice", "open", "high", "low", "ho_status", "hotime" ) }) # 반환값 { # output에서 지정한 DataFrame에 row값이 채워진 DataFrame이 반환된다. "OutBlock" : DataFrame } Query("t1833").request({ "Service" : filepath }, { "OutBlock" : ("JongCnt",), "OutBlock1" : DataFrame(columns=("shcode", "hname", "close", "change","diff")) }) # 반환값 { # output에서 지정한 tuple은 키와 값이 있는 direction으로 변경되어 반환된다. "OutBlock" : { "JongCnt": ... }, # output에서 지정한 DataFrame에 row값이 채워진 DataFrame이 반환된다. "OutBlock1" : DataFrame } """ if not input: input = {"InBlock": {}} if not isNext: self.query.reset() self._parseInput(input) self._parseOutput(output) Query.sleep() #input setting for k,v in self.input.items(): self.query.SetFieldData(self.type + self.inputName, k, 0, v) #call request Query._sleepTime() if hasattr(self, "service"): # log.info(" - Call requestService") requestCode = self.query.RequestService(self.type, self.service) else: # log.info(" - Call request (isNext:%s)" % isNext) requestCode = self.query.Request(isNext) if requestCode < 0: log.critical(xacom.parseErrorCode(requestCode)) return while self.query.status == 0: pythoncom.PumpWaitingMessages() time.sleep(0.1) #output setting for k,v in self.output.items(): if isinstance(v, DataFrame): #occur df =v if self.compress: self.query.Decompress(self.type + k) startIndex = len(df) for p in range(0,self.query.GetBlockCount(self.type + k)): for col in list(df.columns.values): df.set_value(p + startIndex, col, self.query.GetFieldData(self.type + k, col, p)) else: for col in v.keys(): v[col] = self.query.GetFieldData(self.type + k, col, 0) if self.query.IsNext: self.input[col] = v[col] self.query.status = 0 if self.query.IsNext: if self.callNext: return self.request(input, output, True) else: # log.debug(">>>>> [Query] 결과(callNext=False):%s" % self.output) return self.output else: # log.debug(">>>>> [Query] 결과(callNext=True):%s" % self.output) return self.output