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, '', '')

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 有沒有問題。


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