在多交易所订单簿中捕获订单可以这样构造:
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))
是否有一个优雅的解决方案来维护订单簿,其中两个订单可以具有相同的时间戳,并且可以将这两个订单捕获为该级别的大小总和?
解释得很好!如果您在 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