【TWS API 翻译系列】4、TWS API在Excel中的使用
作者:yunjinqi   类别:    日期:2022-01-03 22:06:35    阅读:1162 次   消耗积分:0 分    

可以使用的Excel API

在windows系统中利用不同的技术手段,可以开发几个API供Excel使用。

重要提醒:示例表格应用程序在API下载的时候可以一块下载,他们只是给第三方的开发者简单展示这些API功能。它们没有强大的错误处理功能,也不打算用作生产级交易工具。

提供 Excel API 技术介绍的录制网络研讨会可从 IB 网站获得:录制的 Excel API 网络研讨会

Excel API的对比


RTDServerDDEActiveX
完整的 API 功能是的,在 API v975 中***是的
易于使用的公式是的一些功能
不使用 VBA是的一些功能
旨在不压倒 Excel是的
开源是的是的
市场数据刷新率250 毫秒250 毫秒1 秒
与 64 位 Excel 兼容的示例是*是的是**

*从 v973.07
开始提供 **API ActiveX 安装程序与从 v973.05
开始的 32 位和 64 位应用程序兼容 ***从 API v975 开始,有一个新的 DDE 套接字桥 API 通过套接字连接连接到 TWS

Microsoft Excel API 的局限性

根据设计,Microsoft Excel 将用户界面置于与其他应用程序的数据连接之上。因此,Excel 仅在处于"就绪"状态时才接收更新,并且可能会忽略发送的数据,例如,当向用户显示模式对话框、正在编辑单元格或 Excel 忙于执行其他操作时,这个时候可能会忽略数据的更新。引入了新的 Excel 实时数据服务器 (RTD) API 来帮助解决其中一些限制,但它们是 Excel 作为交易应用程序所固有的,而不是特定于 API 技术。

RTD Server for Excel

介绍

TWS RTD Server API是一个动态链接库,允许用户使用Microsoft Excel®通过API从TWS请求实时市场数据。TWS RTD 服务器 API 直接使用 C# API 客户端源,该源通过socket连接到 TWS。它允许通过按照特定语法在Excel单元格中输入公式,在Excel中显示流式实时(或15分钟延迟)市场数据。

注意:在当前阶段,TWS RTD服务器API仅支持顶级市场数据(Level I 数据)。不支持交易功能或其他数据类型。延迟数据和实时数据都通过TWS RTD服务器API支持。需要市场数据订阅才能请求流式实时市场数据。

您将需要什么

- 视窗操作系统

由于 TWS RTD Server API 技术直接引用 C# API 客户端源函数,因此仅在Windows 环境中受支持。

- API 版本 9.73.03+

您需要下载IB API Windows版本9.73.03或更高版本并安装在您的计算机上。安装 API 后,可以通过选中C:\TWS API\API_VersionNum.txt(默认情况下)来验证 API 版本。

- TWS(或IB网关)Build 963+

默认情况下,通过TWS RTD服务器发送的市场数据请求将自动请求所有可能的通用价格变动类型。请求的几种通用价格变动类型仅在 TWS 963 或更高版本中受支持。将任何带有默认通用价格变动列表的 RTD 市场数据请求发送到旧版本的 TWS 将触发"TwsRtdServer 错误",指示发送了不正确的通用价格变动列表。确保TWS构建的963+是从IB网站下载的,并在后台继续运行,以便TWS RTD服务器API正常运行。

- 在TWS(或IB网关)中启用socket客户端

由于TWS RTD服务器API直接引用C#API源,因此RTD市场数据请求将通过socket发送。请确保在TWS中启用ActiveX和Socket Client设置。

另请注意您在TWS API设置中配置的socket端口。对于实时会话,TWS 将监听默认socket端口为7496,对于模拟会话,则为7497。TWS RTD Server 默认连接到端口7496连接参数部分将进一步讨论,您可以通过指定预定义的连接参数或使用rtd_complex_syntax字符串"port="来自定义要连接的端口号。您可以根据需要使用任何有效的端口进行连接,并且只需确保尝试通过 API 连接到的端口与 TWS 正在监听的端口相同。

- 微软Excel®

安装 API 后,对于从 973.03 到 973.06 的 API 版本,在计算机上注册的预编译 RTD 库文件(位于C:\TWS API\source\csharpclient\TwsRtdServer\bin\Release\TwsRtdServer.dll)将默认为 32 位。如果您使用的是 64 位 Microsoft Excel,则需要将 RTD 服务器 dll 文件重新编译为 64 位,并通过使用 Visual Studio 重新生成 RTD 源解决方案来注册库。有关详细信息,请参阅TWS Excel API,其中包含实时数据服务器录制的网络研讨会。从 API v973.07 开始,RTD Server 的 API 安装程序应与 32 位和 64 位 Excel 兼容( 预期版本号)。

TWS RTD 服务器公式语法

客户可以通过在 Excel 电子表格单元格中输入以下公式和相应的参数来请求市场数据:

=RTD(**ProgID**, **Server**, **String1**, **String2**, ...)

参数

  • ProgID = “Tws.TwsRtdServerCtrl”

  • 服务器= “” (空字符串)

  • 字符串 1字符串 2, …是表示Ticker、 Topic、 Connection Parameters或其他复杂语法字符串的字符串列表。

注意:TWS RTD 服务器 API 公式区分大小写。

有三种方法可以组成 RTD 公式:

语法示例

提供了一个资源丰富的语法示例页,用于演示使用不同语法按安全类型分类的 RTD 公式。

除了阅读书面文档外,您还可以观看TWS Excel API,其中包括实时数据服务器录制的网络研讨会,以获得更具互动性的教程视频。

输出信息速率限制

  • 请务必记住,50 条消息/秒的 API 限制适用于 RTD 服务器,其方式与其他基于socket的 API 技术相同。因此,Excel 电子表格每秒可以向 TWS 发送不超过 50 条消息。每个订阅或取消请求计为 1 条消息(不包括相反方向的消息)。因此,电子表格可以有数百个流式处理行情,但订阅必须随着时间的推移而分散,以便每秒不超过 50 个新订阅,否则电子表格可能会断开连接。

更改数据刷新率

常见错误疑难解答

简单语法

简单语法RTD公式的基本组件是ProgID, 服务器**,股票代码主题连接参数 (可选):

=RTD(ProgID, Server, Ticker, Topic, ConnectionParams...)

参数

  • ProgID = “Tws.TwsRtdServerCtrl”

  • 服务器= “” (空字符串)

股票

除了ProgIDServer之外,第一个字符串应该代表简单语法中的**Ticker。要正确定义合约Ticker,您需要先找到正确的合约属性。查找合同属性的最简单方法是直接查看TWS中的"合同描述"页面。

Ticker的语法应严格遵循以下顺序:

外汇合约:

“货币1.货币2/现金”

例如欧元。美元外汇可以定义为"欧元.美元/现金"

其他合同类型:

“品种名@交易所/PRIMEXCH/SECTYPE/到期/右派/行权价/货币”

例如,E-mini期货可定义为"ES@GLOBEX//FUT/201712///USD"

笔记:

*并非所有协定属性都需要指定。您可以将该字段留空,以使该字段未指定。按顺序,如果只需要在Ticker字符串的开头部分指定多个协定属性,则也可以按条目省略字符串的其余部分。例如,“IBM@SMART"不是指定"IBM@SMART/”,而足以正确定义合同。Ticker 字符串中有几个默认协定属性。如果未指定它们,它们将采用默认值,如下所示:

  • EXCHANGE = “SMART”

  • SECTYPE = “STK”

  • CURRENCY = “USD”

例如Ticker = “IBM” 与 “IBM@SMART//STK////USD” 相同。

查看更多语法示例

主题

第二个(或其他字符串)可以是Topic主题字符串定义您希望在公式单元格中接收的数据类型。主题可以在Ticker字符串中指定,也可以作为单独的字符串指定。

例如,下面的两个公式都从 ISLAND 交换请求 IBM 的出价大小,其中第一个公式在Ticker中包含Topic,第二个公式将Topic指定为单独的字符串:

=RTD("Tws.TwsRtdServerCtrl",,"IBM@ISLAND BidSize")
=RTD("Tws.TwsRtdServerCtrl",,"IBM@ISLAND", "BidSize")

如果未定义Topic字符串,则主题将默认为*“Last”。*

例如,以下公式将从 Island exchange 请求 IBM 的最后价格:

=RTD("Tws.TwsRtdServerCtrl",,"IBM@ISLAND")

基本分笔报价类型

下表显示了可以为主题指定的可用基本价格变动类型的完整列表:

Tick NameTopic StringDescription
Bid Size“BidSize”Number of contracts (or lots) offered at the bid price.
Bid Price“Bid”Highest bid price for the contract.
Ask Price“Ask”Lowest offer price for the contract.
Ask Size“AskSize”Number of contracts (or lots) offered at the ask price.
Last Price“Last”Last price at which the contract traded.
Last Size“LastSize”Number of contracts or lots traded at the last price.
High“High”High price for the day.
Low“Low”Low price for the day.
Volume“Volume”Trading volume for the day for the selected contract (Volume for US Stocks are quoted in lots. The actual number of shares in volume can be calculated by multiplying 100).
Close Price“Close”The last available closing price for the previous day. For US Equities, we use corporate action processing to get the closing price, so the close price is adjusted to reflect forward and reverse splits and cash and stock dividends.
Open Price“Open”Today’s opening price. The official opening price requires a market data subscription to the native exchange of a contract.
Last Exchange“LastExch”The exchange where the Last Price is provided from.
Bid Exchange“BidExch”The exchange where the Bid Price is provided from.
Ask Exchange“AskExch”The exchange where the Ask Price is provided from.
Last Timestamp“LastTime”Time of the last trade (in UNIX time).
Halted“Halted”Indicates if a contract is halted. See Halted



Bid Implied Volatility“BidImpliedVol”Implied volatility calculated from option bid prices.
Bid Delta“BidDelta”Delta calculated from the option bid prices.
Bid Option Price“BidOptPrice”Current bid price for the option contract.
Bid PV Dividend“BidPvDividend”The present value of dividends expected on the option’s underlying.
Bid Gamma“BidGamma”The option gamma value calculated from the option bid prices.
Bid Vega“BidVega”The option vega value calculated from the option bid prices.
Bid Theta“BidTheta”The option theta value calculated from the option bid prices.
Bid Price of Underlying“BidUndPrice”The current bid price of the option underlying.
Ask Implied Volatility“AskImpliedVol”Implied volatility calculated from option ask prices.
Ask Delta“AskDelta”Delta calculated from the option ask prices.
Ask Option Price“AskOptPrice”Current ask price for the option contract.
Ask PV Dividend“AskPvDividend”The present value of dividends expected on the option’s underlying.
Ask Gamma“AskGamma”The option gamma value calculated from the option ask prices.
Ask Vega“AskVega”The option vega value calculated from the option ask prices.
Ask Theta“AskTheta”The option theta value calculated from the option ask prices.
Ask Price of Underlying“AskUndPrice”The current ask price of the option underlying.
Last Implied Volatility“LastImpliedVol”Implied volatility calculated from option last prices.
Last Delta“LastDelta”Delta calculated from the option last prices.
Last Option Price“LastOptPrice”Current last price for the option contract.
Last PV Dividend“LastPvDividend”The present value of dividends expected on the option’s underlying.
Last Gamma“LastGamma”The option gamma value calculated from the option last prices.
Last Vega“LastVega”The option vega value calculated from the option last prices.
Last Theta“LastTheta”The option theta value calculated from the option last prices.
Last Price of Underlying“LastUndPrice”The current last price of the option underlying.
Model Implied Volatility“ModelImpliedVol”Implied volatility calculated from option model prices.
Model Delta“ModelDelta”Delta calculated from the option model prices.
Model Option Price“ModelOptPrice”Current model price for the option contract.
Model PV Dividend“ModelPvDividend”The present value of dividends expected on the option’s underlying.
Model Gamma“ModelGamma”The option gamma value calculated from the option model prices.
Model Vega“ModelVega”The option vega value calculated from the option model prices.
Model Theta“ModelTheta”The option theta value calculated from the option model prices.
Model Price of Underlying“ModelUndPrice”The current model price of the option underlying.

注意:如果您没有相应的市场数据订阅,如果您请求上述实时价格变动类型,将显示"0"。如果您有兴趣,请参阅延迟逐笔报价类型需要 API 版本 9.73.05 或更高版本才能请求期权希腊语数据。

通用分时类型

TWS RTD 服务器 API 中还支持选择通用数据类型。要请求任何通用数据类型,您只需在 RTD 公式中将通用数据类型的名称指定为Topic字符串即可。

例如,以下公式将请求IBM@SMART的 52 周最高价:

=RTD("Tws.TwsRtdServerCtrl",,"IBM@SMART", "Week52Hi")

有关当前支持的通用逐笔报价类型的完整列表,请参见下表:

Generic Tick Type NameTopic StringDescriptionGeneric Tick Required
Auction Volume“AuctionVolume”The number of shares that would trade if no new orders were received and the auction were held now.225
Auction Imbalance“AuctionImbalance”The number of unmatched shares for the next auction; returns how many more shares are on one side of the auction than the other.225
Auction Price“AuctionPrice”The price at which the auction would occur if no new orders were received and the auction were held now. The indicative price for the auction.225
Regulatory Imbalance“RegulatoryImbalance”The imbalance that is used to determine which at-the-open or at-the-close orders can be entered following the publishing of the regulatory imbalance.225
PL Price“PlPrice”The PL Price, also known as the Mark Price, is the current theoretical calculated value of an instrument. Since it is a calculated value, it will typically have many digits of precision.232
Creditmanager Mark Price“CreditmanMarkPrice”Not currently available.221
Creditmanager Slow Mark Price“CreditmanSlowMarkPrice”Slow Mark Price update used in system calculations (same as Mark Price update in TWS Account Window -> Portfolio).619
Call Option Volume“CallOptionVolume”Call option volume for the trading day.100
Put Option Volume“PutOptionVolume”Put option volume for the trading day.100
Call Option Open Interest“CallOptionOpenInterest”Call option open interest.101
Put Option Open Interest“PutOptionOpenInterest”Put option open interest.101
Option Historical Volatility“OptionHistoricalVol”The 30-day historical volatility (currently for stocks).104
RT Historical Volatility“RTHistoricalVol”30-day real time historical volatility (Futures only).411
Option Implied Volatility“OptionImpliedVol”A prediction of how volatile an underlying will be in the future. The IB 30-day volatility is the at-market volatility estimated for a maturity thirty calendar days forward of the current trading day, and is based on option prices from two consecutive expiration months.106
Index Future Premium“IndexFuturePremium”The number of points that the index is over the cash index (Indeses only).162
Shortable“Shortable”Describes the level of difficulty with which the contract can be sold short. See Shortable .236
Fundamental Ratios“Fundamentals”Provides the available Reuter’s Fundamental Ratios. See fundamental_ratios_tags .258
Trade Count“TradeCount”Trade count for the day.293
Trade Rate“TradeRate”Trade count per minute.294
Volume Rate“VolumeRate”Volume per minute.295
Last RTH Trade“LastRthTrade”Last Regular Trading Hours traded price.318
IB Dividends“IBDividends”Contract’s dividends. See IB Dividends .456
Bond Factor Multipler“BondMultiplier”Not currenctly available.460
Average Volume“AvgVolume”The average daily trading volume over 90 days (multiply this value times 100).165
High 13 Weeks“Week13Hi”Highest price for the last 13 weeks.165
Low 13 Weeks“Week13Lo”Lowest price for the last 13 weeks.165
High 26 Weeks“Week26Hi”Highest price for the last 26 weeks.165
Low 26 Weeks“Week26Lo”Lowest price for the last 26 weeks.165
High 52 Weeks“Week52Hi”Highest price for the last 52 weeks.165
Low 52 Weeks“Week52Lo”Lowest price for the last 52 weeks.165
Short-Term Volume 3 Minutes“ShortTermVolume3Min”The past three minutes volume. Interpolation may be applied.595
Short-Term Volume 5 Minutes“ShortTermVolume5Min”The past five minutes volume. Interpolation may be applied.595
Short-Term Volume 10 Minutes“ShortTermVolume10Min”The past ten minutes volume. Interpolation may be applied.595
Futures Open Interest“FuturesOpenInterest”Total number of outstanding futures contracts (TWS Build 965+ is required)588
Average Option Volume“AvgOptVolume”Average volume of the corresponding option contracts (TWS Build 970+ is required)105

默认情况下,将自动请求所有通用价格变动类型。用户只需直接指定主题作为通用刻度类型的名称,即可将数据填充到 Excel。

为了消耗更少的数据资源并使您的市场数据请求更有效率,您可以通过定义字符串*“genticks=id1,id2,…”*直接指定要请求的通用逐笔报价类型

例如,要请求 52 周最高价,只需要通用分时类型= 165。以下公式将仅请求通用分时类型= 165:

=RTD("Tws.TwsRtdServerCtrl",,"IBM@SMART", "Week52Hi", "genticks=165")
延迟逐笔报价类型

当实时流市场数据因缺少市场数据订阅而不可用时,延迟的数据将自动中继回来。要通过 RTD 请求延迟数据,您需要为主题指定延迟逐笔报价类型。下表显示了可用延迟逐笔报价类型的完整列表:

Tick NameTopic StringDescription
Delayed Bid Size“DelayedBidSize”Number of contracts (or lots) offered at the bid price.
Delayed Bid Price“DelayedBid”Highest bid price for the contract.
Delayed Ask Price“DelayedAsk”Lowest offer price for the contract.
Delayed Ask Size“DelayedAskSize”Number of contracts (or lots) offered at the ask price.
Delayed Last Price“DelayedLast”Last price at which the contract traded.
Delayed Last Size“DelayedLastSize”Number of contracts or lots traded at the last price.
Delayed High“DelayedHigh”High price for the day.
Delayed Low“DelayedLow”Low price for the day.
Delayed Volume“DelayedVolume”Trading volume for the day for the selected contract (Volume for US Stocks are quoted in lots. The actual number of shares in volume can be calculated by multiplying 100).
Delayed Close Price“DelayedClose”The last available closing price for the previous day. For US Equities, we use corporate action processing to get the closing price, so the close price is adjusted to reflect forward and reverse splits and cash and stock dividends.
Delayed Open Price“DelayedOpen”Today’s opening price. The official opening price requires a market data subscription to the native exchange of a contract.
Delayed Last Timestamp“DelayedLastTimestamp”Delayed time of the last trade (in UNIX time) (TWS Build 970+ is required).

例如,以下公式将从 Island Exchange 请求 IBM 的延迟买入价:

=RTD("Tws.TwsRtdServerCtrl",,"IBM@ISLAND", "DelayedBid")

注意延迟逐笔报价类型为延迟 15 分钟。在没有市场数据订阅的情况下请求实时即时报价类型将导致错误消息"请求的市场数据未订阅。显示延迟的市场数据…"

查看更多语法示例

连接参数

由于TWS RTD服务器API直接引用C#API客户端,因此它通过socket连接到TWS(或IB网关)与C#相同。主机 IP 地址套接字端口客户端 ID是启动socket连接的必需参数。

  • 主机 IP 地址是运行 TWS 的 IP 地址。对于本地连接,可以使用本地 IP 127.0.0.1。

  • socket端口是用于socket连接的端口。您可以在TWS API 设置中设置主机端口,并且需要将 API 连接到在 TWS 中设置的同一端口。

  • 客户端 ID是每个 API 连接的标识。TWS 最多可以维护 32 个 API 客户端同时连接,并且客户端 ID 用于区分每个连接。这最初旨在使API用户可以使用不同的策略同时运行多个API程序(即客户端)来单独交易。由于 TWS RTD 服务器 API 仅用于中继实时数据,因此无需使用多个客户端 ID。

如果用户未直接指定,则上述三个参数默认为以下值:

  • 主机= “127.0.0.1” (即 “localhost”)

  • 端口= “7496”

  • 客户端 ID = 整数.最大值 - 1

简单语法支持多个预定义的连接参数,这些参数可以在 RTD 公式中指定为单独的字符串(即 String2、String3…):

  • “paper”:改用 port=7497 进行连接(7497 是模拟TWS 会话 的默认端口)

  • “gw”:请改用 port=4001 进行连接(4001 是实盘 IB 网关会话的默认端口)

  • “gwpaper”:改用 port=4002 进行连接(4002 是模拟 IB 网关会话的默认端口)

例如,要在通过端口 7497 连接到使用模拟帐户记录的 TWS 时请求IBM@SMART的"高价":

=RTD("Tws.TwsRtdServerCtrl",,"IBM@ISLAND", "High", "paper")

复杂语法

复杂语法提供了最大的灵活性,它允许用户单独自定义所有公式字符串,其中每个字符串仅表示一个参数。每个参数的出现顺序没有规则。

=RTD(ProgID, Server, String1, String2, String3...)

参数

  • ProgID = “Tws.TwsRtdServerCtrl”

  • 服务器= “” (空字符串)

例如,下面的公式将请求IBM@ISLAND的"询问大小":

=RTD("Tws.TwsRtdServerCtrl",,"sym=IBM", "sec=STK", "exch=ISLAND", "qt=AskSize")

以下公式将请求 IBM 的买入价:

=RTD("Tws.TwsRtdServerCtrl",,"sym=ES", "sec=FUT", "exch=GLOBEX", "cur=USD", "exp=201712", "qt=Bid")
复杂语法字符串

有关可用复杂语法字符串的完整列表,请参阅下表:

NameString SyntaxDescription
Contract ID“conid=”The unique contract ID generated by IB. Can be found at TWS Contract Description .
Symbol“sym=”The contract symbol.
SecurityType“sec=”The type of security, e.g. ‘STK’, ‘FUT’ and so on.
LastTradeDateOrContractMonth“exp=”Format ‘YYYYMMDD’ is used for defining the Last Trade Date, while format ‘YYYYMM’ is used for defining the Contract Month.
Strike“strike=”The strike price for an option contract.
Right“right=”‘C’ or ‘P’ for an option contract.
Multiplier“mult=”The contract multiplier.
Exchange“exch=”The exchange where to get market data from. For equities, ‘SMART’ means top data from all possible exchanges.
PrimaryExchange“prim=”The primary exchange of the contract. It is mostly specified when an contract ambiguity occurs for equity symbols that are listed on multiple exchanges.
Currency“cur=”The currency the contract is traded in.
LocalSymbol“loc=”The local symbol of the contract. Note the Local Symbol is mostly used for futures and options, and is different from the Symbol.
TradingClass“tc=”The trading class of the contract.
Combo“cmb=”Combo contract has to be defined using Complex Syntax or Mixed Syntax. The syntax for defining the combo is: “cmb=###;###;” ,where combo legs are separated by ‘;’ and individual leg parameters are separated by ‘#’. See more Spread Samples .
DeltaNeutralContract“und=”Delta-Neutral Contract. The syntax for defining the delta-neutral contract is: “und=<##” , where delta-neutral contract parameters are separated by ‘#’.
MktDataOptions“opt=”Currently not supported.
GenericTickList“genticks=”A comma separated Ids of available Generic Tick Types.
Topic“qt=”Topic of market data request.



Host“host=”Host IP address.
Port“port=”Socket port.
ClientId“clientid=”The client ID for socket connection. Note that the client ID is used for identify multiple simultaneous API connections to the same TWS. It was originally designed for API users who would like to manage their strategies separately from different API programs. Since the TWS RTD Server API is currently only supported for real-time market data, there is no need to use multiple client IDs.
混合语法

复杂语法可以与简单语法混合使用,只有一个限制,即Ticker字符串必须是 RTD 公式中出现的第一个字符串(即 String1)。

=RTD(ProgID, Server, Ticker, String2, String3...)

参数

  • ProgID = “Tws.TwsRtdServerCtrl”

  • 服务器= “” (空字符串)

例如,以下公式将在通过自定义主机、端口和客户机 ID 进行连接时请求 IBM 的买入价:

=RTD("Tws.TwsRtdServerCtrl",,"IBM@SMART", "host=1.2.3.4", "port=1234", "clientId=1", "Bid")

查看更多语法示例

TWS RTD 服务器示例

本页演示了按安全类型和语法类型分类的 RTD 公式。在查看示例之前,请务必熟悉 RTD 公式的各种可用语法。

外汇对

- 简单的语法
=RTD("Tws.TwsRtdServerCtrl",,"EUR.USD/CASH", "Bid")

评论:外汇代码以"CURRENCY1.货币2/现金"。

- 复杂语法
=RTD("Tws.TwsRtdServerCtrl",,"sym=EUR","cur=USD", "exch=IDEALPRO", "sec=CASH", "qt=Bid")

注释:对于复杂语法,外汇符号被定义为外币,货币被定义为基础货币。

- 混合语法
=RTD("Tws.TwsRtdServerCtrl",,"EUR.USD/CASH", "Bid", "port=1234", "clientId=1")

股票

- 简单的语法
=RTD("Tws.TwsRtdServerCtrl",,"IBM")

注释:使用默认值:交易所= “SMART”,货币= “USD”,安全类型= “STK”,主题= “最后”。

=RTD("Tws.TwsRtdServerCtrl",,"IBM@ISLAND", "Bid")

注释:直接指定Exchange意味着专门从该交易所请求数据。

=RTD("Tws.TwsRtdServerCtrl",,"BMO@SMART//////CAD", "Bid")

注释:货币 = “CAD” 对于在 TSE 上列出的 BMO 是必需的,但其余字段可以留空。

=RTD("Tws.TwsRtdServerCtrl",,"ABG.P@SMART//////EUR", "Close")

注释:简单语法也支持包含"."的常用符号。

=RTD("Tws.TwsRtdServerCtrl",,"MSFT@SMART/ISLAND", "Ask")

注释:对于某些具有相同符号货币交换的智能路由股票合约,您还需要指定PrimaryExchange属性来唯一定义合约。这应该被定义为合约的原生交换,并且是所有股票的良好做法。

- 复杂语法
=RTD("Tws.TwsRtdServerCtrl",,"sym=IBM", "sec=STK", "exch=SMART", "cur=USD", "qt=Volume")

评论:一般来说,使用符号证券类型=“STK”,货币交换足以定义股票。

=RTD("Tws.TwsRtdServerCtrl",,"sym=MSFT", "sec=STK", "exch=SMART", "cur=USD", "prim=ISLAND", "qt=Open")

注释:将PrimaryExchange指定为单独的字符串以解决协定多义性。

- 混合语法
=RTD("Tws.TwsRtdServerCtrl",,"MSFT@SMART", "prim=ISLAND", "qt=High", "paper")

注释:使用预定义的字符串*“paper”*连接到纸质TWS会话的默认端口7497。

指标

- 简单的语法
=RTD("Tws.TwsRtdServerCtrl",,"SPX@CBOE//IND", "Last")

注释:默认货币= 使用"美元"。

=RTD("Tws.TwsRtdServerCtrl",,"DAX@DTB//IND////EUR", "Last")
- 复杂语法
=RTD("Tws.TwsRtdServerCtrl",,"sym=INDU","cur=USD", "exch=NYSE", "sec=IND", "qt=Close")
- 混合语法
=RTD("Tws.TwsRtdServerCtrl",,"DAX@DTB//IND", "cur=EUR", "qt=Last", "host=1.2.3.4")

差价合约

- 简单的语法
=RTD("Tws.TwsRtdServerCtrl",,"IBDE30@SMART//CFD////EUR", "Bid")
- 复杂语法
=RTD("Tws.TwsRtdServerCtrl",,"sym=IBDE30","cur=EUR", "exch=SMART", "sec=CFD", "qt=ASK")
- 混合语法
=RTD("Tws.TwsRtdServerCtrl",,"IBDE30@SMART//CFD", "cur=EUR", "Bid", "gw")

备注:使用预定义的字符串*“gw”*连接到实时 IB 网关会话的默认端口 4001。

***注意:*只有指数差价合约数据可以通过API直接查询,但不能通过股票差价合约。如果您需要股票差价合约的数据,请直接请求标的股票数据。

期货

- 简单的语法
=RTD("Tws.TwsRtdServerCtrl",,"ES@GLOBEX//FUT/201712///USD", "Bid")

评论:使用标的品种LastTradeDateOrContractMonth来定义期货合约。

- 复杂语法
=RTD("Tws.TwsRtdServerCtrl",,"loc=ESZ7","cur=USD", "exch=GLOBEX", "sec=FUT", "qt=Ask")

评论*:LastTradeDateOrContractMonth和基础交易品种可以替换为合约自己的交易品种,也称为LocalSymbol(*在 TWS 的合约描述对话框中称为交易品种)。本地符号在简单语法中不可用。

- 混合语法
=RTD("Tws.TwsRtdServerCtrl",,"DAX@DTB//FUT/201706///EUR", "mult=5", "Low")

注释:对于具有倍数乘数的期货(例如,DAX 有 5 和 25),简单语法不足以唯一地定义合约。混合语法可以帮助为乘法器添加加法规范。

选项

- 简单的语法
=RTD("Tws.TwsRtdServerCtrl",,"GOOG@SMART//OPT/20170421/C/835/USD", "Bid")

评论:使用品种,LastTradeDate或ContractMonth,RightStrike来定义期权合约。

- 复杂语法
=RTD("Tws.TwsRtdServerCtrl",,"loc=C DBK DEC 20 1600", "cur=EUR", "exch=DTB", "sec=OPT", "qt=Close")

注释:使用LocalSymbol定义期权合约。

- 混合语法
=RTD("Tws.TwsRtdServerCtrl",,"SANT@MEFFRV//OPT/20190621/C/7.5/EUR", "mult=100", "tc=SANEU", "Close")

注释:对于具有多个乘数交易类的期权,简单语法不足以唯一地定义合约。混合语法可以帮助正确添加MultiplerTradingClass 的附加规范。

期货期权

- 简单的语法
=RTD("Tws.TwsRtdServerCtrl",,"ES@GLOBEX//FOP/20180316/C/1000/USD", "Close")

评论:期货期权遵循与传统期权合约相同的规则。

- 复杂语法
=RTD("Tws.TwsRtdServerCtrl",,"loc=ESH8 C1000", "cur=USD", "exch=GLOBEX", "sec=FOP", "qt=Close")
- 混合语法
=RTD("Tws.TwsRtdServerCtrl",,"ES@GLOBEX//FOP/20180316/C/1000/USD", "mult=50", "tc=ES", "Close")

债券

- 简单的语法
=RTD("Tws.TwsRtdServerCtrl",,"912828C57@SMART//BOND", "Bid")

注释:可以通过将符号定义为 CUSIP 来指定绑定。货币= “USD” 在这里用作默认值。

- 复杂语法
=RTD("Tws.TwsRtdServerCtrl",,"sym=912828C57","cur=USD", "exch=SMART", "sec=BOND", "qt=Bid")
=RTD("Tws.TwsRtdServerCtrl",,"conid=147554578", "exch=SMART", "qt=Ask")

注释:债券也可以使用ConIdExchange定义,就像任何安全类型一样。

- 混合语法
=RTD("Tws.TwsRtdServerCtrl",,"912828C57@SMART, "sec=BOND", "Bid", "gwpaper")

注释:使用预定义的字符串*“gwpaper”*连接到纸质 IB 网关会话的默认端口 4002。

共同基金

- 简单的语法
=RTD("Tws.TwsRtdServerCtrl",,"VINIX@FUNDSERV//FUND", "Close")
- 复杂语法
=RTD("Tws.TwsRtdServerCtrl",,"sym=VINIX","cur=USD", "exch=FUNDSERV", "sec=FUND", "qt=Close")
- 混合语法
=RTD("Tws.TwsRtdServerCtrl",,"VINIX@FUNDSERV//FUND", "Bid", "host=1.2.3.4", "port=1234", "clientId=1")

商品

- 简单的语法
=RTD("Tws.TwsRtdServerCtrl",,"XAUUSD@SMART//CMDTY", "Bid")
- 复杂语法
=RTD("Tws.TwsRtdServerCtrl",,"sym=XAUUSD","cur=USD", "exch=SMART", "sec=CMDTY", "qt=Ask")
- 混合语法
=RTD("Tws.TwsRtdServerCtrl",,"XAUUSD@SMART//CMDTY", "Last", "port=1234", "clientId=1")

传播

点差合约,也称为组合或组合,组合两个或多个工具。要定义组合合约,需要知道组合腿的合约 ID。ConId可以在TWS的"合同描述"页面中轻松找到。点差合约的符号可以是其中一个合约腿的符号,或者对于两条腿的组合,两条腿的符号可以用逗号分隔,如下面的示例所示。

简单语法不足以定义点差合约。您需要使用复杂语法混合语法。提醒一下,以下是用于定义组合腿的字符串公式:

“cmb=###;###;”

股票点差

买入 1 IBKR@SMART + 卖出 1 MCD@SMART:

- 复杂语法
=RTD("Tws.TwsRtdServerCtrl",,"sym=IBKR,MCD", "exch=SMART", "cur=USD", "sec=BAG", "cmb=43645865#1#BUY#SMART;9408#1#SELL#SMART;", "Bid")
- 混合语法
=RTD("tws.twsrtdserverctrl",,"IBKR,MCD@SMART//BAG////USD", "cmb=43645865#1#BUY#SMART;9408#1#SELL#SMART;", "Bid")

***注意:*EFP被简单地定义为库存和相应SSF的袋子合约,比率为100:1。

期货点差

买入 1 VXJ7@CFE + 卖出 1 VXK7@CFE:

- 复杂语法
=RTD("tws.twsrtdserverctrl",,"sym=VIX", "exch=CFE", "cur=USD", "sec=BAG", "cmb=249139906#1#BUY#CFE;252623425#1#SELL#CFE;", "Bid")
- 混合语法
=RTD("tws.twsrtdserverctrl",,"VIX@CFE//BAG////USD", "cmb=249139906#1#BUY#CFE;252623425#1#SELL#CFE;", "Bid")

期权点差

买入 1 DBK May19’17 15 CALL @DTB + Sell 1 DBK May19’17 16 CALL @DTB:

- 复杂语法
=RTD("tws.twsrtdserverctrl",,"sym=DBK", "exch=DTB", "cur=EUR", "sec=BAG", "cmb=270579950#1#BUY#DTB;270579957#1#SELL#DTB;", "Bid")
- 混合语法
=RTD("tws.twsrtdserverctrl",,"DBK@DTB//BAG////EUR", "cmb=270579950#1#BUY#DTB;270579957#1#SELL#DTB;", "Bid")

商品间期货价差

对于商品间期货,TWS 中的"本地符号"字段用于 TWS合约描述中的"符号"字段。

@NYMEX年5月买入1 CL + 卖出 1 BZ 2017年6月@NYMEX:

- 复杂语法
=RTD("tws.twsrtdserverctrl",,"sym=CL.BZ", "exch=NYMEX", "cur=USD", "sec=BAG", "cmb=55977404#1#BUY#NYMEX;55807026#1#SELL#NYMEX;", "Bid")
- 混合语法
=RTD("tws.twsrtdserverctrl",,"CL.BZ@NYMEX//BAG////USD", "cmb=55977404#1#BUY#NYMEX;55807026#1#SELL#NYMEX;", "Bid")

***注意:*请注意,商品间期货合约是交易所直接提供的点差合约,合约定义与常规组合合约不同。请确保所有合同属性均按照TWS合同描述页面指定。

更改数据刷新率

值得一提的是,我们的实时市场数据不是分笔数据,这意味着您将无法获得市场上发生的每一个价格变动。相反,实时数据以固定频率生成的快照形式给出:

产品频率
股票、期货及其他250 毫秒
美国期权100 毫秒
外汇对5 毫秒

Microsoft RTD 接口具有一个ThrottleInterval属性,用于确定数据刷新之间的间隔。默认情况下,该值设置为 2000 毫秒,这意味着 Excel 在两次检查更新之间至少等待 2000 毫秒。您可以手动将"限制间隔"更改为较小的值*,以提高实时数据的刷新率。

更改 ThrottleInterval 属性的最简单方法是通过 VBA:

  1. 在 Excel 中,通过按Alt_F11转到 Visual Basic Editor 窗口。

  2. 在 Visual Basic Editor 窗口中,单击"查看->即时窗口"或按住Ctrl_G以打开**“即时窗口”。**

  3. 在**"即时窗口"上,键入以下代码,然后单击**Enter :

    Application.RTD.ThrottleInterval=250

  4. 要验证它是否设置正确,请在**"即时窗口"上键入此行代码,然后单击Enter**:

    ? Application.RTD.ThrottleInterval

  5. 验证下一行是否应显示 250。如果更改此值,则重新启动 Microsoft Excel 时,新值将保持不变。

警告随着限制间隔的降低,更新可能会非常频繁地出现,以至于 Excel 不断更新值并执行计算,Excel 最终可能会处于一种状态,即它永远不会让用户有机会执行任何操作,从而有效地进入挂起状态。如果发生这种情况,请将 Excel 限制间隔设置得更高。

RTD 的常见错误疑难解答

常见错误疑难解答

TwsRtdServer 错误:无法连接到 TWS。

触发此错误消息很可能是因为尚未针对 API socket连接正确配置 TWS。请确保在TWS中启用ActiveX和Socket Client设置。另请记住,默认情况下,TWS Rtd 服务器连接到socket端口 7496。如果在 TWS API 设置中配置的socket端口与 RTD 尝试连接到的端口不匹配,您将看到上述错误消息。有关详细信息,请参阅"您将需要什么"。

TwsRtd服务器错误:RTD服务器与TWS断开连接,导致单元停止更新

如果超过 50 条消息/秒的 API 消息速率,则可能会发生这种情况。每秒从 API 应用程序(如 RTD 服务器)发送到 TWS 的消息不超过 50 条(这不包括相反方向的消息)。每个股票代码订阅请求和订阅取消请求对应于 1 条消息。如果超过 50 条消息/秒的速率,TWS 最终将关闭连接。因此,要构建具有50个以上股票代码的RTD电子表格,必须将其构建为每秒最多只能进行50个新订阅或取消。

TwsRtdServer 错误:未找到请求的安全定义。

触发此错误消息以指示 TWS 找不到 RTD 公式中提供的协定定义。通常,这是由不正确的协定属性定义或拼写错误引起的。建议您参考一些语法示例,并在 RTD 公式中找出问题所在。

TwsRtdServer 错误:为 SYMBOL 指定的协定描述不明确。

此错误消息指示您提供的协定定义不是唯一定义单个协定。它主要针对在多个主要交易所上市的股票代码(如 MSFT 和 CSCO)触发。指定主要交换将解决此问题。请参阅MSFT 的语法示例

TwsRtdServer 错误:请求的市场数据未订阅。显示延迟的市场数据…

当您尝试请求实时报价类型时,将显示错误消息,而由于缺少市场数据订阅,因此只有延迟数据可用。您需要通过账户管理订阅市场数据,或者请求延迟逐笔报价类型

TwsRtd服务器错误:验证请求时出错:-‘zd’:原因 - 不正确的通用勾选列表

如 您将需要什么中所述,TWS Build 963+ 是必需的,因为默认情况下 RTD 请求的一些通用刻度类型在较旧的 TWS 构建中不受支持。将TWS升级到963以上的任何内部版本将解决此问题。

一些数据显示,在请求许多证券的数据时为"0"

这很可能是因为您已经超出了市场数据线的限制。您可以通过转到TWS并同时按住**Ctrl_Alt_=**来验证这是否是原因。这应该显示一个小的弹出窗口,并指示允许的最大市场数据行以及当前订阅的顶部市场数据计数。如果订阅的次数超过允许的最大值,则某些数据点将显示"0"。

rtd_maxdataline.PNG

DDE socket API

动态数据交换协议是 Microsoft 开发的一种进程间通信方法,用于在同一台计算机上运行的 Windows 应用程序之间建立通信。DDE API可用于Windows计算机,以创建Microsoft Excel与TWS或IB网关之间的通信方式。

盈透证券不提供任何编程帮助,因此强烈建议任何愿意使用TWS DDE API的人熟悉所涉及的技术,如DDE协议和VBA。

从API v975开始,提供了一个新的DDE API,它通过一个DDE套接字桥连接到TWS,该桥接使用开源Java-DDE互操作性库JDDE。与传统的 DDE API 相比,较新的 API 具有一些优势:

  • 与 32 位或 64 位 TWS 兼容(旧版 DDE API 仅与 32 位 TWS 兼容)

  • 与其他基于套接字的 API 匹配的附加功能,特别是在多个账户结构方面

  • 全方位的市场数据分时类型

DDE socket API 与为旧版 DDE API 创建的电子表格完全向后兼容
与旧版 DDE API 不同,要在 Excel DDE 电子表格中使用的用户名由独立启动的 DDE 服务器确定,而不是由 TWS 中使用的用户名
确定。默认用户名是 twsserver,但这可以在 runDdeSocketBridge.bat 文件中进行更改。Windows v975+ 安装的 API 附带的文件夹 C:\TWS API\samples\DdeSocketBridge 包含新 DDE 连接的源代码。


DDE socket bridge API 的要求

  • 视窗操作系统

  • 微软Excel

  • TWS API v975 或更高版本已安装到 C: 驱动器

  • Excel 必须设置为逗号和句点的美国约定。也就是说,逗号表示千,句点表示小数。

  • 已安装的最新 Java 版本


启动 DDE 服务器的步骤
  1. 启动TWS或IB网关

  2. 如果将 TWS 与 API 配合使用,则必须在以下位置启用基于套接字的连接:全局配置 -> API ->设置 ->"启用 ActiveX 和套接字客户端"启用 API 连接

  3. 请注意全局配置 -> API -> 设置 -> 套接字端口中的套接字端口设置。DDESocketBridge 的默认值为7496

  4. 导航到 C:\TWS API\samples\DdeSocketBridge。如果您启动runDdeSocketBridge.bat直接它将默认套接字端口7496,Excel公式用户twsserver。

    • DdeSocketBridge 使用的默认套接字端口7496和/或默认用户名twsserver可以通过修改 runDdeSocketBridge 来更改.bat如下所示:java

      -Djava.library.path=。-jar DdeSocketBridge.jar -p{已在 API 设置中设置的socket端口} -s{TWS 登录用户名或任何其他字符串} -c{要与 TWS 连接的客户端 ID}

  5. 应该有一个弹出窗口显示**“已连接!”,**确认 DDESocketBridge 已连接到 TWS。如果不是,请检查 API 是否已启用,以及socket端口是否设置正确。

  6. 如果使用正确的语法输入公式,Excel 电子表格现在可以连接到 DDE API。一个很好的起点是教程
    说明:应该使用的默认用户名是twsserver
    有一个新的示例电子表格位于:C:\TWS API\samples\Excel\newTwsDDE.xls


笔记:

  • 在同一台计算机上运行的其他使用DDE的程序可能会干扰Excel和TWS之间的通信,并导致Excel在发出初始请求后"挂起"或"冻结"。此问题的唯一解决方案是使用 DDE 逐个关闭其他程序以找到罪魁祸首。已知导致此问题的程序包括Google Chrome,Microsoft OneNote,Skype和Adobe Creative Cloud。

  • 运行 DDE Bridge 时,如果命令提示符屏幕在打开后闪烁并消失,请在操作系统上安装最新版本,https://www.java.com/en/download/。

传统 DDE API 描述如下:传统 DDE API

ActiveX for Excel API

ActiveX API 包装了 C#/.NET API,并作为开源项目 TWSLib 提供。建议直接考虑使用 C# API,因为它提供了与 .NET 框架的无缝集成。

与RTDServer或DDE相比,使用ActiveX for Excel API的一个可能优点是,ActiveX确实提供了与其他基于socket的技术(C#,Java,C++,Python)相同数量的功能。ActiveX Excel API 的缺点是,与其他 Excel API 相比,它更难编程,并且不如非基于 Excel 套接字的 API 应用程序可靠。

请参阅Excel API 比较

ActiveX 示例电子表格

API 安装中包含一个示例 ActiveX for Excel 电子表格,并将其安装到 C:\TWS API\samples\Excel\TwsActiveX.xls。电子表格和随附的 ActiveX 控件是为 32 位版本的 Excel for API 版本构建的,直到 973.05。对于 API 版本 973.05+,提供的已安装的 ActiveX 控件和 Excel 电子表格示例将适用于 32 位或 64 位应用程序。如果使用 ActiveX API 的版本 9.73,则建议使用版本973.07或更高版本。

重要:请注意,随 API 提供的示例 ActiveX 电子表格仅用于演示 API 功能,而不是用于交易的生产级工具。虽然它设计了几乎所有API函数的示例,但它没有必要的功能来处理交易过程中可能发生的问题,例如断开连接,错误代码或以稳健的方式丢弃事件。


版权所有,转载本站文章请注明出处:云子量化, http://www.woniunote.com/article/70
上一篇:【TWS API 翻译系列】3、第三方软件中使用TWS API的相关问题
下一篇:【TWS API 翻译系列】5、TWS API的故障排除和支持