2018年9月19日 星期三

測試 SKOrderLib 的 GetBalanceQuery, GetMarginPurchaseAmountLimit 功能

一點範例測試 GetBalanceQuery, GetMarginPurchaseAmountLimit 功能


from comtypes.client import GetModule, GetEvents, CreateObject
GetModule('C:\\SKCOM\\CapitalAPI_2.13.13\\x64\\SKCOM.dll')
import comtypes.gen.SKCOMLib as sk
skC = CreateObject(sk.SKCenterLib, interface=sk.ISKCenterLib)
skO = CreateObject(sk.SKOrderLib, interface=sk.ISKOrderLib)
    
#使用jupyter notebook magic function,這句可以讓 Event Pump 出來
%matplotlib auto

ID=''
PW=''

#建立事件類別
class skO_events:
    def __init__(self):
        #初始化,可以設定一些變數供使用
        self.Acc=''
        self.Balance=[]
    def OnBalanceQuery(self, bstrData):
        #將Balance 回傳資訊存在 event instance 的 Balance 屬性中
        self.Balance.append(bstrData)
        print('OnBalanceQuery', bstrData)
    def OnMarginPurchaseAmountLimit(self, bstrData):
        print('OnMargin', bstrData)
    def OnAccount(self, LogInID, AccountData):
        if AccountData.split(',')[0]=='TS':
            self.Acc=AccountData.split(',')[2] + AccountData.split(',')[3]
        print(LogInID, AccountData)

EventO=skO_events()
EventO_handler=GetEvents(skO, EventO)       

#Login
skC.SKCenterLib_Login(ID,PW)
#Order object initialize
skO.SKORderLib_Initialize()

skO.GetUserAccount()

skO.GetBalanceQuery(ID, EventO.Acc, '')
#查看 Balance
print(EventO.Balance)
skO.GetMarginPurchaseAmountLimit(ID, '', '')

10 則留言:

  1. 您好,想請教一下,如果同時要求2個不同的個股,在onNotify的Event中,您是怎麼去對應個股編號? 假設我請求穩懋(3105)的資料,onNotify回來的資料包含群益自定義的編號,可是不含3105的編號,所以不知道您怎麼處理這樣的問題,謝謝

    回覆刪除
    回覆
    1. Eason您好,
      我執行有遇到問題, 就一行一行執行, 在執行到下面這行的時候, 會回應: ConnectByID, SK_ERROR_PERMISSION_DENIED 請問您有遇過嗎? 謝謝。

      print("ConnectByID,", skC.SKCenterLib_GetReturnCodeMessage(skR.SKReplyLib_ConnectByID(ID)))

      刪除
    2. @小老鼠
      1008 SK_ERROR_PERMISSION_DENIED 權限不足,請確認API權限已開通
      你有跟營業員開通API使用權限嗎?

      刪除
    3. @Yu huan Liu
      用 GetStockByIndex 根據 sMarketNo, sIndex 取回資料存在 pSKStock
      大概類似這樣: 憑印象打的,你參考一下
      OnNotifyQuote(sMarketNo, sIndex):
      SKQuoteLib_GetStockByIndex(sMarketNo, sIndex, pSKStock)
      if pSKStock.bstrStockNo=='3105':
      do_something_you_want()
      elif pSKStock.bstrStockNo=='2330':
      do_strong_buy()
      ...
      ...

      刪除
  2. Eason您好.
    在skO.GetBalanceQuery(ID, EventO.Acc, '2330')
    我執行完程式後只有回傳0,查了一下API說明文件0表示成功,但需要如何得到集保庫存呢??
    麻煩您教導一下,謝謝

    回覆刪除
    回覆
    1. 要先確認你的 Event 能夠有反應,這裡的例子適用 jupyter notebook
      加入 %matplotlib auto 可以接到event。 其他IDE要用 pythoncom.PumpWaitingMessages() 的方法自己推,詳細方法可以參考我部落格上取得報價的第一篇文章。
      我有修改上面code,把資訊存在 EventO.Balanace 裡,您參考看看。
      或是可以設一個全域變數來存取,這就請你自行嘗試。

      刪除
  3. 感謝Eason的協助,我有參考你之前的範例也寫了一個pumpwait()放在skO.GetBalanceQuery的前後都試過,但我試了好久仍舊得不到Event的回傳值,最後只有收到一個空的[],想問Eason我目前也是用Jupyter notebook,python 3.7.3,win10 環境會有差異嗎?

    回覆刪除
    回覆
    1. 用jupyter的話,我這個範例,你只要改skcom.dll 路徑,跟補上ID PW,應該就可以用了,你有嘗試過了嗎? 如果還是不行的話,當你輸入 %matplotlib auto 後,是什麼訊息? 我是出現 "Using matplotlib backend: TkAgg"。 你去我網頁的引索找找,我有整理一個常見callback 出不來的問題,看看有沒有適合你的狀況。

      刪除
  4. 感謝Eason.
    我在Jupyter出現的確實是"Using matplotlib backend: TkAgg",由於Python還在摸索階段所以還不知如何處理這個問題比較適當..所以我在你的callback問題文章的第2點你有提到 [在IDE或GUI介面下一般都會自帶有 eventloop功能]..而我主要Python程式是在eclipse的開發工具寫的,所以我就把這些Jupyter的程式碼移值到eclipse的開發工具內執行,這樣就可以接收到值了,太棒了.謝謝

    回覆刪除