【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 (附范例)


<<:  渗透测试-列举可用的服务和资源

>>:  内容传递网路是什麽?网站停机的可能原因

.NET Core第16天_AnchorTagHelper的使用

AnchorTagHelper(锚点标签协助程序) 为将HTML封装後的定位标签类别程序 Ancho...

Chapter1-DJ最爱的音频动感图像(IV)让音乐动起来!开篇基础设定和动画框架

话不多说先上图 从左到右依序执行,最後该函式会再呼叫自己一次,图中淡化的区块是下个章节的主题 然後把...

Day 2 - Home Lab 事前准备 - 安装篇

在 Day 1 时,我们有稍微提到了 Home Lab 可以使用一般的桌上型电脑来建置,那今天我们要...

Day 4 python回圈

今天我们要介绍的是python当中的FOR回圈,所谓的回圈就是只我们如果要在某个条件下要重复做某些事...

D12-(9/12)-原相(3227)-任天堂概念股

注:发文日和截图的日期不一定是同一天,所以价格计算上和当日不同,是很正常的。 声明:这一系列文章并无...