2016-04-01 14 views
0

私はトップレベルの辞書が3つの基本的な注文タイプを保持している注文帳データ構造を作成しようとしています。これらのタイプのそれぞれには入札と尋ねのサイドがあり、各サイドにはティッカーごとに1つのテーブルのリストがあります。たとえば、私が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))); 

ブックを使用したデータの取得は[ `orderType1] [`尋ねる] [ `ティッカー]はは正常に動作しているようです。私は特定の順序帳例えばに新しい注文を追加しようとすると問題が表示されます:最後のクエリを実行する

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; 

はエラーを割り当てる」できます。どういう理由ですか?どのようにそれを解決するには?

答えて

2

ここにいくつかの問題があります。即ち

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

あなたはインライン繰り返す一連のキーを使用して辞書にルックアップすることができながら、ということで最初のものは、(だけ深い1つのレベルで割り当てることができ)、このような値を割り当てることができません。より良いアプローチは、ドットインデクシング(およびドット補正)を使用して値を再割り当てすることです。しかし、問題は、辞書のリストが統一されているため、ブック辞書の値がテーブルに平らになっていることです。だから、これは失敗します。

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 

を検査することにより、平坦化してしまったかを確認することができます

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 
-------| ------------------------------------------- 

ドットは、修正することを意味している今、最後に、私はどのように最高の店帳データの上でこのFDのホワイトペーパーを読むことをお勧めし

すぎ

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 
に動作します: http://www.firstderivatives.com/downloads/q_for_Gods_Nov_2012.pdf

+0

多くのありがとうございます。キー付きのテーブルでappend(カンマ)を使用しない理由を説明してください。 ** [\\ book; \ 'orderType1 \' ask \ 'GOOG;、; testorder] **は正常に動作しているようです(注文IDがテーブルにない場合は新しいエントリを追加し、それ以外の場合は既存のエントリを更新します)。また、はるかに高速です(〜100sオーダーをアップするには〜36秒、100000オーダーを追加するには〜7秒)。リンクしているFDの論文でもそうしています(たとえば、基盤となるテーブルが価格で設定されているupdBySymSide2)。 – dhk

+0

あなたは正しく、私の悪いです。私はそれが私のテストで失敗したと思った。私は私の答えを編集します – terrylynch

関連する問題