Beispiel #1
0
	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
Beispiel #2
0
    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
Beispiel #3
0
    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
Beispiel #4
0
    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)
Beispiel #5
0
    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
Beispiel #6
0
    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
Beispiel #7
0
	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