<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title><![CDATA[Latest posts for the topic "[程式交易]群益期貨Python API入門 4"]]></title>
		<link>https://www.andowson.com/posts/list/48.page</link>
		<description><![CDATA[Latest messages posted in the topic "[程式交易]群益期貨Python API入門 4"]]></description>
		<generator>JForum - http://www.jforum.net</generator>
			<item>
				<title>[程式交易]群益期貨Python API入門 4</title>
				<description><![CDATA[ 第四步 讓程式自動登入並取得期貨帳號權益數 
<br>
<br>
到目前為止，我們都是直接用群益期貨API內附的範例程式來手動執行取得報價或是下單，但我們的目標應該是要打造一組程式可以自動登入並完成交易，所以接下來我們要嘗試讓程式自動化，不用再手動輸入帳號密碼，並點選那些按鈕。 
<br>
<br>
另外群益期貨API範例程式是偏好有視窗GUI介面，但有GUI介面就會需要多處理一些視窗元件顯示的程式，我們先簡化掉這些視窗GUI介面顯示的處理程式。 
<br>
<br>
我們參考TFOrder.py複製相關程式碼到一個新的空白檔案，可以先存檔為Test.py，將原本的這兩行 
<br>
 richTextBoxMessage.insert('end', msg + "\n") 
<br>
 richTextBoxMessage.see('end') 
<br>
都標上#號註解，改用這行取代 
<br>
 print(msg) 
<br>
<br>
另外要注意到沒有GUI程式，即便能正常接收訊息，如果沒有做任何取出訊息的動作，訊息會卡在Message Queue裡面。因此我們要使用pywin32套件裡pythoncom模組包含的PumpWaitingMessages()將獲取到的訊息，從Message Queue裡面取出並利用。 
<br>
<br>
[code=python] 
<br>
# API com元件初始化 
<br>
import comtypes.client 
<br>
comtypes.client.GetModule(r'SKCOM.dll') 
<br>
import comtypes.gen.SKCOMLib as sk 
<br>
import time, pythoncom 
<br>
<br>
# 群益API元件導入Python code內用的物件宣告 
<br>
m_pSKCenter = comtypes.client.CreateObject(sk.SKCenterLib,interface=sk.ISKCenterLib) 
<br>
m_pSKReply = comtypes.client.CreateObject(sk.SKReplyLib,interface=sk.ISKReplyLib) 
<br>
m_pSKOrder = comtypes.client.CreateObject(sk.SKOrderLib,interface=sk.ISKOrderLib) 
<br>
<br>
# 全域變數 
<br>
<br>
# 登入帳號:交易帳號 
<br>
dictUserID = {} 
<br>
dictUserID["更新帳號"] = ["無"] 
<br>
<br>
userID = "身分證字號" 
<br>
password = "密碼" 
<br>
<br>
# ReplyLib事件 
<br>
class SKReplyLibEvent(): 
<br>
 def OnReplyMessage(self, bstrUserID, bstrMessages): 
<br>
 nConfirmCode = -1 
<br>
 msg = "【註冊公告OnReplyMessage】" + bstrUserID + "_" + bstrMessages; 
<br>
 #richTextBoxMessage.insert('end', msg + "\n") 
<br>
 #richTextBoxMessage.see('end') 
<br>
 print(msg) 
<br>
 return nConfirmCode 
<br>
SKReplyEvent = SKReplyLibEvent(); 
<br>
SKReplyLibEventHandler = comtypes.client.GetEvents(m_pSKReply, SKReplyEvent); 
<br>
<br>
# OrderLib事件 
<br>
class SKOrderLibEvent(): 
<br>
 # 帳號資訊 
<br>
 def OnAccount(self, bstrLogInID, bstrAccountData): 
<br>
 msg = "【OnAccount】" + bstrLogInID + "_" + bstrAccountData; 
<br>
 #richTextBoxMessage.insert('end', msg + "\n") 
<br>
 #richTextBoxMessage.see('end') 
<br>
 print(msg) 
<br>
<br>
 values = bstrAccountData.split(',') 
<br>
 # broker ID (IB)4碼 + 帳號7碼 
<br>
 Account = values[1] + values[3] 
<br>
<br>
 if bstrLogInID in dictUserID: 
<br>
 accountExists = False 
<br>
 for value in dictUserID[bstrLogInID]: 
<br>
 if value == Account: 
<br>
 accountExists = True 
<br>
 break 
<br>
 if accountExists == False: 
<br>
 dictUserID[bstrLogInID].append(Account) 
<br>
 else: 
<br>
 dictUserID[bstrLogInID] = [Account] 
<br>
<br>
 # (新)期貨未平倉GW。透過呼叫 GetOpenInterestGW 後，資訊由該事件回傳 
<br>
 def OnOpenInterest(self, bstrData): 
<br>
 msg = "【OnOpenInterest】" + bstrData 
<br>
 #richTextBoxMessage.insert('end', msg + "\n") 
<br>
 #richTextBoxMessage.see('end') 
<br>
 print(msg) 
<br>
<br>
 # 國內期貨權益數。透過呼叫 GetFutureRights 後，資訊由該事件回傳 
<br>
 def OnFutureRights(self, bstrData): 
<br>
 msg = "【OnFutureRights】" + bstrData; 
<br>
 #richTextBoxMessage.insert('end', msg + "\n") 
<br>
 #richTextBoxMessage.see('end') 
<br>
 print(msg) 
<br>
<br>
SKOrderEvent = SKOrderLibEvent() 
<br>
SKOrderLibEventHandler = comtypes.client.GetEvents(m_pSKOrder, SKOrderEvent) 
<br>
<br>
def capital_Login(bstrUserID, bstrPassword): 
<br>
 nCode = m_pSKCenter.SKCenterLib_Login(bstrUserID, bstrPassword) 
<br>
 msg = "【SKCenterLib_Login】" + m_pSKCenter.SKCenterLib_GetReturnCodeMessage(nCode) 
<br>
 print(msg) 
<br>
<br>
 # 這裡有做下單初始化 
<br>
 nCode = m_pSKOrder.SKOrderLib_Initialize() 
<br>
 msg = "【SKOrderLib_Initialize】" + m_pSKCenter.SKCenterLib_GetReturnCodeMessage(nCode) 
<br>
 print(msg) 
<br>
<br>
 # 拿到交易帳號 
<br>
 nCode = m_pSKOrder.GetUserAccount() 
<br>
 msg = "【GetUserAccount】" + m_pSKCenter.SKCenterLib_GetReturnCodeMessage(nCode) 
<br>
 print(msg) 
<br>
<br>
def capital_GetOpenInterestGW(bstrLogInID, bstrAccount): 
<br>
 nCode = m_pSKOrder.GetOpenInterestGW(bstrLogInID, bstrAccount, 1) 
<br>
 msg = "【GetOpenInterestGW】" + m_pSKCenter.SKCenterLib_GetReturnCodeMessage(nCode) 
<br>
 print(msg) 
<br>
<br>
def capital_GetFutureRights(bstrLogInID, bstrAccount, sCoinType): 
<br>
 nCode = m_pSKOrder.GetFutureRights(bstrLogInID, bstrAccount, sCoinType) 
<br>
 msg = "【GetFutureRights】" + m_pSKCenter.SKCenterLib_GetReturnCodeMessage(nCode) 
<br>
 print(msg) 
<br>
<br>
if __name__ == '__main__': 
<br>
 capital_Login(userID, password) 
<br>
 account = dictUserID[userID][0] 
<br>
 capital_GetOpenInterestGW(userID, account) 
<br>
 # sCoinType 0:全幣別 1:基幣(台幣TWD) 2:人民幣RMB 
<br>
 capital_GetFutureRights(userID, account, 1) 
<br>
 #每秒推一次 event, 推5秒 
<br>
 for i in range(5): 
<br>
 pythoncom.PumpWaitingMessages() 
<br>
 time.sleep(1) 
<br>
[/code] 
<br>
參考資料: 
<br>
[url]https://medium.com/coding-learning-sharing/%E7%9B%AE%E9%8C%84-5620aafd4d6b[/url] 
<br>
[url]https://easontseng.blogspot.com/p/blog-page.html[/url]]]></description>
				<guid isPermaLink="true">https://www.andowson.com/posts/preList/790/1566.page</guid>
				<link>https://www.andowson.com/posts/preList/790/1566.page</link>
				<pubDate><![CDATA[Sun, 15 Dec 2024 14:39:35]]> GMT</pubDate>
				<author><![CDATA[ andowson]]></author>
			</item>
	</channel>
</rss>