群益 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个
可以把元件放在 C 槽之后,用管理者再注册一次。如果你是 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 DMAm_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();
文章总结
确保群益 API 範例正常执行后,才开始开发自己的程式交易新专案只要引用「SKCOM.dll」即可。电脑需安装群益凭证。複製登入程式码并取得下单帐号。範例下载
付费后可下载此篇文章教学程式码。
相关学习文章
【C# 群益 API 开发教学】取得商品报价、Tick、最佳 5 档教学 #CH3 (附範例)
【C# 群益 API 开发教学】範例下载与安装环境 #CH1
【C# 群益 API 开发教学】期货演算法交易讯号检查,比较商品价格差异 #CH4 (附範例)