Skip to content

Commit 99a5c1e

Browse files
committed
starts stack only orderbook work
* creates orderbook-slab library * defines our level data structure where liquidity for each exchange is mirroed
1 parent 31fef82 commit 99a5c1e

File tree

6 files changed

+100
-0
lines changed

6 files changed

+100
-0
lines changed

Cargo.lock

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ members = [
1515
"exchange",
1616
"depth-driver",
1717
"orderbook",
18+
"orderbook-slabs",
1819
"ring-buffer",
1920
"testing/depth-generator",
2021
"testing/exchange-stubs",

orderbook-slabs/Cargo.toml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
[package]
2+
name = "orderbook-slabs"
3+
version = "0.1.0"
4+
edition = "2024"
5+
6+
[dependencies]
7+
fixed = "1.29.0"
8+
rustc-hash.workspace = true

orderbook-slabs/src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
mod liquidity;
2+
mod slab;

orderbook-slabs/src/liquidity.rs

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
use fixed::{FixedU32, types::extra::U0};
2+
3+
#[derive(Copy, Clone, Debug)]
4+
pub struct LiquidityNode {
5+
q: FixedU32<U0>,
6+
l: u8,
7+
}
8+
9+
// Runs a macro to create our level with N size - N being the
10+
// exchange number this service is mirroring
11+
//
12+
/*
13+
impl Level<LiquidityNode> {
14+
fn new(price_level: f64) -> Self {
15+
let mut level = Level {
16+
price: price_level,
17+
deque: [LiquidityNode {
18+
q: FixedU32::MIN,
19+
l: 0,
20+
}; N]
21+
};
22+
for i in 0..N {
23+
level.deque[i] = LiquidityNode {
24+
q: FixedU32::from_num(0),
25+
l: i as u8 + 1,
26+
}
27+
}
28+
level
29+
}
30+
}
31+
*/
32+
33+
macro_rules! level_exchange_depth {
34+
($exchanges:expr) => {
35+
#[derive(Clone)]
36+
pub struct Level<LiquidityNode> {
37+
price: FixedU32<U0>,
38+
deque: [LiquidityNode; $exchanges],
39+
}
40+
41+
impl Level<LiquidityNode> {
42+
pub fn new(price_level: FixedU32<U0>) -> Self {
43+
let mut level = Level {
44+
price: price_level,
45+
deque: [LiquidityNode {
46+
q: FixedU32::MIN,
47+
l: 0,
48+
}; $exchanges],
49+
};
50+
for i in 0..$exchanges {
51+
level.deque[i] = LiquidityNode {
52+
q: FixedU32::MIN,
53+
l: i as u8 + 1,
54+
}
55+
}
56+
level
57+
}
58+
}
59+
};
60+
}
61+
62+
// todo: this parameter will be configurable in the build script
63+
// at the root of this project - its the total number of exchanges
64+
// this service is mirroring
65+
level_exchange_depth!(10);

orderbook-slabs/src/slab.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
use crate::liquidity::{Level, LiquidityNode};
2+
use fixed::{FixedU32, types::extra::U0};
3+
use rustc_hash::FxHashMap;
4+
5+
struct Side {
6+
internal: FxHashMap<FixedU32<U0>, Level<LiquidityNode>>,
7+
}
8+
9+
impl Side {
10+
fn new(price_depth: FixedU32<U0>) -> Side {
11+
let internal: FxHashMap<FixedU32<U0>, Level<LiquidityNode>> = FxHashMap::default();
12+
Side {
13+
internal: FxHashMap::default(),
14+
}
15+
}
16+
}

0 commit comments

Comments
 (0)