【C# 群益 API 開發教學】帳號登入、取得下單帳號教學 #CH2
群益 API 是利用自己開發的程式,結合群益 API 在群益券商下單的一種方式,通常是做程式交易下單,或是單純讀取報價也行。
此範例教學是我看群益 API 的範例,再重新做出我要的程式交易功能。
這個章節是 API 基本的登入驗證功能,登入帳號密碼之後,再取得要下單的期貨帳號。
如果需要實際操作才好學習的話,在最後我會提供原始碼範例下載連結,可以在自己電腦執行看看。
我在寫程式碼時盡量把註解說明清楚一點,這樣可以幫助想學習的人看懂一些,完整的功能還是要看官方的文件和範例喔。
在往下看之前,我還是先提醒一下,我設計的介面是為了教學而簡單設計的,給大家學習參考而已,完整的功能還是要看官方的文件和範例喔。
在上一篇我講解了群益 API 的範例下載和安裝, 接下來就是實際打開 Visual Studio 2022 來設計介面了喔。
如果 Visual Studio 2022 還沒安裝可參考這篇: 微軟整合開發工具 Visual Studio 2022 安裝教學
Contents
設計介面
我開發的專案類型是 Windows Forms App (.NET Framework),是標準的視窗程式,關於如何建立視窗程式可參考: 建立第一個應用程式 Hello World
打開 VS 之後,可以照我的畫面,拉出這個設計檢視。
上面紅色字是控制項與 ID,好方便以下程式碼對應。
引用群益 API 元件
在我們下載群益 API 範例時,有安裝過他的元件,但是在新專案開發時,還是需要手動引用元件才行。
在專案的參考,按右鍵「加入參考」。
然後選擇「瀏覽」。
找到群益 API 範例裡面的元件「SKCOM.dll」,而目錄是 x64或 x86 依你的電腦而定。
加入之後,在參考內看到「SKCOMLib」就行了喔,接下來就可以繼續寫程式了。
註冊問題排除
如果你註冊元件時選擇 x64 版本,而程式引用「SKCOM.dll」一直出現失敗,可以嘗試以下方法解決。
針對你的專案按右鍵選擇「屬性」。
在「建置」的頁籤,將「平台目標」直接選擇「x64」,這樣就會指定為 x64 版本。
接著再重新引用 x64 元件的「SKCOM.dll」 試試看。
群益 API 登入測試
我在設計介面上有一個主要功能是「登入測試」,在登入動作裡面是檢查帳密正確性,以及取得下單帳號。
程式碼閱讀前提醒
以下的程式碼是針對重點功能拿出來講解,並加上我的註解,幫助第一次使用群益 API 好理解。
在群益 API 裡面已經有非常完整的開發教學了,大家還是要以官方的教學範例為主,而我的寫法會和官方範例有所不同,我也是提出我的寫法給大家參考而已。
當你們明白 API 用法之後,就可以改寫成你們想要的方式了。
物件初始化
在群益 API 使用都是透過物件來呼叫函式,在登入主要會用到連線、回應、下單物件,需要先對這些物件初始化。
1 2 3 4 |
// 初始化物件 SKCenterLib m_pSKCenter = new SKCenterLib(); //登入&環境物件 SKReplyLib m_pSKReply = new SKReplyLib(); //回應物件 SKOrderLib m_pSKOrder = new SKOrderLib(); //下單物件 |
註冊公告回應事件
這是群益 API 的要求,需要先讀取公告回應,才可以繼續登入。
1 2 3 4 5 6 7 8 9 10 |
// 註冊事件 if (isFirst == true) { // 註冊公告事件 m_pSKReply.OnReplyMessage += new _ISKReplyLibEvents_OnReplyMessageEventHandler(this.m_pSKReply_OnAnnouncement); // 註冊登入帳號事件 m_pSKOrder.OnAccount += new _ISKOrderLibEvents_OnAccountEventHandler(m_OrderObj_OnAccount); isFirst = false; } |
登入函式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// 不用 SGX DMA m_pSKCenter.SKCenterLib_SetAuthority(1); // 呼叫群益帳號登入 nCode = m_pSKCenter.SKCenterLib_Login(txtCapitalAcct.Text.Trim().ToUpper(), txtCapitalPwd.Text.Trim()); // 取得回傳訊息 string msg = GetMessage("登入", nCode); txtMessage.AppendText(msg + "\n"); if (nCode != 0 && nCode != 2003) { // 失敗 return; } |
群益 API 回傳的是代碼,可以透過此方法將代碼轉成文字訊息。
如果登入回傳代碼是 “0”,表示成功登入。
如果代碼是 2003 是指 ID 已登入無需重複登入,也算是成功登入。
其他的就是登入失敗,需要停下來看一下錯誤訊息。
取得回傳訊息 GetMessage() 是方法,語法如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
/// <summary> /// 取得群益api回傳訊息說明 /// </summary> /// <param name="strType"></param> /// <param name="nCode"></param> /// <param name="strMessage"></param> private string GetMessage(string strType, int nCode) { string strInfo = ""; if (nCode != 0) strInfo = "【" + m_pSKCenter.SKCenterLib_GetLastLogInfo() + "】"; string message = "【" + strType + "】【" + m_pSKCenter.SKCenterLib_GetReturnCodeMessage(nCode) + "】" + strInfo; return message; } |
讀取交易憑證
交易憑證是下單的必要憑證,可以上群益官網憑證專區,申請下載憑證安裝在電腦上,等待憑證安裝完成後,使用以下的 API 憑證語法才會通過喔。
使用群益的憑證安裝程式,要看到以下的畫面,才算是憑證合格喔。
憑證合格以下的程式碼才會通過。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// 下單物件初始化 nCode = m_pSKOrder.SKOrderLib_Initialize(); msg = GetMessage("下單物件初始化", nCode); txtMessage.AppendText(msg + "\n"); // 讀取憑證 nCode = m_pSKOrder.ReadCertByID(txtCapitalAcct.Text); msg = GetMessage("讀取憑證", nCode); txtMessage.AppendText(msg + "\n"); if (nCode != 0) { // 失敗 return; } |
取得下單帳號
在群益開戶可以同時開多個帳戶,而下單可選擇其中一個帳號執行,下面的語法就會列出所有的下單帳號。
1 2 3 4 5 6 7 |
//取得下單帳號 nCode = m_pSKOrder.GetUserAccount(); msg = GetMessage("取得下單帳號", nCode); txtMessage.AppendText(msg + "\n"); if (nCode != 0) return; |
因為在之前有註冊過事件 m_pSKOrder.OnAccount += new _ISKOrderLibEvents_OnAccountEventHandler(m_OrderObj_OnAccount);
所以呼叫 GetUserAccount()
之後會等待事件回傳,接下來就是看回傳的語法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
/// <summary> /// 取得下單帳號回傳事件 /// </summary> /// <param name="bstrLogInID"></param> /// <param name="bstrAccountData"></param> void m_OrderObj_OnAccount(string bstrLogInID, string bstrAccountData) { string[] strValues; strValues = bstrAccountData.Split(','); if (strValues[0] == "TF") { // 取得期貨帳號 futAcct = strValues[1] + strValues[3]; cboFutureAccount.Items.Add(new ComboboxItem(futAcct, futAcct + "-" + strValues[5])); cboFutureAccount.SelectedIndex = 0; } else if (strValues[0] == "OF") { // 取得海期帳號 osFutAcct = strValues[1] + strValues[3]; cboOsFutureAccount.Items.Add(new ComboboxItem(osFutAcct, osFutAcct + "-" + strValues[5])); cboOsFutureAccount.SelectedIndex = 0; } } |
當有多個帳號,此事件方法就會多次回傳,每一次回傳會帶一個帳號。
判斷帳號的分類如下:
TF: 期貨,OF: 海外期貨,TS: 證券,OS: 複委託
我將回傳的帳號傳入 ComboBox 顯示,
當有多個帳號時,在下單時就可以依不同帳號下單。
執行畫面
當程式執行後,輸入正確的帳號及密碼,就會有以下的畫面。
執行過程的訊息就會在下面顯示,成功和失敗都會顯示訊息。
儲存帳號密碼
當完成了登入測試之後,我們就可以將帳號及密碼儲存下來,以方便之後的報價及下單直接使用,不需要在每個地方都要輸入帳號密碼。
我選擇儲存的方式是將存有資訊的物件序列化,寫入實體檔案,下次需要時就直接讀取檔案反序列化就行。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
if (txtCapitalAcct.Text.Trim() == "") { MessageBox.Show("請輸入帳號"); return; } if (txtCapitalPwd.Text.Trim() == "") { MessageBox.Show("請輸入密碼"); return; } UserProfile user = new UserProfile(); user.CapitalUserId = txtCapitalAcct.Text.Trim(); user.CapitalUserPwd = txtCapitalPwd.Text.Trim(); // 將物件序列化儲存 string path = "CapitalLog"; if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } // 序列化 FileStream fs = new FileStream(path + "\\" + "UserProfile", FileMode.Create); IFormatter formatter = new BinaryFormatter(); formatter.Serialize(fs, user); fs.Close(); |
文章總結
- 確保群益 API 範例正常執行後,才開始開發自己的程式交易
- 新專案只要引用「SKCOM.dll」即可。
- 電腦需安裝群益憑證。
- 複製登入程式碼並取得下單帳號。
範例下載
下一篇教學文章
相關學習文章
如果你在學習上有不懂的地方,需要諮詢服務,可以參考站長服務,我想辨法解決你的問題
如果文章內容有過時、不適用或錯誤的地方,幫我在下方留言通知我一下,謝謝
冒味請問大大平日有儲存歷史成交的TICK資料嗎
今天不知為何無法登入群益API (顯示SK_ERROR_INITIALIZE_FAIL)
註: 我有修改API可把TICK歷史資料存下來到本機
我平常沒有儲存 Tick 資料耶,這資料量太大了
只有存個股日k而已
SK_ERROR_INITIALIZE_FAIL 訊息我看網路上的說法是 API 版本太舊了,你是否有試著升級看看?
我試看看有消息再回您
(其實壓一壓tick也不會多大啦)
昨天註冊新的DLL就OK了, 感謝您~
果然是版本的問題,恭喜你喔,解決問題了
你好,我執行時,出現 “發生建置錯誤,要繼續並且執行上次成功的組建嗎?”,按 “否” 觀察2則錯誤訊息如下
“因為檔案 FormAccount.resx 位於網際網路或是限制區域上,或是檔案上標有 Web 字樣,所以無法處理該檔案。若希望處理這些檔案,請移除 Web 字樣。”
“因為檔案 FormMaster.resx 位於網際網路或是限制區域上,或是檔案上標有 Web 字樣,所以無法處理該檔案。若希望處理這些檔案,請移除 Web 字樣。”
這跟我的作業環境、設定有關嗎?
謝謝!
這樣的資訊我無法判斷是什麼問題
你是否編譯時就發生了錯誤? 你是自行照教學一步一步做的嗎?