[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 下載範例

下一篇教學文章

相關學習文章

如果你在學習上有不懂的地方,可以參考專業諮詢或線上家教服務,我想辨法解決你的問題
如果文章內容有錯誤的地方,幫我在下方留言通知我一下,謝謝
喜歡我的文章,請幫我在上方綠色拍手圖示按 5 下,也歡迎按月贊助,鼓勵我繼續創作,謝謝

加入社團一起討論

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。

1 × 2 =