2018年9月18日 星期二

python 接群益api callback / event 沒反應,常見問題

沒有順序之分,想到過去有哪些經驗就寫什麼


1. python 跟 API 的位元版本要一樣,python 是64 bit,API 就裝 x64,網友指出 64位元版好像問題比較多,可以試試 32位元版本

2. 缺少 event loop,  在 IDE 或 GUI 介面下一般都會自帶有 eventloop 功能,比較不用煩惱。  如果用 jupyter notebook 開發,可用 magic function:  %matplotlib auto, 也會幫你準備一個 eventloop。

如果在 terminal 下開發,需要用 pythoncom.PumpWaitingMessages() / PumpMessages() 之類的方法讓 callback出來。如:

    while Ture:
        pythoncom.PumpWaitingMessages()

或是直接用 pythoncom.PumpMessages() 等同上面的 while loop

最近發現,使用 juypter notebook 的  magic function '%matplotlob auto' 來推動 eventloop,可能要注意 '%matplotlob auto' 放置的位置,太早使用,可能 eventloop 沒有反應,可以嘗試調整 '%matplotlob auto' 出現的位置。

3. Event class 的定義有錯誤,像是  class 定義 def 的名稱都要參照 API 文件裡事件的名稱
例如: SKQuotelib 的事件

class skQ_events:
    def OnConnect(self, nKind, nCode):
        print('nKind, nCode=', nKind, nCode)
    def OnNotifyServerTime(self, sHour, sMinute, sSecond, nTotal):
        print(sHour, sMinute, sSecond)

記得  def  裡第一個參數是 self,這個一開始寫常忘記

4. 如果是更新API 後有問題,可以考慮清空 comtypes.gen下的資料
   請參考 https://easontseng.blogspot.com/2018/05/api-python-comtypes.html

我常用 OnNotifyServerTime 這個 callback 來看 eventloop 正不正常,連上群益報價主機後,每隔5秒主機會發送一個時間,可以藉此觀察 eventloop 有沒有問題。


以上是我的經驗,如果你有遇到其它情況,也歡迎在下面留言分享

6 則留言:

  1. 目前使用版本: 2018/07/02 2.13.13

    請問有測試過 skO.GetBalanceQuery (查詢集保庫存) 及
    skO.GetMarginPurchaseAmountLimit (資券配額查詢) 嗎?
    (看文件是 2018/02/22 2.13.11 新增功能)

    這兩個 order function 均無 callback 回
    OnBalanceQuery, OnMarginPurchaseAmountLimit
    並導致 程式結束 [Error code: -1073740771 (0xc000041d)]

    測過 GetRealBalanceReport & GetRequestProfitReport 是正常的!

    有試過 SKCOMTester.exe 內的
    GetMarginPurchaseAmountLimit & GetBalanceQuery
    也是正常的!

    感謝

    回覆刪除
  2. 我剛剛第一次用這功能,看起來沒什麼問題哩
    #我的事件類別只有這樣設定,就可以用了
    class skO_events:
    def OnBalanceQuery(self, bstrData):
    print('OnBalanceQuery', bstrData)

    def OnMarginPurchaseAmountLimit(self, bstrData):
    print('OnMargin', bstrData)

    #然後執行這些都有callback
    skC.SKCenterLib_Login(ID,PW)
    skO.SKORderLib_Initialize()
    skO.GetBalanceQuery(ID, Acc, '')
    skO.GetMarginPurchaseAmountLimit(ID, '', '')

    #你會不會是帳號打錯了

    回覆刪除
  3. 感謝回覆, 發現在您的綱誌內常有人說 64 bit 有問題,
    就改安裝 32 bit 的 python 試試 結果就OK了!

    再次感謝您, 抽空回覆

    回覆刪除
    回覆
    1. 突然想到,或許可以先去把 comtypes.gen 目錄下的檔案都清空,再去呼叫 GetModule('~~SKCOM.dll'),可以重新產生一份 SKCOMLib package, 特別是曾經更新過 API版本或是切換位元版本的時候。

      刪除
  4. 請問Eason大大,您的pyhton是用32位元的嗎?
    然後樓上的問題,我也有遇到,但我去把comtypes.gen 目錄下的檔案都清空,還是會沒有回應,然後會崩潰ˊˋ

    回覆刪除
    回覆
    1. 我有用32也有用64,都可以用沒什麼問題。最近comtypes有更動,其中一個issue是要修正 dll 有變動的話,gen 也要相對應更新這個問題,但好像還是有點bug? 我後來整個uninstall comtypes 再重新安裝,又沒問題了... 給您參考

      刪除