Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ###########################################################
- # pythoncom 是安裝 pywin32 附的,如果 event 沒反應才需要用到
- # 第一次使用cc.GetModule, 會在 comtypes\gen\ 下產生幾個.py檔,像是
- # _75AAD71C_8F4F_4F1F_9AEE_3D41A8C9BA5E_0_1_0.py
- # 如果有 dll 錯誤產生,請檢查 SKCOM.dll 路徑有沒有錯誤
- # 如果發生 gen 下沒有 SKCOMLib 錯誤訊息,請將python關閉
- # AttributeError: module 'comtypes.gen.SKCOMLib' has no attribute 'SKCenterLib'
- # 重新啟動python後,應該就可以找到了
- # 如果還是不行,請重新安裝 capital API 元件,注意 API 與python 版本要一致,
- # API安裝要以管理員權限執行
- import pythoncom, time
- import comtypes.client as cc
- cc.GetModule('C:\\SKCOM\\x86\\SKCOM.dll')
- import comtypes.gen.SKCOMLib as sk
- ts=sk.SKSTOCK()
- skC=cc.CreateObject(sk.SKCenterLib,interface=sk.ISKCenterLib)
- skQ=cc.CreateObject(sk.SKQuoteLib,interface=sk.ISKQuoteLib)
- skR=cc.CreateObject(sk.SKReplyLib,interface=sk.ISKReplyLib)
- #Some Configure
- ID='身分證'
- PW='密碼'
- #想取得報價的股票代碼
- strStocks='TSEA'
- #define functions
- def OnRequestQuote(strStocks = strStocks):
- skQ.SKQuoteLib_RequestStocks(1, strStocks)
- print("OnRequestQuote(),", strStocks)
- def getStock(nMarket, nIndex, ts):
- skQ.SKQuoteLib_GetStockByIndex(nMarket, nIndex, ts)
- print(ts.bstrStockName, ts.bstrStockNo, ts.nClose/10**ts.sDecimal)
- def pump():
- pythoncom.PumpWaitingMessages()
- #建立事件類別
- class skQ_events:
- def OnConnection(self, nKind, nCode):
- if nCode == 0 :
- if nKind == 3001 :
- print("skQ OnConnection, nkind= ", nKind)
- elif (nKind == 3003):
- skQ.SKQuoteLib_RequestStocks(1, strStocks)
- print("skQ OnConnection, request stocks, nkind= ", nKind)
- def OnNotifyQuote(self, sMarketNo, sStockIdx):
- skQ.SKQuoteLib_GetStockByIndex(sMarketNo, sStockIdx, ts)
- class skR_events:
- def OnConnect(self, bstrUserID, bstrData):
- print('skR_OnConnect!')
- def OnComplete(self, bstrUserID):
- print('OnCompleted!' )
- #Event sink
- EventQ=skQ_events()
- EventR=skR_events()
- #make connection to event sink
- ConnectionQ = cc.GetEvents(skQ, EventQ)
- ConnectionR = cc.GetEvents(skR, EventR)
- #Login
- print("Login,", skC.SKCenterLib_GetReturnCodeMessage(skC.SKCenterLib_Login(ID,PW)))
- #先呼叫 SKReplyLib_ConnectByID ,再 EnterMonitor,才會可以收到 OnConnection 3003 的回報
- print("ConnectByID,", skC.SKCenterLib_GetReturnCodeMessage(skR.SKReplyLib_ConnectByID(ID)))
- time.sleep(1)
- #登錄報價伺服器
- print("EnterMonitor,", skC.SKCenterLib_GetReturnCodeMessage(skQ.SKQuoteLib_EnterMonitor()))
- #每秒 pump event 一次
- for i in range(15):
- time.sleep(1)
- pump()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement