Joh*_*ian 6 database influxdb influxql influxdb-2
我想存储交易以及最佳要价/出价数据,后者在InfluxDB中的更新速度比前者快得多。
我想,如果可能的话,使用一种允许我查询的模式:“对于市场X上的每笔交易,找到其时间标记<=该交易的时间标记的市场Y上的最佳要价/出价”。
(我将使用任何版本的Influx。)
例如,交易可能看起来像这样:
Time Price Volume Direction Market
00:01.000 100 5 1 foo-bar
00:03.000 99 50 0 bar-baz
00:03.050 99 25 0 foo-bar
00:04.000 101 15 1 bar-baz
Run Code Online (Sandbox Code Playgroud)
刻度数据可能更像这样:
Time Ask Bid Market
00:00.763 100 99 bar-baz
00:01.010 101 99 foo-bar
00:01.012 101 98 bar-baz
00:01.012 101 99 foo-bar
00:01:238 100 99 bar-baz
...
00:03:021 101 98 bar-baz
Run Code Online (Sandbox Code Playgroud)
我希望能够以某种方式加入某个市场(例如foo-bar)的每笔交易,而只有其他市场(例如bar-baz)上的最新卖/卖点数据点,才能得到如下结果:
Time Trade Price Ask Bid
00:01.000 100 100 99
00:03.050 99 101 98
Run Code Online (Sandbox Code Playgroud)
这样我就可以计算出市场foo-bar上的交易价格与最新报价的市场bar-baz上的要价或买价之间的差。
现在,我将交易存储在一个时间序列中,将询问/出价数据点存储在另一个时间序列中,并在客户端将它们合并,其逻辑类似于:
function merge(trades, quotes, data_points)
next_trade, more_trades = first(trades), rest(trades)
quotes = drop-while (quote.timestamp < next_trade.timestamp) quotes
data_point = join(next_trade, first(quotes))
if more_trades
return merge(more_trades, quotes, data_points + data_point)
return data_points + data_point
Run Code Online (Sandbox Code Playgroud)
问题在于,客户必须丢弃大量的询问/出价数据点,因为它们如此频繁地更新,并且只有在交易之前的最新更新才有意义。
我可能想与某笔交易进行比较,因此有几十个市场要与之进行最近的询问/出价,否则,我会将最新的询问/出价存储在与交易相同的系列中。
是否可以使用Influx或其他时间序列数据库执行我想做的事情?产生较低质量结果的另一种解决方案是将要价/出价数据按某个时间间隔(例如250ms)进行分组,并从每个间隔中获取最后一个,以至少对客户端必须放弃的报价量施加上限寻找最接近下一笔交易的那笔交易。
注意。只是对 InfluxDB 术语的澄清。您可能正在以不同的度量(类似于表格)存储交易和报价数据。系列是基于标签值进行测量的细分。例如
Time Ask Bid Market
00:00.763 100 99 bar-baz
Run Code Online (Sandbox Code Playgroud)
是一个系列
Time Ask Bid Market
00:01.010 101 99 foo-bar
Run Code Online (Sandbox Code Playgroud)
是另一个系列(假设您将市场名称/ID 存储为标签而不是字段)
回答
function merge(trades, market)
points = <empty list>
for next_trade in trades
quote = db.query("select last(ask), last(bid) from tick_data where time<=next_trade.timestamp and Market=market and time>next_trade.timestamp - 1m")
// or to get a list per market with one query
// quote_per_market = db.query("select last(ask), last(bid) from tick_data where time<=next_trade.timestamp group by Market")
points = points + join(next_trade, quote)
return points
Run Code Online (Sandbox Code Playgroud)
当然,您会有更频繁地查询数据库的开销,但根据交易数量和您的资源限制,它可能更有效。注意。这里的一个潜在的缺陷是,ask和bid检索这种方式不提取为一对,但独立,而他们正在为一对返回的是可能发生的,他们有不同的时间戳。如果出于某种原因,由于某些时间戳,您只有一个ask或一个bid价格,您可能会遇到这个问题。但是,只要您成对编写并且没有丢失数据就可以了。
Flux https://www.influxdata.com/products/flux/ - Flux 是一种更复杂的查询语言,它是 Influxdb 1.7 和 2 的一部分,允许您跨不同的测量进行连接和操作。我还不能给你任何例子,但值得一看。
您可以查看的其他(关系)时间序列数据库也允许您进行连接是 CrateDB https://crate.io/或 Postgres + TimescaleDB https://www.timescale.com/products