plus-amending .[;;+;] 嵌套字典 - 限价订单簿示例

问题描述 投票:0回答:1

在多交易所订单簿中捕获订单可以这样构造:

q)init:{B::(1#`)!enlist x!count[x]#enlist `s#(enlist 0Np)!enlist (0#0Ni)!(0#0Ni)} / [e(x)changes]:initialized global order (B)ook
q)add0:{.[`B;-1 _ x;:;last x]}     / [orders:(`sym;`ex;tstam(p);px(i);sz(i))]:(add)ed to (B)ook
q)add:{ .[`B;-1 _ x;+;last x]}     / [orders:(`sym;`ex;tstam(p);px(i);sz(i))]:(add)ed to (B)ook
q)state::(+/'')B    / state view of the order book, rolling up all the events; `state is a view as per https://code.kx.com/q/learn/views/

我们可以单独添加订单:

q)ti:2024.05.07D14                / timestamp
q)init `binance`bybit             / initialize order book B
q)B[`btc;`binance;ti;62i]:5i      / order to buy 5 BTC on Binance for 62 gets added as bid (no matching here)
q)B[`eth;`binance;ti;3000i]:6i
q)B[`btc;`bybit;ti;62i]:-2i       / sell order gets added as ask (no matching)
q)B[`eth;`bybit;ti;3000i]:1i
q)B
   | binance                                                              bybit                                                               
   | -----------------------------------------------------------------------------------------------------------------------------------------
   | `s#(`s#,0Np)!,(`int$())!`int$()                                      `s#(`s#,0Np)!,(`int$())!`int$()                                     
btc| `s#0N 2024.05.07D14:00:00.000000000!((`int$())!`int$();(,62i)!,5i)   `s#0N 2024.05.07D14:00:00.000000000!((`int$())!`int$();(,62i)!,-2i) 
eth| `s#0N 2024.05.07D14:00:00.000000000!((`int$())!`int$();(,3000i)!,6i) `s#0N 2024.05.07D14:00:00.000000000!((`int$())!`int$();(,3000i)!,1i)
q)state
   | binance           bybit            
   | -----------------------------------
   | (`int$())!`int$() (`int$())!`int$()
btc| (,62i)!,5i        (,62i)!,-2i      
eth| (,3000i)!,6i      (,3000i)!,1i     

我们可以像这样批量修改订单向量:https://code.kx.com/q/ref/amend/#cross-sections

q)ti:2024.05.07D15
q)add0 (`btc;`binance;ti; 62 65i;   4 -1i);
q)state
   | binance           bybit            
   | -----------------------------------
   | (`int$())!`int$() (`int$())!`int$()
btc| 62 65i!9 -1i      (,62i)!,-2i      
eth| (,3000i)!,6i      (,3000i)!,1i     
q)B
   | binance                                                                                                       bybit                                                               
   | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
   | `s#(`s#,0Np)!,(`int$())!`int$()                                                                               `s#(`s#,0Np)!,(`int$())!`int$()                                     
btc| `s#0N 2024.05.07D14:00:00.000000000 2024.05.07D15:00:00.000000000!((`int$())!`int$();(,62i)!,5i;62 65i!4 -1i) `s#0N 2024.05.07D14:00:00.000000000!((`int$())!`int$();(,62i)!,-2i) 
eth| `s#0N 2024.05.07D14:00:00.000000000!((`int$())!`int$();(,3000i)!,6i)                                          `s#0N 2024.05.07D14:00:00.000000000!((`int$())!`int$();(,3000i)!,1i)

但是,如果两个订单以相同的时间和价格到达,则仅使用此

.[;;:;]
分配形式捕获序列中的最后一个订单,之前的值将被覆盖:

q)ti:2024.05.07D16
q)add0 (`btc;`binance;ti; 62 62i; 10 20i);
q)B
   | binance                                                                                                                                                 bybit                                                               
   | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
   | `s#(`s#,0Np)!,(`int$())!`int$()                                                                                                                         `s#(`s#,0Np)!,(`int$())!`int$()                                     
btc| `s#0N 2024.05.07D14:00:00.000000000 2024.05.07D15:00:00.000000000 2024.05.07D16:00:00.000000000!((`int$())!`int$();(,62i)!,5i;62 65i!4 -1i;(,62i)!,20i) `s#0N 2024.05.07D14:00:00.000000000!((`int$())!`int$();(,62i)!,-2i) 
eth| `s#0N 2024.05.07D14:00:00.000000000!((`int$())!`int$();(,3000i)!,6i)                                                                                    `s#0N 2024.05.07D14:00:00.000000000!((`int$())!`int$();(,3000i)!,1i)
q)state
   | binance           bybit            
   | -----------------------------------
   | (`int$())!`int$() (`int$())!`int$()
btc| 62 65i!29 -1i     (,62i)!,-2i      
eth| (,3000i)!,6i      (,3000i)!,1i     

受到这种语义的启发:

q)(1 2!3 4)+2 5!-6 -7
1| 3
2| -2
5| -7

我们引入

.[;;+;]
来代替
.[;;:;]
:

q)add (`btc;`binance;ti; 62 62i; 10 20i);
q)B
   | binance                                                                                                                                                 bybit                                                               
   | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
   | `s#(`s#,0Np)!,(`int$())!`int$()                                                                                                                         `s#(`s#,0Np)!,(`int$())!`int$()                                     
btc| `s#0N 2024.05.07D14:00:00.000000000 2024.05.07D15:00:00.000000000 2024.05.07D16:00:00.000000000!((`int$())!`int$();(,62i)!,5i;62 65i!4 -1i;(,62i)!,50i) `s#0N 2024.05.07D14:00:00.000000000!((`int$())!`int$();(,62i)!,-2i) 
eth| `s#0N 2024.05.07D14:00:00.000000000!((`int$())!`int$();(,3000i)!,6i)                                                                                    `s#0N 2024.05.07D14:00:00.000000000!((`int$())!`int$();(,3000i)!,1i)
q)state
   | binance           bybit            
   | -----------------------------------
   | (`int$())!`int$() (`int$())!`int$()
btc| 62 65i!59 -1i     (,62i)!,-2i      
eth| (,3000i)!,6i      (,3000i)!,1i     

问题是它仅适用于预先存在的密钥,而不是当必须使用此修改创建新密钥时:

q)add (`btc;`binance;2024.05.07D15; 63 64i; 100 -300i);
q)B
   | binance                                                                                                                                                                bybit                                                               
   | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
   | `s#(`s#,0Np)!,(`int$())!`int$()                                                                                                                                        `s#(`s#,0Np)!,(`int$())!`int$()                                     
btc| `s#0N 2024.05.07D14:00:00.000000000 2024.05.07D15:00:00.000000000 2024.05.07D16:00:00.000000000!((`int$())!`int$();(,62i)!,5i;62 65 63 64i!4 -1 100 -300i;(,62i)!,50i) `s#0N 2024.05.07D14:00:00.000000000!((`int$())!`int$();(,62i)!,-2i) 
eth| `s#0N 2024.05.07D14:00:00.000000000!((`int$())!`int$();(,3000i)!,6i)                                                                                                   `s#0N 2024.05.07D14:00:00.000000000!((`int$())!`int$();(,3000i)!,1i)
q)state
   | binance                      bybit            
   | ----------------------------------------------
   | (`int$())!`int$()            (`int$())!`int$()
btc| 62 65 63 64i!59 -1 100 -300i (,62i)!,-2i      
eth| (,3000i)!,6i                 (,3000i)!,1i     

q)ti:2024.05.07D17
q)add (`btc;`binance;ti; 63 64i; 100 -300i);
'length
  [1]  add:{ .[`B;-1 _ x;+;last x]}
             ^
q))

是否有一个优雅的解决方案来维护订单簿,其中两个订单可以具有相同的时间戳,并且可以将这两个订单捕获为该级别的大小总和?

kdb
1个回答
0
投票

解释得很好!如果您在 add 函数中更明确地了解字典结构(以及更高一级的索引)会怎样?例如

q)add2:{.[`B;-2 _ x;+;last[-1_x]!last x]}

然后我认为它有效

q)ti:2024.05.07D17
q)add2 (`btc;`binance;ti; 63 64i; 100 -300i);
q)
q)B[`btc;`binance]
                             | (`int$())!`int$()
2024.05.07D14:00:00.000000000| (,62i)!,5i
2024.05.07D15:00:00.000000000| 62 65 63 64i!4 -1 100 -300i
2024.05.07D16:00:00.000000000| 62 62i!40 20i
2024.05.07D17:00:00.000000000| 63 64i!100 -300i

我认为它也解决了您的重复问题

q)ti:2024.05.07D16
q)add2 (`btc;`binance;ti; 62 62i; 10 20i);
q)
q)B[`btc;`binance]
                             | (`int$())!`int$()
2024.05.07D14:00:00.000000000| (,62i)!,5i
2024.05.07D15:00:00.000000000| 62 65i!4 -1i
2024.05.07D16:00:00.000000000| 62 62i!10 20i
© www.soinside.com 2019 - 2024. All rights reserved.