Kx Q语言多交易所订单簿:同时间戳订单合并求和的优雅实现方案
Q语言多交易所订单簿:同价订单合并与新增键兼容方案
问题核心
你遇到的矛盾点很明确:用.[;;:;]赋值会直接覆盖同时间戳同价格的订单;改用.[;;+;]实现数量累加时,遇到不存在的价格键会报错,无法自动新增。解决的关键是先对同维度订单做聚合,再安全合并到嵌套字典结构中。
最优实现方案
假设你的订单簿是三层嵌套字典:orderBook: exchange!timestamp!price!long(交易所→时间戳→价格→累计数量),批量订单是包含exchange/timestamp/price/quantity字段的表。
1. 批量订单预聚合
先按「交易所+时间戳+价格」分组求和,把同维度的订单数量合并为一条记录,从根源避免覆盖问题:
aggOrders: select sum quantity by exchange, timestamp, price from inputOrders
2. 高效合并到订单簿
用嵌套@操作结合默认空字典的方式,自动处理新增键的场景,同时实现数量累加:
// 定义批量合并函数 mergeToBook:{[book; agg] each[{[b; e; ts; p; q] // 逐层处理:交易所→时间戳→价格,不存在则创建空字典 @[b; e; {[td; t; pr; qty] @[td; t; {[pd; pr; qty] pd[pr]: pd[pr] + qty; pd}; pr; qty]; ::()!() }; ts; p; q] }[book]; agg.exchange; agg.timestamp; agg.price; agg.quantity]; book } // 调用函数更新订单簿 orderBook: mergeToBook[orderBook; aggOrders]
这里的::()!()是核心:当交易所或时间戳键不存在时,自动生成空字典,让后续的+操作能正常新增价格键并赋值。
3. 单订单快速处理
如果是单条订单,直接用嵌套@简化写法:
// 示例:向交易所`binance`的时间戳`1699999999`下价格`27000.0`新增/累加数量10 orderBook: @[orderBook; `binance; @[; 1699999999; @[; 27000.0; +; 10]; ::()!()]; ::()!()]
方案优势
- 批量处理高效:预聚合减少了字典操作次数,比逐个处理订单性能提升明显
- 自动兼容新增键:无需额外判断键是否存在,通过默认空字典自动创建层级
- 彻底避免覆盖:先聚合再合并,同维度订单数量只会累加不会被覆盖
内容的提问来源于stack exchange,提问作者Daniel Krizian
相关产品推荐
相关产品推荐

