群益 API 是利用自己開發的程式,結合群益 API 在群益券商下單的一種方式,通常是做程式交易下單,或是單純讀取報價也行。
而群益 API 是我看過很用心在開發 API 的一間券商,他們的 API 提供很完整的串接機制,可以做到即時回應與事件觸發方式,我看完他們的 API 是覺得他們程式架構是很完整的。
此範例教學是我看群益 API 的範例,再重新做出我要的程式交易功能。
這個章節是 API 基本的登入驗證功能,登入帳號密碼之後,再取得要下單的期貨帳號。
如果需要實際操作才好學習的話,在最後我會提供原始碼範例下載連結,可以在自己電腦執行看看。
我在寫程式碼時盡量把註解說明清楚一點,這樣可以幫助想學習的人看懂一些,完整的功能還是要看官方的文件和範例喔。
在往下看之前,我還是先提醒一下,我設計的介面是為了教學而簡單設計的,給大家學習參考而已,完整的功能還是要看官方的文件和範例喔。
在上一篇我講解了群益 API 的範例下載和安裝, 接下來就是實際打開 Visual Studio 2019 來設計介面了喔。
如果 Visual Studio 2019 還沒安裝可參考這篇: 安裝程式開發工具 IDE Visual Studio 2019
我開發的專案類型是 Windows Forms App (.NET Framework),是標準的視窗程式,關於如何建立視窗程式可參考: 建立第一個應用程式 Hello World
打開 VS 之後,可以照我的畫面,拉出這個設計檢視。
上面紅色字是控制項與 ID,好方便以下程式碼對應。
在我們下載群益 API 範例時,有安裝過他的元件,但是在新專案開發時,還是需要手動引用元件才行。
在專案的參考,按右鍵「加入參考」。
然後選擇「瀏覽」。
找到群益 API 範例裡面的元件「SKCOM.dll」,而目錄是 x64或 x86 依你的電腦而定。
加入之後,在參考內看到「SKCOMLib」就行了喔,接下來就可以繼續寫程式了。
如果你已經註冊了元件,而程式要引用「SKCOM.dll」一直出現失敗,應該是註冊時失敗,錯誤原因可能是你放在 C 槽之外註冊會失敗。
解決方法有 2個
我在設計介面上有一個主要功能是「登入測試」,在登入動作裡面是檢查帳密正確性,以及取得下單帳號。
以下的程式碼是針對重點功能拿出來講解,並加上我的註解,幫助第一次使用群益 API 好理解。
在群益 API 裡面已經有非常完整的開發教學了,大家還是要以官方的教學範例為主,而我的寫法會和官方範例有所不同,我也是提出我的寫法給大家參考而已。
當你們明白 API 用法之後,就可以改寫成你們想要的方式了。
在群益 API 使用都是透過物件來呼叫函式,在登入主要會用到連線、回應、下單物件,需要先對這些物件初始化。
// 初始化物件
SKCenterLib m_pSKCenter = new SKCenterLib(); //登入&環境物件
SKReplyLib m_pSKReply = new SKReplyLib(); //回應物件
SKOrderLib m_pSKOrder = new SKOrderLib(); //下單物件
這是群益 API 的要求,需要先讀取公告回應,才可以繼續登入。
// 註冊事件
if (isFirst == true)
{
// 註冊公告事件
m_pSKReply.OnReplyMessage += new _ISKReplyLibEvents_OnReplyMessageEventHandler(this.m_pSKReply_OnAnnouncement);
// 註冊登入帳號事件
m_pSKOrder.OnAccount += new _ISKOrderLibEvents_OnAccountEventHandler(m_OrderObj_OnAccount);
isFirst = false;
}
// 不用 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() 是方法,語法如下:
/// <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 憑證語法才會通過喔。
使用群益的憑證安裝程式,要看到以下的畫面,才算是憑證合格喔。
憑證合格以下的程式碼才會通過。
// 下單物件初始化
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;
}
在群益開戶可以同時開多個帳戶,而下單可選擇其中一個帳號執行,下面的語法就會列出所有的下單帳號。
//取得下單帳號
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()
之後會等待事件回傳,接下來就是看回傳的語法。
/// <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 顯示,
當有多個帳號時,在下單時就可以依不同帳號下單。
當程式執行後,輸入正確的帳號及密碼,就會有以下的畫面。
執行過程的訊息就會在下面顯示,成功和失敗都會顯示訊息。
當完成了登入測試之後,我們就可以將帳號及密碼儲存下來,以方便之後的報價及下單直接使用,不需要在每個地方都要輸入帳號密碼。
我選擇儲存的方式是將存有資訊的物件序列化,寫入實體檔案,下次需要時就直接讀取檔案反序列化就行。
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();
付費後可下載此篇文章教學程式碼。
【C# 群益 API 開發教學】取得商品報價、Tick、最佳 5 檔教學 #CH3 (附範例)
【C# 群益 API 開發教學】範例下載與安裝環境 #CH1
【C# 群益 API 開發教學】期貨演算法交易訊號檢查,比較商品價格差異 #CH4 (附範例)