DataCenter行情录制插件
基于TWS API
DataCenter可以通过TWS Api与Trader Workstation/IB Gateway建立TCP连接,从而实现全球范围内合约行情录制。
在启动之前,您需要先完成下面前置工作:
- 确保您的Linux服务器上安装有完整的Java runtime
- 确保您的Linux服务器支持图形界面
- 下载并安装盈透客户端,您可以选择Trader Workstation或者IB Gateway
如果您对安装Java runtime以及图形界面存在疑问,可以在常见问题页面查看Java和VNC的安装使用方法。
Trader Workstation是完整的交易客户端,您可以在之上完成大部分账户管理以及交易操作;而IB Gateway是一个轻量级代理,占用的资源更少,两者对于ThunderTrader来说可以提供完全一样的功能。
在Producer/Deploy producer页面新增libibkr_tws_data_collector_plugin_imp.so插件实例。

client_id是TWS的API接入ID,可以填写0,不同的接入端id不重合即可。host是您TWS进程所在机器IP地址,如果与DataCenter同一台机器,则一般填写172.17.0.1(从Docker容器内部访问localhost的代理地址);如果您使用的是TWS Workstation,则Port一般填写4001,如果是IB Gateway则Port一般填写7496。
点击桌面图标启动Trader Workstation或者IB Gateway。

这里以Trader Workstation为例,打开软件后,可以看到主界面。
Classic版:

或Mosaic版:

在菜单中找到全局设置,在API菜单中完成必要的设置:
 如上图所示,确保
如上图所示,确保Enable ActiveX and Socket Clients选项被选中,而Read-Only API选项取消选中,端口可以使用默认的7496。

确保Allow connections from localhost only选项取消选中,在白名单中需要添加DataCenter的地址,通常为172.17.0.2。
完成上述设置后,使用搜索功能找到需要录制行情的合约。

并且在右键菜单中的Financial Instrument Description,找到合约的Exchange和Contract ID。

此时我们需要拼接生成ThunderTrader体系中的UniqueID,拼接规则如下:
ibkr.tws.${type}.${exchange}.${contract id}
- type:订阅类型,如果是- l1则代表L1行情(Top of book, L1),如果是- l2则代表深度行情(Market depth, L2),当前版本仅支持- l1。
- exchange:交易所名称,区分大小写
- contract id:合约ID,纯数字
这里以COMEX交易所的伦敦铜期货为例,经过拼接后的UniqueID为ibkr.tws.l1.COMEX.651096940。
将我们需要订阅的所有合约整理为配置文件,格式为:
{
	"instruments": [
		{"unique_name":"UniqueID 1"},
		{"unique_name":"UniqueID 2"},
		{"unique_name":"UniqueID 3"},
		...
		{"unique_name":"UniqueID n"}
	]
}
例如:
{
	"instruments": [
		{"unique_name":"ibkr.tws.l1.COMEX.651096940"},
		{"unique_name":"ibkr.tws.l1.COMEX.419743906"},
		{"unique_name":"ibkr.tws.l1.COMEX.662922793"},
		{"unique_name":"ibkr.tws.l1.COMEX.668631619"},
		{"unique_name":"ibkr.tws.l1.COMEX.447766922"},
		{"unique_name":"ibkr.tws.l1.COMEX.447585333"}
	]
}
并且通过Producer/View producers更新到插件配置中。

您可以在ThunderDevel中查看录制的行情数据。

基于Client portal Gateway
DataCenter内置了盈透证券Client Portal Gateway以及行情录制插件,您需要打开82端口映射即可使用该功能。
$ mkdir ${your tick storage path}
$ sudo docker run --privileged -d \
 -p ${your web UI port}:80 \
 -p ${your IBKR authentication port}:82 \
 -v ${your tick storage path}:/thunder-ticks \
thundertrader/datacenter:1.81
其中${your IBKR authentication port}是您期望执行IBKR账户验证的端口。例如:
$ mkdir /home/my_ticks
$ sudo docker run --privileged -d \
 -p 8080:80 \
 -p 8082:82 \
 -v /home/my_ticks:/thunder-ticks \
thundertrader/datacenter:1.81
您需要在DataCenter所在的机器上进行IBKR账号登录,以上述8082端口为例,在浏览器中打开http://localhost:8082/登录IBKR账号完成授权。

使用IBKR discovery寻找目标合约。该功能在Utilities/IBKR discovery选项卡下,您可以通过下列4个API寻找合约对应的conid,详细使用文档可参考IBKR Instrument discovery。
| API | 功能 | 
|---|---|
| /trsrv/stocks | 查询Stock合约 | 
| /trsrv/futures | 查询Future合约 | 
| /iserver/secdef/search | 全市场搜索 | 
| /iserver/secdef/info | 查看合约详情 | 

根据您希望录制的合约列表,生成配置信息。格式如下:
{
	"instruments": [
        "instrument unique names..."
	]
}
例如:
{
	"instruments": [
        "ibkr.FUT.526262864",
        "ibkr.FUT.526262961",
        "ibkr.FUT.597391683",
        "ibkr.FUT.597391689",
        "ibkr.FUT.597391703",
        "ibkr.FUT.597391723"
	]
}
添加收集实例。选择libibkr_data_collector_plugin_imp.so插件,其中gateway_host填写localhost, gateway_port填写5000,并点击SUBMIT提交。

在Producers列表中,写入刚才生成的配置信息,并点击UPDATE提交。

通过监控查询行情信息收集是否符合预期。

DataCenter在/ibkr_gateway路径下导出了GatewayAPI接口,您可以直接进行访问查询所需要的合约信息:
$ curl -X GET -k "http://localhost:8080/ibkr_gateway/v1/api/trsrv/futures?symbols=ZS"|python3 -m json.tool|grep "conid"|awk -F' ' '{print "\"ibkr.FUT."$2}'|sed 's/,/",/g'
"ibkr.FUT.526262864",
"ibkr.FUT.526262961",
"ibkr.FUT.597391683",
"ibkr.FUT.597391689",
"ibkr.FUT.597391703",
"ibkr.FUT.597391723",
您可以在DevelStudio中查看录制的行情数据。

Engine行情&交易插件
敬请期待。