練功房推薦書單

  • 猛虎出柙雙劍合璧版--最新 OCA / OCP Java SE 7 Programmer 專業認證 (電子書)
  • 流浪教師存零股存到3000萬(全新增修版)(書+DVD)
  • 開始在關西自助旅行(京都‧大阪‧神戶‧奈良)(全新增訂版)
  • 不敗教主的300張股票存股術

[程式交易]群益期貨Python API入門 4 RSS feed
Forum Index » 投資理財 Financial Investment
Author Message
andowson

七段學員
[Avatar]

Joined: 2007/1/2
Messages: 715
Location: 台北
Offline
第四步 讓程式自動登入並取得期貨帳號權益數

到目前為止,我們都是直接用群益期貨API內附的範例程式來手動執行取得報價或是下單,但我們的目標應該是要打造一組程式可以自動登入並完成交易,所以接下來我們要嘗試讓程式自動化,不用再手動輸入帳號密碼,並點選那些按鈕。

另外群益期貨API範例程式是偏好有視窗GUI介面,但有GUI介面就會需要多處理一些視窗元件顯示的程式,我們先簡化掉這些視窗GUI介面顯示的處理程式。

我們參考TFOrder.py複製相關程式碼到一個新的空白檔案,可以先存檔為Test.py,將原本的這兩行
richTextBoxMessage.insert('end', msg + "\n")
richTextBoxMessage.see('end')
都標上#號註解,改用這行取代
print(msg)

另外要注意到沒有GUI程式,即便能正常接收訊息,如果沒有做任何取出訊息的動作,訊息會卡在Message Queue裡面。因此我們要使用pywin32套件裡pythoncom模組包含的PumpWaitingMessages()將獲取到的訊息,從Message Queue裡面取出並利用。


# API com元件初始化
import comtypes.client
comtypes.client.GetModule(r'SKCOM.dll')
import comtypes.gen.SKCOMLib as sk
import time, pythoncom

# 群益API元件導入Python code內用的物件宣告
m_pSKCenter = comtypes.client.CreateObject(sk.SKCenterLib,interface=sk.ISKCenterLib)
m_pSKReply = comtypes.client.CreateObject(sk.SKReplyLib,interface=sk.ISKReplyLib)
m_pSKOrder = comtypes.client.CreateObject(sk.SKOrderLib,interface=sk.ISKOrderLib)

# 全域變數

# 登入帳號:交易帳號
dictUserID = {}
dictUserID["更新帳號"] = ["無"]

userID = "身分證字號"
password = "密碼"

# ReplyLib事件
class SKReplyLibEvent():
def OnReplyMessage(self, bstrUserID, bstrMessages):
nConfirmCode = -1
msg = "【註冊公告OnReplyMessage】" + bstrUserID + "_" + bstrMessages;
#richTextBoxMessage.insert('end', msg + "\n")
#richTextBoxMessage.see('end')
print(msg)
return nConfirmCode
SKReplyEvent = SKReplyLibEvent();
SKReplyLibEventHandler = comtypes.client.GetEvents(m_pSKReply, SKReplyEvent);

# OrderLib事件
class SKOrderLibEvent():
# 帳號資訊
def OnAccount(self, bstrLogInID, bstrAccountData):
msg = "【OnAccount】" + bstrLogInID + "_" + bstrAccountData;
#richTextBoxMessage.insert('end', msg + "\n")
#richTextBoxMessage.see('end')
print(msg)

values = bstrAccountData.split(',')
# broker ID (IB)4碼 + 帳號7碼
Account = values[1] + values[3]

if bstrLogInID in dictUserID:
accountExists = False
for value in dictUserID[bstrLogInID]:
if value == Account:
accountExists = True
break
if accountExists == False:
dictUserID[bstrLogInID].append(Account)
else:
dictUserID[bstrLogInID] = [Account]

# (新)期貨未平倉GW。透過呼叫 GetOpenInterestGW 後,資訊由該事件回傳
def OnOpenInterest(self, bstrData):
msg = "【OnOpenInterest】" + bstrData
#richTextBoxMessage.insert('end', msg + "\n")
#richTextBoxMessage.see('end')
print(msg)

# 國內期貨權益數。透過呼叫 GetFutureRights 後,資訊由該事件回傳
def OnFutureRights(self, bstrData):
msg = "【OnFutureRights】" + bstrData;
#richTextBoxMessage.insert('end', msg + "\n")
#richTextBoxMessage.see('end')
print(msg)

SKOrderEvent = SKOrderLibEvent()
SKOrderLibEventHandler = comtypes.client.GetEvents(m_pSKOrder, SKOrderEvent)

def capital_Login(bstrUserID, bstrPassword):
nCode = m_pSKCenter.SKCenterLib_Login(bstrUserID, bstrPassword)
msg = "【SKCenterLib_Login】" + m_pSKCenter.SKCenterLib_GetReturnCodeMessage(nCode)
print(msg)

# 這裡有做下單初始化
nCode = m_pSKOrder.SKOrderLib_Initialize()
msg = "【SKOrderLib_Initialize】" + m_pSKCenter.SKCenterLib_GetReturnCodeMessage(nCode)
print(msg)

# 拿到交易帳號
nCode = m_pSKOrder.GetUserAccount()
msg = "【GetUserAccount】" + m_pSKCenter.SKCenterLib_GetReturnCodeMessage(nCode)
print(msg)

def capital_GetOpenInterestGW(bstrLogInID, bstrAccount):
nCode = m_pSKOrder.GetOpenInterestGW(bstrLogInID, bstrAccount, 1)
msg = "【GetOpenInterestGW】" + m_pSKCenter.SKCenterLib_GetReturnCodeMessage(nCode)
print(msg)

def capital_GetFutureRights(bstrLogInID, bstrAccount, sCoinType):
nCode = m_pSKOrder.GetFutureRights(bstrLogInID, bstrAccount, sCoinType)
msg = "【GetFutureRights】" + m_pSKCenter.SKCenterLib_GetReturnCodeMessage(nCode)
print(msg)

if __name__ == '__main__':
capital_Login(userID, password)
account = dictUserID[userID][0]
capital_GetOpenInterestGW(userID, account)
# sCoinType 0:全幣別 1:基幣(台幣TWD) 2:人民幣RMB
capital_GetFutureRights(userID, account, 1)
#每秒推一次 event, 推5秒
for i in range(5):
pythoncom.PumpWaitingMessages()
time.sleep(1)

參考資料:
https://medium.com/coding-learning-sharing/%E7%9B%AE%E9%8C%84-5620aafd4d6b
https://easontseng.blogspot.com/p/blog-page.html

分享經驗 累積智慧
[WWW]
 
Forum Index » 投資理財 Financial Investment
Go to:   
Mobile view