通过盈透证券的 API 方法
tickPrice
或 tickSize
接收金融报价数据时,数据将具有以下参数
从任何其他提要中,我希望给我一个勾号
所以我的问题是:我是否应该保留一个以tickerId为键、以结构体为值的字典,其中包含上述五个属性,以便每次引发tick事件时,我都会更新该结构体的相应属性并将整个结构体发送到我的数据库作为蜱虫?理想情况下,我的蜱数据库看起来像这样
Date Time Symbol Side Price Quantity
2012-10-31 13:51:13.784 AAPL Bid 25.81 15007
2012-10-31 13:51:14.615 AAPL Bid 25.82 10
2012-10-31 13:51:14.633 AAPL Bid 25.81 13623
2012-10-31 13:51:14.684 AAPL Ask 25.82 2500
2012-10-31 13:52:09.168 AAPL Bid 25.80 12223
来自 IB API 文档: 当市场数据发生变化时调用此方法。这是否意味着如果例如出价更新了,其他楼盘保持不变吗?
你是对的。每当某个属性发生变化时,就会触发一个新的tick事件。使用结构体来保存刻度快照的设计是标准方法之一。
换句话说,IB 的 API 将在每个聚合报价到达时发回它们。 但是,这些价格变动并不是真正的价格变动,因为它们只是 0.2 - 0.3 秒的快照。 如果您正在处理高频交易,那么这些数据对于订单簿模拟可能并不可靠。但是,如果您只是进行基本的数据分析,那么它们的质量是可以接受的。
在这种情况下,它们的最高价、最低价和收盘价可能没有用,因为标准订单簿不会包含最高收盘价、最低收盘价信息。我通常会丢弃它们。在这种情况下,买价大小和卖价大小也不可靠,因为它们只是合成的价格变动。
希望我的回答有帮助。
这取决于你在
reqMktData()
方法中引入的内容:
void reqMktData( TickerId id,
const Contract &contract,
IBString &genericTicks,
bool snapshot,
const TagValueListSPtr &mktDataOptions
)
如果您写入
snapshot = true
,您将收到数据的单个快照。
如果您写
snapshot = false
,您将收到一个新的可变出价或询问,每次它发生变化,或者可能每~0.2-0.5秒聚合一次。如果出价或价格发生变化,您将在tickPrice 中收到回调,或在tickSize 中分别收到尺寸/交易量的回调。
当您考虑 IB 提供的数据源时,请考虑您想要更新显示表单/页面中的数据的情况。在这种情况下,如果交易所以相同的出价生成新的最佳出价,只是大小不同,那么只有发送新的大小才有意义(而不是再次发送未更改的出价)。此外,IB 会在 200 或 300 毫秒内批量处理这些更改,因此并非所有更改都会传播。
如果您在这种情况下看待它,数据馈送实际上在最小化消息的大小和频率方面非常有效。
大多数人都熟悉更完整的 1 级数据源所提供的内容(例如综合报价系统)。在这种情况下,价格或尺寸的每次变化都会生成包含所有字段的完整的新报价消息。
您需要哪种类型的数据源很大程度上取决于您的具体用例。例如,我曾致力于向客户提供非常详细(例如每条报价消息)的十亿条记录数据集,却发现他们将数据聚合到 1 分钟的 OHLCV 条中。
因此,这实际上是一个能够将您的数据数据需求与您的分析需求相匹配的问题。在某些情况下,IB 的数据可以正常工作。在其他情况下,则不会。