通过TWS API 可以通过Java, .NET (C#), C++, Python, 或者 DDE 实现程序化交易。
序言
TWS API 是一个简单但是功能强大的接口,通过它,可以 把我们的交易策略实现自动化交易,可以请求市场数据,可以实时监控我们的账户和投资组合。
目标用户
TWS API 的目标用户是有经验的专业并且有意愿增强TWS功能的开发者。很遗憾的说,IB不提供任何编程语言的咨询。在希望我们提供API方面的帮助之前,请先参阅我们的可以利用的文档、应用示例、以及我们的博客论坛等网络资源。
如何使用这份文档
本说明使用的最新的版本是TWS API V9.72+,并且使用Java, VB, C#, C++ 和 Python的验证过的示例程序来说明TWS的功能。所有的代码片段都来自于示例程序,并且我们建议新的使用者先熟悉下这些示例程序,以便了解下TWS API的基本功能。示例程序可以在TWS API 的安装目录中的samples中找到。
必备条件
如果想要获得TWS API的源代码和示例程序,可以通过API Components下载获得(API的版本要大于等于9.73)
如果想要是用9.73以上的版本,需要使用 TWS build 952.x 或者更高的版本
需要示例程序相关的编程语言的相关知识。
需要python3.1或者以上的版本
限制
我们的程序接口的设计是为了能够自动实现TWS软件的某些手动的操作,比如下订单,监控账户余额和持仓,查看一个品种的实时数据。大多数的验证和检验是发生在TWS和我们的服务器中,TWS API 中不保证发送出去的信息的完整性,所以,强烈推荐在花费很多时间在API的研发上之前,先熟悉我们的TWS平台的操作。提醒,如果TWS没有的功能或者操作,在TWS API中也不会存在。
请求限制
TWS设计的时候有一个限制,那就是每秒钟只能从客户端接受50个指令,任何从客户应用程序到TWS账户的操作都是一个指令,比如请求数据、下单、查看账户等。在一个TWS程序中,可以连接多个用户,这些多个用户,不能超过这个限制。另一方面,并没有限制TWS能够发送给客户应用的指令数目。
模拟交易
如果你的交易账户已经被批准和入金,那么你就可以在账户管理中申请开通一个Paper Trading Account,这个模拟账户可以在一个模拟环境中让你可以测试交易策略,熟悉TWS API ,并且不会导致你的资金出现风险。注意,模拟交易环境有内在的 限制.
模拟交易账户的限制
尽管模拟账户在大多数方面和实际交易账户一样,但是由于模拟交易没有交易执行和结算功能,实际上还是和实际交易账户存在一定的差别。这些差别包括但不限于:
不支持某些订单类型,包括:VWAP, Auction, RFQ, 和 Pegged to Market.
成交是通过订单薄的最顶端开始,不涉及到订单薄里面.
限制组合交易.
止损单和其他复杂的订单在模拟交易中和实盘交易中可能行为是不一样的
美国期权的小额交易是不支持的。你可以提交小额交易的订单,但是不会成交
模拟交易的时候将会拒绝部分成交的后的订单的剩余部分,这和实际交易是不一样的(The trade simulator will reject the remainder of any exchange-directed market order that partially executes. This may or may not match behavior of a real-world exchange. Market orders received while there is no quote on the opposite side will be held until the market data arrives (i.e. until the first partial fill).
在模拟交易账户中,是不支持交易共同基金的。
初始设置
TWS API 是IB独立的交易平台TWS 和 IB Gateway的接口,他们都是独立的,Java语言开发的交易平台,设计的时候都需要是用图形化的用户交互界面来保证用户的真实性,因此,没有GUI的无头操作是不支持的(For that reason “headless” operation of either application without a GUI is not supported.)。
TWS
我们基于做市商设计的IB TWS 可以让交易者、投资者、机构通过一个账户交易在超过100个交易市场中交易股票、期权、期货、外汇、债权和基金。TWS API是 TWS 的一个程序接口,因此,在应用中连接TWS API 之前,需要先运行TWS或者IB Gateway。如果想要是用9.72+以上的版本,需要使用 TWS build 952.x 或者更高的版本
IB Gateway
对于使用TWS API的用户,IB Gateway是 TWS的一个替代选择。从API的使用角度来看,不论是使用TWS 或者 IB Gateway ,当用户验证成功之后,TWS API的应用程序都可以打开一个socket连接到IB的服务器,因此TWS和IB Gateway是等同的。
不论是使用TWS 或者 IB Gateway,用户都需要手动输入用户名和密码到一个登录窗口;为了安全的原因,TWS or IBGW 的没有GUI的无头session是不支持的。从用户的角度来看,IB Gateway是有很大优势的,因为它是一个轻量级的应用,消耗的资源要少40%(it is a lighter application which consumes about 40% fewer resources).IB Gateway仅仅提供“offline"的版本,和 'offline TWS’一样,他们不会自动更新。推荐定期更新IBGW(不需要卸载以前版本的IBGW,也不需要安装一个另外的TWS API版本,如果不希望的话)。
TWS 和 IB Gateway都是设计的会每天进行重启。每天进行重启是必要的,因为合约可能会发生变化或者新的合约会上市,所以需要执行下载合约相关的信息。从974+版本开始,两者都会每天自动重启,不需要使用者干预。因为可以自动重启,所以,TWS和IBGW可以7天24小时不间断的运行,不需要再重新认证了。周六晚上服务器重置之后,可能又需要重新输入安全证书。
TWS比IBGW好的地方在于它提供了很多工具(风险管理、期权交易、订单薄交易等)给终端用户,并且提供了图形化的用户界面,使用它可以下单或者监控账户情况。对于刚开始是用API的用户,使用IBGW之前,先熟悉和使用TWS。
为了保持简洁,这份使用说明更多的指向TWS,但是读者要明白,对于使用TWS API,TWS和IB Gateway是一样的。
如何登录多个应用
在同一个时间使用同一个用户名称是不能够登入多个交易软件的。但是,在一个账户里面,创造额外的用户名是允许的,只要同一个用户名不同时登录即可。在创造额外的用户名的时候,有一些有帮助需要知道的情况:
如果一个用户名登录进入TWS 或者IBGW,并且这个用户名曾经登录了客户端网站,在登录期间,在服务器重启之后,TWS和IBGW是不会自动重新连接到服务器。If TWS or IBGW is logged in with a username that is used to login to Client Portal during that session, that application will not be able to automatically reconnect to the server after the next disconnection (such as the server reset).
通过TWS或者IBGW登录模拟账户,将不会收到市场信息,如果这个实盘账号同时登录了客户端网站。A TWS or IBGW session logged into a paper trading account will not to receive market data if it is sharing data from a live user which is used to login to Client Portal.
注意,市场数据的订阅在各个实盘用户名之间是相互独立的。
如果一个不同的用户名登录了客户端网站,在上述的两种情况下,将不会影响TWS/IBGW。
允许 API 连接
在任何的客户应用程序连接到TWS之前,TWS需要先进行配置一个特定的端口,以便能够监听到即将到来的API连接。默认情况下,在TWS第一次安装之后,是不允许API连接的。相反,IBGW默认接受API连接。如果要允许TWS接受API连接,那么需要打开编辑( Edit) -> 全局配置(Global Configuration)-> API -> 设置(Settings) 中,把“Enable ActiveX and Socket Clients" 选项像下面一样激活:
另外值得一提的是端口的问题。默认情况下,一个实盘交易账号的TWS的端口是7496,一个模拟账号的端口将会是7497.但是这仅仅是默认的被选择的值,因为他们几乎可以在任何一台电脑上使用,他们可以被改为任何公开的端口,只要用户指定的端口和TWS里面设定的端口是匹配的。如果有多个TWS应用同时在一台电脑上启动,端口将用来区分不同的TWS应用,因为一个应用一次只能监听一个端口,所以你需要给不同的TWS指定不同的端口。
注意:当同时应用模拟账户和实盘账户在同一台电脑上的不同的TWS中时,请确保你的客户端程序连接的是正确的TWS。
只读API
当设置成只读的时候,关于订单的信息是不能通过这个API 获取的。
Master Client ID
默认情况下,Master Client ID是没有设置的。为了所有账户能够获得所有开仓订单和订单的佣金报告,需要在TWS或者IBGW的全局配置中指定一个特定的Master Client ID。这个客户id需要在API应用初始化的时候指定。
安装API源代码
API源代码可以通过http://interactivebrokers.github.io/进行下载。
很多的第三方应用在安装的过程中已经选择了他们自己的API版本。如果是用第三方的产品,需要首先验证下TWS API是否是单独安装的和需要哪个版本的API。很多的第三方应用只兼容特定的版本。
在windows上安装TWS API的时候,将会在C盘创建一个TWS API的文件夹,该文件夹下有两个目录,分别用于放置DDE 和C++的API。把API安装到C盘很关键,否则API应用程序可能找不到相关的代码文件。TWS的安装程序还会拷贝编译好的复杂的动态链接库,ActiveX控制的TWSLib.dll,, C# 的CSharpAPI.dll, C++ 的TwsSocketClient.dll.从973.07版本开始,在windows上安装,将会安装兼容32和64位程序的ActiveX控制的TWSLib.dll, and TwsRTDServer control TwsRTDServer.dll。
改变TWS API的版本
下面的方法只需要应用在windows中。如果一个另外的 ActiveX (v9.71 or lower) 或者 C++ API的版本需要,需要额外的步骤卸载前面的API版本,不能简单的手动删除TwsSocketClient.dll文件。
通过windows的增加和删除程序删除API
删除 C:\TWS API\ ,如果这个文件夹下面还有文件
定位到这个文件:C:\Windows\SysWOW64\TwsSocketClient.dll,然后删除
在安装新的版本的API之前,重启电脑。
TWS API相关的教程
【TWS API使用教程1】—如何在自己创建的client和TWS之间创建一个连接,并请求当前的时间
【TWS API使用教程2】—如何使用 TWS API在ubuntu和windows上分别设置contract、获取contract详细信息、设置order、下单、获取持仓信息、获取账户信息
【TWS API使用教程3】—如何使用TWS API从盈透证券中设置contract及获取contract的信息?
【TWS API使用教程4】—如何使用TWS API在盈透证券中设置order?
【TWS API使用教程5】—如何使用TWS API在盈透证券中下单(place order)、获取订单信息、获取持仓、获取账户汇总信息?
【TWS API使用教程6】—如何使用TWS API在盈透证券中获取数据?
【TWS API 使用教程7】如何使用TWS API 从盈透证券中筛选满足一定条件的contract?
【TWS API 使用教程8】一个基于TWS API的简单的程序化策略