我正在尝试创建一个订单簿数据结构,其中顶级字典包含3种基本订单类型,每种类型都有一个买卖方,每个方面都有一个表列表,每个订单一个。例如,如果我想检索针对Google股票的所有类型1的请求订单,我会调用 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 错误。原因是什么?怎么解决?
答案 0 :(得分:2)
这里有几个问题。首先是你可以使用一系列在线重复键来查找字典,即
q)book[`orderType1][`ask][`GOOG]
orderID| date time sym side orderType price quantity
-------| -------------------------------------------
你不能像这样分配值(只能在一个深度分配)。更好的方法是使用点索引(和点修改来重新分配值)。然而,问题是由于字典列表是统一的,您的图书字典的价值会变得平坦。所以这失败了:
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