2017年11月1日 星期三

python 群益api tick 報價

來練習tick報價吧!

群益API版本 2.13.39, python 3.92, windows 11

# 只有第一次使用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()



7 則留言:

  1. 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的訊息,有可能是哪邊出了問題嗎?

    回覆刪除
  2. 我的 Using matplotlib backend 是 QtAgg,不知道根這有關嗎?

    跳不出來的話,我之前會用 pythoncom.PumpWaitingMessages() 寫個迴圈 polling
    去安裝 pywin32 有附 pyhtoncom
    可以參考我的報價範例
    https://easontseng.blogspot.tw/2017/07/api-in-pyhton.html

    如果還是出不來,我也不知道怎麼辦了

    回覆刪除
    回覆
    1. 用另外一篇就有反應了,我也才剛開始學 我再研究看看謝謝

      刪除
  3. 請問大大:
    用 Jupyter Notebook run (以下 tick 報價範例 for 群益API 2.13.17)

    File "", line 22
    elif nCode == 0 & (nKind == 3003):
    ^
    SyntaxError: invalid syntax


    出現上面的訊息,可能哪裡操作出問題,感謝您!!!

    回覆刪除
  4. 語法錯誤,大概是我轉貼的時候出錯了,已修正,改成 elif (nCode == 0) & (nKind == 3003): 就可以了

    回覆刪除
  5. 請問樓主,執行以上程式後,ticks報價應當就會打印在console畫面,或IDE RUN畫面中 ? 因我只執行到
    "EnterMonitor,"SK SECCESS 就沒任何訊息了..

    回覆刪除
    回覆
    1. 你要參考 群益API 2.13.17 那個版本的, API 版本現在都已經2.13.25 以上了。 初步看起來像是沒有建立好 event loop,這要看你的開發環境了,我建議試試看 jupyter notebook 的環境,用 magic function 產生 event loop。 IDE 或 console 需要裝 pythoncom, 使用 pumpwaitmessage 來自己推 event. 去我部落格 群益api, python, COM, 快速引索 裡面找找看

      刪除