如何更新嵌套字典中 table 中的条目?

How to update entries in a table within a nested dictionary?

我正在尝试创建一个订单簿数据结构,其中顶级字典包含 3 种基本订单类型,每种类型都有出价和要价方,每一方都有一个表列表,每个表一个自动收报机。例如,如果我想检索 Google 股票的所有 type1 询价订单,我会调用 book[`orderType1][`ask][`GOOG]。我使用以下方法实现了它:

bookTemplate: ([]orderID:`int$();date:"d"$();time:`time$();sym:`$();side:`$();
orderType:`$();price:`float$();quantity:`int$());
bookDict:(1#`)!enlist`orderID xkey bookTemplate;
book: `orderType1`orderType2`orderType3 ! (3# enlist(`ask`bid!(2# enlist bookDict)));

使用 book[`orderType1][`ask][`ticker] 的数据检索似乎工作正常。当我尝试向特定订单簿添加新订单时出现问题,例如:

testorder:`orderID`date`time`sym`side`orderType`price`quantity!(111111111;.z.D;.z.T;
`GOOG;`ask;`orderType1;100.0f;123);
book[`orderType1][`ask][`GOOG],:testorder;

执行最后一个查询会出现 'assign 错误。什么原因?如何解决?

这里有几个问题。第一个是虽然您可以使用一系列内联重复键查找字典,即

q)book[`orderType1][`ask][`GOOG]
orderID| date time sym side orderType price quantity
-------| -------------------------------------------

你不能像这样赋值(只能在一层深度赋值)。更好的方法是使用点索引(和点修改来重新分配值)。但是,问题在于,由于词典列表是统一的,您的图书词典的值正在变平为 table。所以这失败了:

q)book . `orderType1`ask`GOOG
'rank

你可以通过检查终端看到它是如何变平的

q)book
          | ask
----------| -----------------------------------------------------------------
orderType1| (,`)!,(+(,`orderID)!,`int$())!+`date`time`sym`side`orderType`pric
orderType2| (,`)!,(+(,`orderID)!,`int$())!+`date`time`sym`side`orderType`pric
orderType3| (,`)!,(+(,`orderID)!,`int$())!+`date`time`sym`side`orderType`pric

为防止这种扁平化,您可以通过添加通用 null

强制值成为混合列表
q)book: ``orderType1`orderType2`orderType3 !(::),(3# enlist(`ask`bid!(2# enlist bookDict)));

然后看起来像这样:

q)book
          | ::
orderType1| `ask`bid!+(,`)!,((+(,`orderID)!,`int$())!+`date`time`sym`side`ord
orderType2| `ask`bid!+(,`)!,((+(,`orderID)!,`int$())!+`date`time`sym`side`ord
orderType3| `ask`bid!+(,`)!,((+(,`orderID)!,`int$())!+`date`time`sym`side`ord

点索引现在有效:

q)book . `orderType1`ask`GOOG
orderID| date time sym side orderType price quantity
-------| -------------------------------------------

这意味着点修正现在也可以工作了

q).[`book;`orderType1`ask`GOOG;,;testorder]
`book
q)book
          | ::
orderType1| `ask`bid!+``GOOG!(((+(,`orderID)!,`int$())!+`date`time`sym`side`o
orderType2| `ask`bid!+(,`)!,((+(,`orderID)!,`int$())!+`date`time`sym`side`ord
orderType3| `ask`bid!+(,`)!,((+(,`orderID)!,`int$())!+`date`time`sym`side`ord

最后,我建议阅读这份关于如何最好地存储图书数据的 FD 白皮书:http://www.firstderivatives.com/downloads/q_for_Gods_Nov_2012.pdf