群益API版本 2.13.39, python 3.92, windows 11
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 只有第一次使用API或升級API時需要呼叫 | |
# 執行後會將 dll 包成python 可以呼叫的 module , 並存放在 comyes.gen 資料夾 | |
from comtypes.client import GetModule, CreateObject, GetEvents | |
# skcom.dll 的路徑我都放在固定位置 | |
GetModule(r'C:\SKCOM\CapitalAPI_2.13.39\x64\SKCOM.dll') | |
from comtypes.gen import SKCOMLib as sk | |
import pythoncom | |
# 建立物件 | |
skC = CreateObject(sk.SKCenterLib,interface=sk.ISKCenterLib) | |
skQ = CreateObject(sk.SKQuoteLib,interface=sk.ISKQuoteLib) | |
skR = CreateObject(sk.SKReplyLib,interface=sk.ISKReplyLib) | |
# 輸入身分證與密碼 | |
Id='' | |
Pw='' | |
# 建立事件類別 | |
class skQ_events: | |
def __init__(self): | |
self.ticklist=[] | |
def OnConnection(self, nKind, nCode): | |
if nKind == 3001 : | |
print("連線中, nkind= ", nKind) | |
elif (nCode == 0) & (nKind == 3003): | |
print("連線成功, nkind= ", nKind) | |
# 要回報 3003 才能開始請求商品報價 | |
strStocks='TX00' | |
nCode=skQ.SKQuoteLib_RequestTicks(1, strStocks)[1] | |
print("RequestTick,", strStocks, skC.SKCenterLib_GetReturnCodeMessage(nCode)) | |
def OnNotifyTicksLONG(self, *args, **kwargs): | |
# 2.13.17 說明文件的參數有誤,用 *args 代替 | |
print(args) | |
self.ticklist.append(args) | |
class skR_events: | |
def OnReplyMessage(self, bstrUserID, bstrMessage, sConfirmCode=0xFFFF): | |
# 2.13.17 以上版本, 在Login時會確認有無 OnReplyMessage 回報 sConfirmCode=0xFFFF | |
print('OnReplyMessage 回報正常', bstrMessage) | |
return sConfirmCode | |
if __name__ == '__main__': | |
# comtypes 連結 callback 方法 | |
# Event sink, 事件實體 | |
EventQ = skQ_events() | |
EventR = skR_events() | |
ConnQ = GetEvents(skQ, EventQ) | |
ConnR = GetEvents(skR, EventR) | |
# Login | |
nCode = skC.SKCenterLib_Login(Id,Pw) | |
print("Login,", skC.SKCenterLib_GetReturnCodeMessage(nCode)) | |
nCode = skQ.SKQuoteLib_EnterMonitorLONG() | |
# nCode = skQ.SKQuoteLib_EnterMonitor() | |
print("EnterMonitor,", skC.SKCenterLib_GetReturnCodeMessage(nCode)) | |
#eventloop | |
pythoncom.PumpMessages() |
Using matplotlib backend: TkAgg
回覆刪除ID= ········
Password= ········
('Login,', u'SK_SUCCESS')
('ConnectByID,', u'SK_SUCCESS')
('EnterMonitor,', u'SK_SUCCESS')
('RequestTick,', 'TX00', u'SK_SUCCESS')
('20171228 11:15:48, ', u'xxxxxxxxx', ', skR_OnConnect!')
請問如果登入都正常但沒出現skQ_events的訊息,有可能是哪邊出了問題嗎?
我的 Using matplotlib backend 是 QtAgg,不知道根這有關嗎?
回覆刪除跳不出來的話,我之前會用 pythoncom.PumpWaitingMessages() 寫個迴圈 polling
去安裝 pywin32 有附 pyhtoncom
可以參考我的報價範例
https://easontseng.blogspot.tw/2017/07/api-in-pyhton.html
如果還是出不來,我也不知道怎麼辦了
用另外一篇就有反應了,我也才剛開始學 我再研究看看謝謝
刪除請問大大:
回覆刪除用 Jupyter Notebook run (以下 tick 報價範例 for 群益API 2.13.17)
File "", line 22
elif nCode == 0 & (nKind == 3003):
^
SyntaxError: invalid syntax
出現上面的訊息,可能哪裡操作出問題,感謝您!!!
語法錯誤,大概是我轉貼的時候出錯了,已修正,改成 elif (nCode == 0) & (nKind == 3003): 就可以了
回覆刪除請問樓主,執行以上程式後,ticks報價應當就會打印在console畫面,或IDE RUN畫面中 ? 因我只執行到
回覆刪除"EnterMonitor,"SK SECCESS 就沒任何訊息了..
你要參考 群益API 2.13.17 那個版本的, API 版本現在都已經2.13.25 以上了。 初步看起來像是沒有建立好 event loop,這要看你的開發環境了,我建議試試看 jupyter notebook 的環境,用 magic function 產生 event loop。 IDE 或 console 需要裝 pythoncom, 使用 pumpwaitmessage 來自己推 event. 去我部落格 群益api, python, COM, 快速引索 裡面找找看
刪除