【C# 群益 API 開發教學】期貨委託下單測試 #CH4
群益 API 是利用自己開發的程式,結合群益 API 在群益券商下單的一種方式,通常是做程式交易下單,或是單純讀取報價也行。
這個章節是簡單的委託下單測試,選擇商品、價格、買賣方向等資料,送出委託單給券商。
此範例教學是我看群益 API 的範例,再重新做出我要的程式交易功能。
如果需要實際操作才好學習的話,在最後我會提供原始碼範例下載連結,可以在自己電腦執行看看。
我在寫程式碼時盡量把註解說明清楚一點,這樣可以幫助想學習的人看懂一些,完整的功能還是要看官方的文件和範例喔。
Contents
前置作業
群益 API 官網範例下載位置: 群益 API
此篇文章的內容是接續上一篇文章繼續說明,在上一篇裡面,我們完成了期貨商品報價功能。
這一章節就先做一個簡單的下單測試,學會了下單之後,就可以編寫交易策略來下單。
群益 API 下單介面設計
打開 VS 之後,可以照我的畫面,拉出這個設計檢視。
上面紅色字是控制項與 ID,好方便以下程式碼對應。
上面的欄位都是期貨下單會用到的欄位,最後增加一個按鈕來送出委託單。
群益 API 程式碼說明
閱讀前提醒一下,我只會將重點語法拿出來講解喔,想要看完整程式碼及操作的話,可以到文末下載範例來看。
Form_Load 初始化動作
屬性初始化群益 API 物件。
1 2 3 |
SKCenterLib m_pSKCenter = new SKCenterLib();//登入&環境物件 SKOrderLib m_pSKOrder = new SKOrderLib();//下單物件 SKReplyLib m_pSKReply = new SKReplyLib();//回應物件 |
在表單開啟時,增加下拉的項目。
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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
// 加入商品下拉 cboSymbolCode.Items.Add(new ComboboxItem("TX00", "大台指期近月")); cboSymbolCode.Items.Add(new ComboboxItem("MTX00", "小台指期近月")); cboSymbolCode.Items.Add(new ComboboxItem("TE00", "電子期近月")); cboSymbolCode.Items.Add(new ComboboxItem("ZE0000", "小型電子期近月")); cboSymbolCode.SelectedIndex = 0; // 加入方向下拉 cboBuySell.Items.Add(new ComboboxItem("0", "BUY")); cboBuySell.Items.Add(new ComboboxItem("1", "SELL")); cboBuySell.SelectedIndex = 0; //加入方式下拉 cboTradeType.Items.Add(new ComboboxItem("0", "ROD")); cboTradeType.Items.Add(new ComboboxItem("1", "IOC")); cboTradeType.Items.Add(new ComboboxItem("2", "FOK")); cboTradeType.SelectedIndex = 0; // 加入倉別下拉 cboNewClose.Items.Add(new ComboboxItem("0", "新倉")); cboNewClose.Items.Add(new ComboboxItem("1", "平倉")); cboNewClose.Items.Add(new ComboboxItem("2", "自動")); cboNewClose.SelectedIndex = 0; // 註冊群益 API 事件 m_pSKReply.OnReplyMessage += new _ISKReplyLibEvents_OnReplyMessageEventHandler(this.m_pSKReply_OnAnnouncement); //公告 m_pSKReply.OnNewData += new _ISKReplyLibEvents_OnNewDataEventHandler(this.m_SKReplyLib_OnNewData);//交易回報事件 // 取出序列化使用者 string path = ConfigurationManager.AppSettings["UserSavePath"]; if (File.Exists(path + "\\" + "UserProfile")) { FileStream fs = new FileStream(path + "\\" + "UserProfile", FileMode.Open); IFormatter formatter = new BinaryFormatter(); user = (UserProfile)formatter.Deserialize(fs); fs.Close(); if (user.FutureAccount == "") { MessageBox.Show("尚未設定期貨下單帳號"); return; } } else { MessageBox.Show("請先儲存帳號設定"); return; } |
最下面的語法:m_pSKReply.OnNewData += new _ISKReplyLibEvents_OnNewDataEventHandler(this.m_SKReplyLib_OnNewData);//成交回報事件
是接收下單之後委託回傳結果,委託、成交或取消狀態都會經由這個事件方法回傳。
送出委託單
首先登入帳號及取得憑證,接著建立下單物件後送出至券商。
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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 |
/// <summary> /// 送出委託單 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnSendEntrust_Click(object sender, EventArgs e) { if (cboSymbolCode.Text == "") { MessageBox.Show("請輸入 [商品]"); return; } if (txtPrice.Text == "") { MessageBox.Show("請輸入 [價格]"); return; } if (cboBuySell.Text == "") { MessageBox.Show("請輸入 [方向]"); return; } if (cboTradeType.Text == "") { MessageBox.Show("請輸入 [方式]"); return; } if (cboNewClose.Text == "") { MessageBox.Show("請輸入 [倉別]"); return; } if (txtQty.Text == "") { MessageBox.Show("請輸入 [口數]"); return; } if (isLogined == false) { // 群益登入 m_pSKCenter.SKCenterLib_SetAuthority(1); // 呼叫群益帳號登入 nCode = m_pSKCenter.SKCenterLib_Login(user.CapitalUserId, user.CapitalUserPwd); // 取得回傳訊息 string msg = GetMessage("登入", nCode); if (nCode != 0 && nCode != 2003) { // 失敗 txtMessage.AppendText(msg + "\n"); return; } // 下單物件初始化 nCode = m_pSKOrder.SKOrderLib_Initialize(); msg = GetMessage("下單物件初始化", nCode); txtMessage.AppendText(msg + "\n"); // 讀取憑證 nCode = m_pSKOrder.ReadCertByID(user.CapitalUserId); if (nCode != 0 && nCode != 2005) { // 失敗 msg = GetMessage("讀取憑證", nCode); txtMessage.AppendText(msg + "\n"); return; } isLogined = true; } //建立期權下單物件 FUTUREORDER pFutureOrder = new FUTUREORDER(); pFutureOrder.bstrFullAccount = user.FutureAccount;//期貨帳號,分公司代碼+帳號7碼 pFutureOrder.bstrPrice = txtPrice.Text;//委託價格,「M」表示市價,「P」表示範圍市價 pFutureOrder.bstrStockNo = ComboUtil.GetItem(cboSymbolCode).Value;//委託期權代號 pFutureOrder.nQty = Convert.ToInt32(txtQty.Text);//交易口數 pFutureOrder.sBuySell = Convert.ToInt16(ComboUtil.GetItem(cboBuySell).Value);//0:買進 1:賣出 pFutureOrder.sDayTrade = 0;// 當沖0:否 1:是,可當沖商品請參考交易所規定。 pFutureOrder.sTradeType = Convert.ToInt16(ComboUtil.GetItem(cboTradeType).Value); //方式;0:ROD 1:IOC 2:FOK pFutureOrder.sNewClose = Convert.ToInt16(ComboUtil.GetItem(cboNewClose).Value);//新平倉,0:新倉 1:平倉 2:自動{新期貨、選擇權使用} pFutureOrder.sReserved = 0;//盤別,0:盤中(T盤及T+1盤);1:T盤預約 string orderNo = ""; nCode = m_pSKOrder.SendFutureOrder(user.CapitalUserId, false, pFutureOrder, out orderNo); //採用同步呼叫 txtMessage.AppendText(GetMessage("期貨委託", nCode) + "\n"); if (nCode == 0) { txtMessage.AppendText("委託成功!委託序號:" + orderNo); } else { txtMessage.AppendText("委託失敗!原因:" + orderNo); } txtMessage.ScrollToCaret(); } |
這樣是基本的下單語法,如果要開發下單功能之前,可以先用以上語法確認一下送委託單是否正常。
交易回報事件
當送出交易後,交易結果就會透過 OnNewData
事件回傳,接受語法如下:
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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
/// <summary> /// 交易回報事件 /// </summary> /// <param name="strUserID"></param> /// <param name="strData"></param> void m_SKReplyLib_OnNewData(string strUserID, string strData) { try { txtMessage.AppendText("交易回報資料:" + strData); string[] datas = strData.Split(','); // 委託序號 string entrustNo = datas[0]; if (entrustNo == "") { entrustNo = datas[47]; } // 交易狀態 string OrderStatus = ""; string date = ""; double? TradePrice = null; if (datas[2] == "N") { OrderStatus = "委託"; } else if (datas[2] == "D") { OrderStatus = "成交"; //成交時間 date = datas[23]; if (date.Length == 8) { date = date.Substring(0, 4) + "/" + date.Substring(4, 2) + "/" + date.Substring(6, 2); } // 成交價格 TradePrice = Convert.ToDouble(datas[11]); } else if (datas[2] == "C") { OrderStatus = "取消"; } // 交易訊息 string OrderMsg = ""; if (datas[3] == "Y") { OrderMsg = "失敗"; } else if (datas[3] == "T") { OrderMsg = "逾時"; } txtMessage.AppendText($"交易結果:單號={entrustNo} 狀態={OrderStatus} 成交時間={date} 成交價格={TradePrice}"); } catch (Exception ex) { MessageBox.Show(ex.Message); txtMessage.AppendText(ex.Message + "\n" + ex.StackTrace + "\n"); } } |
傳入的資料是用 , (逗號) 分隔的資料,需要看文件算位置來拆解資料,我提供幾個重要資訊抓取的位置,其他的資訊可以看文件說明。
重要的程式碼我就貼上來講解一下,剩下基本運作的程式碼再自己下載範例來看喔。
執行畫面
我的帳號裡面故意沒放錢,所以才會得到保證金不足,如果有保證金的話,就會顯示交易單號。
建議你們測試時,也可以不放錢在裡面,看到保證金不足,也表示運作是正常的。
注意:
如果真要放保證金執行的話,也要確認好要交易的標的及方向再執行喔。
重點整理
- 建立下單的下拉選項
- 登入群益帳號
- 建立下單委託物件
- 送出委託單取得交易單號
範例下載
相關學習文章
如果你在學習上有不懂的地方,需要諮詢服務,可以參考站長服務,我想辨法解決你的問題
如果文章內容有過時、不適用或錯誤的地方,幫我在下方留言通知我一下,謝謝
請問老師這是最新版本嗎?因今年又大版更….要雙憑證認證..謝謝..
目前程式碼適用最新版本喔