You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 12:21:21