摘要:調用盈透的API(2次開發)可是構建自己的交易程序、獲取市場數據與圖表、查看自己的賬戶數據。本文使用C#語言,對盈透的API進行2次開發, 獲取指定賬戶信息。本文暫不描述構建交易程序、獲取市場數據等內容,但原理是相似的。

1 盈透簡介

美國盈透證券(英文名為Interactive Brokers,業內簡稱IB或IB盈透)是全美營收交易量最大的頂尖互聯網混業券商,盈透證券於2007年5月在納斯達克上市,美股代碼為IBKR,目前綜合股本約50億美元,標普評級高於美國銀行、花旗銀行等。截止2016年11月底,盈透證券的客戶總資產約846億美元。盈透證券是第一家在中國證監會登記,接受中國大陸監管、成立代表處的美國網路券商,也是目前唯一的一家[1]。

盈透支持大量語言的調用, 官方截圖如下

圖 盈透支持的介入技術

為什麼選擇C#?答案如下圖

圖中暗示:C#是首選開發語言,其中文檔也是最全面的。

盈透C#官方的開發文檔如下:interactivebrokers.com/

考慮到交易軟體分分鐘幾百萬上下,還是選擇文檔齊全的方案最好。

2 開發步驟

2.1 下載安裝IB API

盈透的API調用本質上是通過開發程序調用盈透正在運行的TWS來獲取信息,並非直接掉用盈透本身的Service。 為什麼這樣設計?推測可能是考慮到安全性。

所以, 我們先需要下載IB API, 地址:interactivebrokers.github.io 請讀者根據不同的操作系統選擇適合的版本。 強烈推薦選擇穩定版,原因:跟交易有關,不要當小白鼠。

IB API 下載界面

下載後,可以得到「TWS API Install 972.18.msi」。安裝後可以在安裝目錄下得到兩個範例項目源碼。一個是winform、另一個是ConsoleApplication。本文使用ConsoleApplication做為範例。

2.2 下載安裝TWS

TWS下載地址:interactivebrokers.com/

安裝後可以使用以下界面輸入賬號、密碼進行登錄。

登錄以後,得到如下界面

注意(敲黑板),此時如果直接使用2.1中ConsoleApplication調用是會報錯的。 錯誤大致內容:「服務端主動拒絕請求」。解決方案:使用盈透,工具,配置,如下圖勾選並應用。

點擊應用後,可以使用IB API Console Application正常連接。

2.3 理解、使用IB API

打開Testbed.sln項目後看到下圖,其中不建議嘗試修改CSharpAPI中的內容[2]。

背景知識:

EWrapper: 類似於CTP中的SPI類,提供回調函數

EClientSocket:類似於CTP中的API類,提供主動函數

EReaderOSSignal:一個信號量,回調函數管理線程需要監聽該信號量,當socket收到數據後該信號量會被觸發

EReader: 當上面的信號量被觸發後,用戶需要調用EReader中的處理信息函數,來觸發EWrapper中對應的回調函數

實時賬戶介面:9496, 模擬賬戶介面:9497;

Testbed項目中,Program.cs文件下,private static void accountOperations(EClientSocket client) 中有大量我們所需要的方法。 本文只談獲取AccountSummary方法,簽名如下:

client.reqAccountSummary(9001, "All", AccountSummaryTags.GetAllTags());

由於Main函數中採用多線程的方式, 開發者不可避免幾個問題:即,

1 如何得知Testbed花了多久與TWS進行通信,並得知了所有的AccountSummary信息

2 如何跨 線程通信獲取最終結果AccountSummary?

本文給出了一個可行,但不完美的解決方案:

1 定義AccountSummary,如下圖

2 EWrapperImpl類,accountSummary方法中,計數Account為21個屬性時,即認為AccountSummary已經被賦值完畢。 這個方案可用,但是並不完美。因為盈透如果升級賬戶信息,屬性數量有可能超過21

3 由於涉及到多線程之間的通信 ,解決思路有3:事件、互斥鎖(mutex)、信號量。 作者採用事件方式來實現。 即, 在EWrapperImpl中定義

public event EventHandler AccountSummaryFetched; 在下面方法執行中,如果調用超過21次,即觸發AccountSummaryFetched事件。

public virtual void accountSummary(int reqId, string account, string tag, string value, string currency)

4 Main函數中訂閱事件,並得到AccountSummary的結果

上代碼.

Github:github.com/memoryfracti

3 小結

本文基於盈透API,使用C#開發應用程序成功獲取賬戶內信息。未完待續,後續將繼續完善Utilities,使其具備訂單、獲取實時數據等功能。

4 參考資料

[1] 盈透證券---簡介

[2] 許哲 盈透API的一個極簡單SDK

推薦閱讀:

相關文章