元大API即時行情串接(二)
為了取得即時的報價,更詳細的raw data,除了可以方便我們做股票、期貨等金融商品的分析。最重要的是,可以用來做自動下單、高頻交易、隨到隨撮等的用途。
本篇接續著第一篇元大API即時行情串接(一),在介紹完行情API相關觀念以及環境安裝之後,將緊接著介紹更進一步的串接觀念與步驟。所以在使用元大行情API之前,我們必須先知道它的流程以及相關的連線資訊。
首先,我們透過此API去請求資料的對象資料如下:
主機IP: 203.66.93.84
Domain: apiquote.yuantafutures.com.tw
T盤Port: 80 or 443
T+1盤Port: 82 or 442
有了伺服器端的IP位址以及對應的主機的Port number,我們就能鎖定位置,再來是一個簡化的流程:
大體上,我們的目的會是使用API元件,將裡面封裝好的函式庫進行呼叫並進一步相關實現功能,當某些條件觸發後(如設定時間觸發等等,像是從開盤前開始啟動並抓取),向Server端請求連線,待建立連線完成後,便能像Server端進行商品註冊,當Server端進行資料更新後會回傳目標資料回來並觸發資料更新事件,最後透過我們實作的程式來接收資料來做後續處理與分析。
所以整個步驟整理如下:
1. 設定程式排程,開盤、試撮前N分鐘啟動程式。
2. 透過時間觸發向伺服器端請求並建立連線。
3. 註冊商品以及請求資料的動作。
4. 在目標商品的交易時間內進行即時的偵測,等待伺服器端進行資料更新與回傳。
5. 交易時間結束,結束偵測工作,開始整理並備份資料。
6. 關閉程式,重新等待時間排程觸發 或是 保持等待下一次的交易時間,重複2.-5.的動作。
那要選擇哪種程式語言來實作呢?
考慮到介面化需求以及API使用到的COM元件需求等等,這邊使用C#進行實作,除了能夠以拖曳的方式進行介面的規劃,其畫面更新以及線程之間的運作與溝通方式容易進行指定及編寫。
而元大也有提供幾種不同程式語言的範例參考,以下兩個選項擇一即可,後面相關步驟皆以(1)(/1)、(2)(/2)標示:
(1)因為我們本次選用C#做為開發語言,我們先下載"國內行情API C# 範例",需要用到裡面提供的dll檔以及API元件。(/1)
(2)不須額外下載任何檔案。(/2)
相關網址以及網頁畫面如下。
排程的問題,我也有發表一個關於Windows排程為主題的文章,各位可以自行參考參考。
所以首先我們要先進行環境建置,我選用的IDE為Visual Studio 2019,雖然整個硬碟占用量相對較大,但以設計Windows Application來說,功能相當完整,好操作,是一個不錯的選擇。
在我們建置好C# Windows Forms App專案之後,我們會需要先將元大API用到的COM元件進行匯入並參考。
首先,可以看到IDE專案介面右方方案總管(預設在右上角),有一個"參考"選項,對它點擊右鍵,選擇"加入參考"。
接著,選擇"COM",並勾選"YuantaQuote ActiveX Control module",如此我們就成功在本專案中加入了"AxYuantaQuoteLib"函式庫。
(1)然後打開先前下載的"國內行情API C# 範例"先解壓縮,其資料夾結構如下,裡面有兩個dll檔案會是我們需要進行匯入的。
將"AxInterop.YuantaQuoteLib.dll"以及"Interop.YuantaQuoteLib.dll"添加至我們的專案中,放在相同的資料夾位置底下("…/bin/Debug")。
同樣地,我們打開"參考管理員",使用"瀏覽"功能將這兩個dll檔添加至參考。
接著為了在程式碼中引入API元件,我們先將"國內行情API C# 範例"開啟,專案檔位置如下:
開啟後,可以發現其實這個範例其實介面就已經很簡潔完整,但每個人都會有不同的需求,可能會需要將自己的交易策略或者模擬程式導入等等,亦或是只是想要儲存交易日即時交易資訊,都會需要客製化。
上圖紅框處便是API元件,我們將它複製,貼到我們自己建立的專案中,將API元件進行引入,如此才能透過這個物件進行功能呼叫。(/1)
(2)選擇"工具箱",並在"一般"底下空白處點擊"滑鼠右鍵",選擇選單項目"選擇項目",可以開啟"選擇工具箱項目"視窗,切換至"COM元件"分頁,選擇"YuantaQuote Control"後,就能在工具箱添加我們要的API元件。(/2)
切換回到主介面設計視窗,添加完剛剛複製的API元件之後,可以看到有一個相同圖案的Yuanta元件出現了,從屬性頁面可以看到相關屬性資訊。
到現在為止,我們已經將幾個必要的元素建置完成,可以開始進行串接工作。
開始串接的第一步,得先確定能夠完成連線功能,我們可以先在主介面上先拉幾個Label以及Text Box,以顯示與輸入連線資訊。
基本上會需要四個資訊,分為兩個部分,第一個部份便是最一開始在本篇先提到的連線對象資訊,也就是Server端提供一般交易時間的接口位置,需要IP位址(或對應的Domain Name)以及Port Number,這兩個資訊基本上是固定的,我們可以先預設好。再來第二部分為帳戶資訊,需要提供當初向證券商申請的帳戶帳號以及密碼進行登入。
有了基本的四項資訊後,接著要使用到以下函式:
void axYuantaQuote.SetMktLogon(string<帳號>, string<密碼>, string<伺服器IP>, string<主機Port Number>, int<金融商品代碼>, int<Map代碼>);
axYuantaQuote為先前我們宣告的API元件物件。
金融商品代碼部分,1代表股票,2代表期貨,針對個人要使用到的服務,請設置正確。
Map代碼部分,只是要給本次連線一個代表符號而已,可以固定設置為0。
所以將以上的介面、連線資訊、帳號等等都整合在一塊,可以再加設一個登入按鈕,便能實現一個登入功能。這個連線功能,未來可以透過手動點擊登入按鈕或者定時進行連線的觸發。
註:專案在編譯之前,請切換成以x86平台為主的方式,API只支援x86。
完成後的運作畫面可以設計成如下:
此外,我們還能以try, catch進行例外訊息的捕捉,捕捉axYuantaQuote.SetMktLogon()函式錯誤例外訊息來顯示更為直接,知道本次請求連線的狀態是成功或是失敗,幫助我們解決初步的連線問題。
至此,我們成功進行專案環境建置,並導入API元件函式庫,最後做了初步的連線與登入。如果到這邊為止,都順利完成或解決問題了的話,代表之後的功能實作基本上會順利許多,萬事起頭難。之後,將會進一步介紹連線的例外處理(如連線中斷等連線狀態中途改變)以及註冊商品等等功能。