iT邦幫忙

0

【C# 群益 API 開發教學】帳號登入、取得下單帳號教學 #CH2 (附範例)

群益 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 範例時,有安裝過他的元件,但是在新專案開發時,還是需要手動引用元件才行。
在專案的參考,按右鍵「加入參考」。

然後選擇「瀏覽」。

找到群益 API 範例裡面的元件「SKCOM.dll」,而目錄是 x64或 x86 依你的電腦而定。

加入之後,在參考內看到「SKCOMLib」就行了喔,接下來就可以繼續寫程式了。

註冊問題排除

如果你已經註冊了元件,而程式要引用「SKCOM.dll」一直出現失敗,應該是註冊時失敗,錯誤原因可能是你放在 C 槽之外註冊會失敗。

解決方法有 2個

  1. 可以把元件放在 C 槽之後,用管理者再註冊一次。
  2. 如果你是 x64 環境,直接把 SKCOM.dll 元件複製放到 「C:\Windows\SysWOW64」裡面去,也會註冊元件。

群益 API 登入測試

我在設計介面上有一個主要功能是「登入測試」,在登入動作裡面是檢查帳密正確性,以及取得下單帳號。

程式碼閱讀前提醒

以下的程式碼是針對重點功能拿出來講解,並加上我的註解,幫助第一次使用群益 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();

文章總結

  1. 確保群益 API 範例正常執行後,才開始開發自己的程式交易
  2. 新專案只要引用「SKCOM.dll」即可。
  3. 電腦需安裝群益憑證。
  4. 複製登入程式碼並取得下單帳號。

範例下載

以上的範例是局部的說明,如果要看完整程式碼請點此下載

相關學習文章

【C# 群益 API 開發教學】取得商品報價、Tick、最佳 5 檔教學 #CH3 (附範例)
【C# 群益 API 開發教學】範例下載與安裝環境 #CH1
【C# 群益 API 開發教學】期貨演算法交易訊號檢查,比較商品價格差異 #CH4 (附範例)


尚未有邦友留言

立即登入留言