元大API即時行情串接(三)

為了取得即時的報價,更詳細的raw data,除了可以方便我們做股票、期貨等金融商品的分析。最重要的是,可以用來做自動下單、高頻交易、隨到隨撮等的用途。

Jerome Lin
Coding Learning Sharing
8 min readFeb 28, 2020

--

本篇接續著第二篇元大API即時行情串接(二),在介紹完如何建置環境、導入API元件並確認連線功能後,接下來將要介紹更多可用的功能。本篇主要注重在追蹤連線狀態,以及連線異常發生時的提示通知顯示

首先我們要先來了解該API元件可用的功能,在Visual Studio 2019編譯器中,在已加入的參考上點擊"滑鼠右鍵",可以開啟"物件瀏覽器",從"物件瀏覽器"視窗可以查看已加入的參考詳細功能。如下所示:

物件瀏覽器中常見圖示說明如下:

官方的說明文件網址:

雖然API官方已經有附上說明文件,網址如下:

但透過物件瀏覽器查看方法與相關說明,可以彌補API官方文件說明的不足,幫助我們更了解該如何運作以及如何運用。

為了達成追蹤連線狀態,以及連線異常發生時的提示通知顯示,我們得先認識委派(Delegate)、事件(Event)、方法(Method)之間的關係。

委派(Delegate)可以用來組織一個事件(Event),以及註冊事件(Event)。當某些條件符合,致使該事件(Event)被觸發時,就能夠執行當初透過委派(Delegate)所連結的方法(Method),來做出正確、對應的反應動作。

需要另外一提的是,方法(Method)的傳入參數(包括型別以及數量)以及回傳型別,必須與委派(Delegate)的傳入參數(包括型別以及數量)以及回傳型別相同,這樣才能正常進行調用。

為何要拐彎抹角呢?我們可以只透過條件式判斷來執行對應的方法啊?這是為了幫助我們有一個更完善程式設計模式,讓靈活性提升。假如今天(1)有越來越多的動作需要進行實現,可能是動作需要做變換或修改,並且(2)可能對應到"額外"不同的情況,這些情況可能是舊有的,也可能是需要額外新增的

(1)根據要添加的動作所新增的不同方法(Method),容易導致主功能也要跟著修改。但若透過委派(Delegate)連結這些方法(Method),我們可以只修改方法(Method)即可。

(2)使用委派(Delegate)能更靈活地讓我們根據不同事件(Event)來做反應,只需要根據不同情況連結對應的方法(Method)。

而行情API已經幫我們定義好委派(Delegate)以及事件(Event)了,所以我們只需要去實作出方法(Method)實現我們想要做的動作,然後進行事件註冊就行了!!!

追蹤連線狀態,以及連線異常發生時的提示通知顯示對應的委派(Delegate)以及事件(Event)分別如下:

public event AxYuantaQuoteLib._DYuantaQuoteEvents_OnMktStatusChangeEventHandler AxYuantaQuoteLib.AxYuantaQuote.OnMktStatusChange

public delegate void _DYuantaQuoteEvents_OnMktStatusChangeEventHandler(object sender, AxYuantaQuoteLib._DYuantaQuoteEvents_OnMktStatusChangeEvent e)

然後打開副檔名為"Designer.cs"的檔案,找到"InitializeComponent()"函式:

我們之所以要知道這個函式,是因為我們要將註冊事件的程式碼添加在此,這可以幫助我們將功能實作做分離。在執行程式,初始化組件的時候便能進行註冊事件。

註冊事件的語法為,new關鍵字用來實體化委派(Delegate):

Event += new Delegate(Method);

為了添加註冊事件的程式碼,我們找到註解為"axYuantaQuote"的區塊:

至此,我們需有的觀念以及資訊都有了。

我們實作的過程基本上從決定動作並實現,再來才是註冊事件

觀察剛剛提到的委派(Delegate) _DYuantaQuoteEvents_OnMktStatusChangeEventHandler的傳入參數,我們知道要實作的方法(Method)必須得有一個object以及一個AxYuantaQuoteLib._DYuantaQuoteEvents_OnMktStatusChangeEvent物件(Class)。

以下為自訂的方法(Method),方法名稱、傳入參數名稱可以自行修改,我們將這個函式添加於副檔名為"cs"的檔案中(比如主介面檔案):

private void AxYuantaQuote_OnMktStatusChange(object sender, AxYuantaQuoteLib._DYuantaQuoteEvents_OnMktStatusChangeEvent e){
//欲添加的動作
...
}

再來是將此函式透過委派(Delegate)進行註冊事件,我們找到副檔名為"Designer.cs"的檔案=>"InitializeComponent()"函式=>找到註解為"axYuantaQuote"的區塊,在其下方添加程式碼:

this.axYuantaQuote.OnMktStatusChange += new AxYuantaQuoteLib._DYuantaQuoteEvents_OnMktStatusChangeEventHandler(this.AxYuantaQuote_OnMktStatusChange);

簡單兩步驟,就能監控連線狀況!!!

官方文件有提到如何得知連線狀態改變時的詳細資訊:

這個資訊基本上會儲存在以下變數中:

string AxYuantaQuoteLib._DYuantaQuoteEvents_OnMktStatusChangeEvent.msg

根據我們自訂的方法(Method)AxYuantaQuote_OnMktStatusChange()的傳入參數中,我們有一個e代表著AxYuantaQuoteLib._DYuantaQuoteEvents_OnMktStatusChangeEvent物件,這意味著,我們只需要呼叫以下程式碼便能知道連結狀態代碼:

e.msg.Substring(0, 1);
//or
e.msg[0];

以下附上相關執行情況:

1. 正常登入

2. 斷網,導致結束連線

3. 設定重新連線次數以及重新連線間隔等等

4. 網路狀況排除後,正常登入

本篇實現了追蹤連線狀態,以及連線異常發生時的提示通知顯示相關功能,並且對委派(Delegate)、事件(Event)、方法(Method)之間的關係以及用法有了初步的認識。重點是在實作過程中,我們甚至不需要知道連線狀態改變時,該如何追蹤的程式碼,我們只需要實作想要做的動作、註冊事件即可,整個過程被大大地簡化了。

--

--

Jerome Lin
Coding Learning Sharing

覺得平凡就好,但還是多少充實一下人生。It feels good to be ordinary, but you still need to enrich your life a little bit. Buy Me A Coffee: https://www.buymeacoffee.com/jeromelinil