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 功能
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 有沒有問題。
以上是我的經驗,如果你有遇到其它情況,也歡迎在下面留言分享
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 有沒有問題。
以上是我的經驗,如果你有遇到其它情況,也歡迎在下面留言分享