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, '', '')
2018年9月19日 星期三
測試 SKOrderLib 的 GetBalanceQuery, GetMarginPurchaseAmountLimit 功能
一點範例測試 GetBalanceQuery, GetMarginPurchaseAmountLimit 功能
訂閱:
張貼留言 (Atom)
您好,想請教一下,如果同時要求2個不同的個股,在onNotify的Event中,您是怎麼去對應個股編號? 假設我請求穩懋(3105)的資料,onNotify回來的資料包含群益自定義的編號,可是不含3105的編號,所以不知道您怎麼處理這樣的問題,謝謝
回覆刪除Eason您好,
刪除我執行有遇到問題, 就一行一行執行, 在執行到下面這行的時候, 會回應: ConnectByID, SK_ERROR_PERMISSION_DENIED 請問您有遇過嗎? 謝謝。
print("ConnectByID,", skC.SKCenterLib_GetReturnCodeMessage(skR.SKReplyLib_ConnectByID(ID)))
@小老鼠
刪除1008 SK_ERROR_PERMISSION_DENIED 權限不足,請確認API權限已開通
你有跟營業員開通API使用權限嗎?
@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()
...
...
@Eason 感謝解答
刪除Eason您好.
回覆刪除在skO.GetBalanceQuery(ID, EventO.Acc, '2330')
我執行完程式後只有回傳0,查了一下API說明文件0表示成功,但需要如何得到集保庫存呢??
麻煩您教導一下,謝謝
要先確認你的 Event 能夠有反應,這裡的例子適用 jupyter notebook
刪除加入 %matplotlib auto 可以接到event。 其他IDE要用 pythoncom.PumpWaitingMessages() 的方法自己推,詳細方法可以參考我部落格上取得報價的第一篇文章。
我有修改上面code,把資訊存在 EventO.Balanace 裡,您參考看看。
或是可以設一個全域變數來存取,這就請你自行嘗試。
感謝Eason的協助,我有參考你之前的範例也寫了一個pumpwait()放在skO.GetBalanceQuery的前後都試過,但我試了好久仍舊得不到Event的回傳值,最後只有收到一個空的[],想問Eason我目前也是用Jupyter notebook,python 3.7.3,win10 環境會有差異嗎?
回覆刪除用jupyter的話,我這個範例,你只要改skcom.dll 路徑,跟補上ID PW,應該就可以用了,你有嘗試過了嗎? 如果還是不行的話,當你輸入 %matplotlib auto 後,是什麼訊息? 我是出現 "Using matplotlib backend: TkAgg"。 你去我網頁的引索找找,我有整理一個常見callback 出不來的問題,看看有沒有適合你的狀況。
刪除感謝Eason.
回覆刪除我在Jupyter出現的確實是"Using matplotlib backend: TkAgg",由於Python還在摸索階段所以還不知如何處理這個問題比較適當..所以我在你的callback問題文章的第2點你有提到 [在IDE或GUI介面下一般都會自帶有 eventloop功能]..而我主要Python程式是在eclipse的開發工具寫的,所以我就把這些Jupyter的程式碼移值到eclipse的開發工具內執行,這樣就可以接收到值了,太棒了.謝謝