[C#][Console] 群益 API 串接報價 + Socket Server 教學 #CH1

群益是國內證券期貨交易券商,提供股票、期貨、選擇權等金融商品買賣,我們平常可以使用券商的下單軟體交易,也可以利用程式串接券商 API 取得報價及程式下單。

此範例會教學如何在 C# 主控台 (Console) 建立群益報價連線,然後再建立 TCP/IP 的 Socket Server,提供其他程式串接取得報價。

這次的範例成品就稱之為 “報價機” ,之後的教學會再建立 ASP.NET Core MVC 串接我們的報價機,將取得的價格顯示在網頁上。

開發前準備

在串接群益 API 之前,需要先有群益帳戶、申請 API 和安裝憑證等動作,
關於群益 API 的安裝環境可參考另一篇文章:群益 API 官方範例下載與安裝環境

建立專案

開啟 Visual Studio 2022,建立新專案為「主控台應用程式」。

開啟 Visual Studio 2022,建立新專案為「主控台應用程式」

輸入專案名稱、路徑,架構選擇「.NET 6.0」版本,按下「建立」就會建立此專案。

從 .NET 6.0 開始,Console 主程式預設程式變的很簡短,第一次看會有點不習慣,怎麼看不到 Main() 呢?
這是因為 .NET 6.0 新架構寫法把 Main() 隱藏起來了,看不習慣的話,改成以下語法還是可以正常執行,而且這兩種寫法代表相同的程式:

附加群益 API 元件

接著要引用群益的元件至專案之中,群益 API 可至官網下載。

群益 API 元件

下載之後解壓縮就會有元件。
在專案的「相依性 > 新增 COM 參考」點擊,

在專案的「相依性 > 新增 COM 參考」點擊

然後選擇「瀏覽」,

在專案的「相依性 > 新增 COM 參考」點擊

尋找本機電腦的群益 API 元件,檔名是「SKCOM.dll」,要注意版本是 x64 或 x86 (現在大部份電腦都已升級至 x64 位元了)。

在專案的「相依性 > 新增 COM 參考」點擊

完成後在專案底下會出現此元件。

群益 API 元件

建立主程式類別

這裡我新增一個類別叫 “CapitalQuote”,接下來群益 API 串接和 Socket Server 程式碼都會寫在這類別裡面。

同時在 Program.cs 增加語法物件化此類別。

CapitalQuote quote = new CapitalQuote();

建立主程式類別

群益報價連線

在 CapitalQuote 屬性宣告群益 API 物件:

宣告好 Api 物件後,就可以引用元件。

群益 API 物件

註冊群益事件及登入群益

群益 API 有許多事件都需要由券商主動回報,在回報之前,我們需要先註冊事件接收方法,讓券商呼叫。
註冊事件之後就直接登入群益帳戶。
我在 CapitalQuote 的建構子加入以下語法:

接著我們宣告一些事件接收方法。

其中兩個事件 m_SKQuoteLib_OnNotifyTicks()m_SKQuoteLib_OnNotifyBest5() 都是群益回報最新的 Tick 與五檔價格,當我們收到之後,就會利用 Socket 再回傳給前端,而回傳方法 SendTCP() 等到下面建立 Socket 時再新增。

Socket Server

接著要增加 Socket Server 的程式碼,在 CapitalQuote 屬性宣告 Socket Server 相關物件:

Socket 類別

這裡有一些新的物件,我將 Socket 所傳遞的內容都宣告成不同的類別,在傳送時,先將物件轉換成 Json,再轉換成 Byte[] 後傳送。
當收到 Byte[] 時反向處理,將 Byte[] 轉 Json,再轉成物件。

我建了一個 “Models” 目錄,將會用到類別都放在這裡。
在這個範例我會用到兩個報價類別,分別是 Tick 和 Best5 ,一個使用者類別 ClientInfo,一個報價需求類別 RequestQuotePacket,但是我針對傳送的類別宣告一個介面 (interface) 來規範必要欄位。

在 “Models” 目錄下,新增介面: IPacket

Socket 類別

接著新增類別: TickPacket

新增類別: Best5Packet

新增使用者類別: ClientInfo

新增報價需求類別: RequestQuotePacket

新增訂閱商品名稱類別 RequestSymbol

新增使用者訂閱名單類別 UserRquest

使用者訂閱名單類別

建立 Socket Server

在 CapitalQuote 的建構子加入以下語法:

建立 Socket Server

TCP 監聽

在建構子中的語法 TCPListen 是一個新方法,目的在監聽封包,而我建立新執行緒來執行這個方法。

新增 TCPListen() 方法:

補充共用方法:

處理接收封包內容

我們在 TCPListen() 方法內會接收封包流量,當收到完整的封包內容後,就會執行解析內容,解析方法是 ProcessReceive(),所以繼續新增此方法:

我們從封包收到的內容,都會先轉型回物件,這是需要發送端也使用相同的物件發送才行,發送端就留到下一篇章再來介紹。

傳送封包至客戶端

在前面收到群益 Tick 與五檔時,會將此價格重新傳送給客戶端,這裡新增傳送方法 SendTCP()

客戶端離線事件

TCP Socket 有連線事件,那也就會有離線事件,在 TCPListen() 方法內會接收封包,如果客戶端斷線了,我們就執行客戶端離線事件方法 Disconnect()

好了,我們所有的程式碼都貼完了,是不是覺得有點複雜,第一次看 Socket 的語法一定會看不懂,這是很正常的,要搞懂 Socket 的封包需要慢慢 Debug 才會比較明白。

目前我們執行的語法只有一半而已,這是伺服器端的程式,在下一章節我們再來介紹客戶端的程式。
等客戶端開始串接伺服器端程式後,這個範例就可以正式運作了。

範例下載

連結 GitHub 下載範例

下一篇教學文章

相關學習文章

如果你在學習上有不懂的地方,需要諮詢服務,可以參考站長服務,我想辨法解決你的問題
如果文章內容有過時、不適用或錯誤的地方,幫我在下方留言通知我一下,謝謝

加入社團一起討論

關注我的 IG