Skip to content

Commit 87c33a3

Browse files
authored
Merge pull request #5 from joaquinbejar/jb/emi-2-pricelevel-crate-modifications
Jb/emi 2 pricelevel crate modifications
2 parents b1b9404 + 098594b commit 87c33a3

29 files changed

+570
-217
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "pricelevel"
3-
version = "0.5.0"
3+
version = "0.6.0"
44
edition = "2024"
55
authors = ["Joaquin Bejar <jb@taunais.com>"]
66
description = "A high-performance, lock-free price level implementation for limit order books in Rust. This library provides the building blocks for creating efficient trading systems with support for multiple order types and concurrent access patterns."

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
[![Dual License](https://img.shields.io/badge/license-MIT%20and%20Apache%202.0-blue)](./LICENSE)
1+
[![Dual License](https://img.shields.io/badge/license-MIT-blue)](./LICENSE)
22
[![Crates.io](https://img.shields.io/crates/v/pricelevel.svg)](https://crates.io/crates/pricelevel)
33
[![Downloads](https://img.shields.io/crates/d/pricelevel.svg)](https://crates.io/crates/pricelevel)
44
[![Stars](https://img.shields.io/github/stars/joaquinbejar/PriceLevel.svg)](https://github.com/joaquinbejar/PriceLevel/stargazers)

README.tpl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
[![Dual License](https://img.shields.io/badge/license-MIT%20and%20Apache%202.0-blue)](./LICENSE)
1+
[![Dual License](https://img.shields.io/badge/license-MIT-blue)](./LICENSE)
22
[![Crates.io](https://img.shields.io/crates/v/pricelevel.svg)](https://crates.io/crates/pricelevel)
33
[![Downloads](https://img.shields.io/crates/d/pricelevel.svg)](https://crates.io/crates/pricelevel)
44
[![Stars](https://img.shields.io/github/stars/joaquinbejar/PriceLevel.svg)](https://github.com/joaquinbejar/PriceLevel/stargazers)

benches/concurrent/contention.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
use criterion::{BenchmarkId, Criterion};
2-
use pricelevel::{OrderId, OrderType, OrderUpdate, PriceLevel, Side, TimeInForce, UuidGenerator};
2+
use pricelevel::{
3+
Hash32, OrderId, OrderType, OrderUpdate, PriceLevel, Side, TimeInForce, UuidGenerator,
4+
};
35
use std::sync::{Arc, Barrier};
46
use std::thread;
57
use std::time::{Duration, Instant};
@@ -242,12 +244,13 @@ fn measure_hot_spot_contention(
242244

243245
/// Create a standard limit order for testing
244246
#[allow(dead_code)]
245-
fn create_standard_order(id: u64, price: u64, quantity: u64) -> OrderType<()> {
247+
fn create_standard_order(id: u64, price: u128, quantity: u64) -> OrderType<()> {
246248
OrderType::Standard {
247249
id: OrderId::from_u64(id),
248250
price,
249251
quantity,
250252
side: Side::Buy,
253+
user_id: Hash32::zero(),
251254
timestamp: 1616823000000,
252255
time_in_force: TimeInForce::Gtc,
253256
extra_fields: (),

benches/concurrent/register.rs

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use criterion::{BenchmarkId, Criterion, criterion_group};
22
use pricelevel::{
3-
OrderId, OrderType, OrderUpdate, PegReferenceType, PriceLevel, Side, TimeInForce, UuidGenerator,
3+
Hash32, OrderId, OrderType, OrderUpdate, PegReferenceType, PriceLevel, Side, TimeInForce,
4+
UuidGenerator,
45
};
56
use std::sync::{Arc, Barrier};
67
use std::thread;
@@ -349,39 +350,42 @@ fn measure_concurrent_mixed_operations(thread_count: usize, iterations: u64) ->
349350
// Helper functions to create different types of orders for benchmarking
350351

351352
/// Create a standard limit order for testing
352-
fn create_standard_order(id: u64, price: u64, quantity: u64) -> OrderType<()> {
353+
fn create_standard_order(id: u64, price: u128, quantity: u64) -> OrderType<()> {
353354
OrderType::Standard {
354355
id: OrderId::from_u64(id),
355356
price,
356357
quantity,
357358
side: Side::Buy,
359+
user_id: Hash32::zero(),
358360
timestamp: 1616823000000,
359361
time_in_force: TimeInForce::Gtc,
360362
extra_fields: (),
361363
}
362364
}
363365

364366
/// Create an iceberg order for testing
365-
fn create_iceberg_order(id: u64, price: u64, visible: u64, hidden: u64) -> OrderType<()> {
367+
fn create_iceberg_order(id: u64, price: u128, visible: u64, hidden: u64) -> OrderType<()> {
366368
OrderType::IcebergOrder {
367369
id: OrderId::from_u64(id),
368370
price,
369371
visible_quantity: visible,
370372
hidden_quantity: hidden,
371373
side: Side::Buy,
374+
user_id: Hash32::zero(),
372375
timestamp: 1616823000000,
373376
time_in_force: TimeInForce::Gtc,
374377
extra_fields: (),
375378
}
376379
}
377380

378381
/// Create a post-only order for testing
379-
fn create_post_only_order(id: u64, price: u64, quantity: u64) -> OrderType<()> {
382+
fn create_post_only_order(id: u64, price: u128, quantity: u64) -> OrderType<()> {
380383
OrderType::PostOnly {
381384
id: OrderId::from_u64(id),
382385
price,
383386
quantity,
384387
side: Side::Buy,
388+
user_id: Hash32::zero(),
385389
timestamp: 1616823000000,
386390
time_in_force: TimeInForce::Gtc,
387391
extra_fields: (),
@@ -391,7 +395,7 @@ fn create_post_only_order(id: u64, price: u64, quantity: u64) -> OrderType<()> {
391395
/// Create a reserve order for testing
392396
fn create_reserve_order(
393397
id: u64,
394-
price: u64,
398+
price: u128,
395399
visible: u64,
396400
hidden: u64,
397401
threshold: u64,
@@ -404,6 +408,7 @@ fn create_reserve_order(
404408
visible_quantity: visible,
405409
hidden_quantity: hidden,
406410
side: Side::Buy,
411+
user_id: Hash32::zero(),
407412
timestamp: 1616823000000,
408413
time_in_force: TimeInForce::Gtc,
409414
replenish_threshold: threshold,
@@ -414,12 +419,13 @@ fn create_reserve_order(
414419
}
415420

416421
/// Create a pegged order for testing
417-
fn create_pegged_order(id: u64, price: u64, quantity: u64) -> OrderType<()> {
422+
fn create_pegged_order(id: u64, price: u128, quantity: u64) -> OrderType<()> {
418423
OrderType::PeggedOrder {
419424
id: OrderId::from_u64(id),
420425
price,
421426
quantity,
422427
side: Side::Buy,
428+
user_id: Hash32::zero(),
423429
timestamp: 1616823000000,
424430
time_in_force: TimeInForce::Gtc,
425431
reference_price_offset: -50,
@@ -435,9 +441,10 @@ fn setup_standard_orders(order_count: u64) -> PriceLevel {
435441
for i in 0..order_count {
436442
let order = OrderType::Standard {
437443
id: OrderId::from_u64(i),
438-
price: 10000,
444+
price: 10000u128,
439445
quantity: 10,
440446
side: Side::Buy,
447+
user_id: Hash32::zero(),
441448
timestamp: 1616823000000 + i,
442449
time_in_force: TimeInForce::Gtc,
443450
extra_fields: (),

benches/price_level/add_orders.rs

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use criterion::{BenchmarkId, Criterion};
2-
use pricelevel::{OrderId, OrderType, PriceLevel, Side, TimeInForce};
2+
use pricelevel::{Hash32, OrderId, OrderType, PriceLevel, Side, TimeInForce};
33
use std::hint::black_box;
44

55
/// Register all benchmarks for adding orders to a price level
@@ -79,39 +79,42 @@ pub fn register_benchmarks(c: &mut Criterion) {
7979
// Helper functions to create different types of orders for benchmarking
8080

8181
/// Create a standard limit order for testing
82-
fn create_standard_order(id: u64, price: u64, quantity: u64) -> OrderType<()> {
82+
fn create_standard_order(id: u64, price: u128, quantity: u64) -> OrderType<()> {
8383
OrderType::Standard {
8484
id: OrderId::from_u64(id),
8585
price,
8686
quantity,
8787
side: Side::Buy,
88+
user_id: Hash32::zero(),
8889
timestamp: 1616823000000,
8990
time_in_force: TimeInForce::Gtc,
9091
extra_fields: (),
9192
}
9293
}
9394

9495
/// Create an iceberg order for testing
95-
fn create_iceberg_order(id: u64, price: u64, visible: u64, hidden: u64) -> OrderType<()> {
96+
fn create_iceberg_order(id: u64, price: u128, visible: u64, hidden: u64) -> OrderType<()> {
9697
OrderType::IcebergOrder {
9798
id: OrderId::from_u64(id),
9899
price,
99100
visible_quantity: visible,
100101
hidden_quantity: hidden,
101102
side: Side::Buy,
103+
user_id: Hash32::zero(),
102104
timestamp: 1616823000000,
103105
time_in_force: TimeInForce::Gtc,
104106
extra_fields: (),
105107
}
106108
}
107109

108110
/// Create a post-only order for testing
109-
fn create_post_only_order(id: u64, price: u64, quantity: u64) -> OrderType<()> {
111+
fn create_post_only_order(id: u64, price: u128, quantity: u64) -> OrderType<()> {
110112
OrderType::PostOnly {
111113
id: OrderId::from_u64(id),
112114
price,
113115
quantity,
114116
side: Side::Buy,
117+
user_id: Hash32::zero(),
115118
timestamp: 1616823000000,
116119
time_in_force: TimeInForce::Gtc,
117120
extra_fields: (),
@@ -121,7 +124,7 @@ fn create_post_only_order(id: u64, price: u64, quantity: u64) -> OrderType<()> {
121124
/// Create a reserve order for testing
122125
fn create_reserve_order(
123126
id: u64,
124-
price: u64,
127+
price: u128,
125128
visible: u64,
126129
hidden: u64,
127130
threshold: u64,
@@ -134,6 +137,7 @@ fn create_reserve_order(
134137
visible_quantity: visible,
135138
hidden_quantity: hidden,
136139
side: Side::Buy,
140+
user_id: Hash32::zero(),
137141
timestamp: 1616823000000,
138142
time_in_force: TimeInForce::Gtc,
139143
replenish_threshold: threshold,
@@ -144,14 +148,15 @@ fn create_reserve_order(
144148
}
145149

146150
/// Create a pegged order for testing
147-
fn create_pegged_order(id: u64, price: u64, quantity: u64) -> OrderType<()> {
151+
fn create_pegged_order(id: u64, price: u128, quantity: u64) -> OrderType<()> {
148152
use pricelevel::PegReferenceType;
149153

150154
OrderType::PeggedOrder {
151155
id: OrderId::from_u64(id),
152156
price,
153157
quantity,
154158
side: Side::Buy,
159+
user_id: Hash32::zero(),
155160
timestamp: 1616823000000,
156161
time_in_force: TimeInForce::Gtc,
157162
reference_price_offset: -50,

benches/price_level/match_orders.rs

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use criterion::{BenchmarkId, Criterion};
2-
use pricelevel::{OrderId, OrderType, PriceLevel, Side, TimeInForce, UuidGenerator};
2+
use pricelevel::{Hash32, OrderId, OrderType, PriceLevel, Side, TimeInForce, UuidGenerator};
33
use std::hint::black_box;
44
use uuid::Uuid;
55

@@ -118,9 +118,10 @@ fn setup_standard_orders(order_count: u64) -> PriceLevel {
118118
for i in 0..order_count {
119119
let order = OrderType::Standard {
120120
id: OrderId::from_u64(i),
121-
price: 10000,
121+
price: 10000u128,
122122
quantity: 10,
123123
side: Side::Buy,
124+
user_id: Hash32::zero(),
124125
timestamp: 1616823000000 + i,
125126
time_in_force: TimeInForce::Gtc,
126127
extra_fields: (),
@@ -138,10 +139,11 @@ fn setup_iceberg_orders(order_count: u64) -> PriceLevel {
138139
for i in 0..order_count {
139140
let order = OrderType::IcebergOrder {
140141
id: OrderId::from_u64(i),
141-
price: 10000,
142+
price: 10000u128,
142143
visible_quantity: 5,
143144
hidden_quantity: 15,
144145
side: Side::Buy,
146+
user_id: Hash32::zero(),
145147
timestamp: 1616823000000 + i,
146148
time_in_force: TimeInForce::Gtc,
147149
extra_fields: (),
@@ -159,10 +161,11 @@ fn setup_reserve_orders(order_count: u64) -> PriceLevel {
159161
for i in 0..order_count {
160162
let order = OrderType::ReserveOrder {
161163
id: OrderId::from_u64(i),
162-
price: 10000,
164+
price: 10000u128,
163165
visible_quantity: 5,
164166
hidden_quantity: 15,
165167
side: Side::Buy,
168+
user_id: Hash32::zero(),
166169
timestamp: 1616823000000 + i,
167170
time_in_force: TimeInForce::Gtc,
168171
replenish_threshold: 2,
@@ -184,29 +187,32 @@ fn setup_mixed_orders(order_count: u64) -> PriceLevel {
184187
let order = match i % 3 {
185188
0 => OrderType::Standard {
186189
id: OrderId::from_u64(i),
187-
price: 10000,
190+
price: 10000u128,
188191
quantity: 10,
189192
side: Side::Buy,
193+
user_id: Hash32::zero(),
190194
timestamp: 1616823000000 + i,
191195
time_in_force: TimeInForce::Gtc,
192196
extra_fields: (),
193197
},
194198
1 => OrderType::IcebergOrder {
195199
id: OrderId::from_u64(i),
196-
price: 10000,
200+
price: 10000u128,
197201
visible_quantity: 5,
198202
hidden_quantity: 15,
199203
side: Side::Buy,
204+
user_id: Hash32::zero(),
200205
timestamp: 1616823000000 + i,
201206
time_in_force: TimeInForce::Gtc,
202207
extra_fields: (),
203208
},
204209
_ => OrderType::ReserveOrder {
205210
id: OrderId::from_u64(i),
206-
price: 10000,
211+
price: 10000u128,
207212
visible_quantity: 5,
208213
hidden_quantity: 15,
209214
side: Side::Buy,
215+
user_id: Hash32::zero(),
210216
timestamp: 1616823000000 + i,
211217
time_in_force: TimeInForce::Gtc,
212218
replenish_threshold: 2,

benches/price_level/mixed_operations.rs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
use criterion::Criterion;
2-
use pricelevel::{OrderId, OrderType, OrderUpdate, PriceLevel, Side, TimeInForce, UuidGenerator};
2+
use pricelevel::{
3+
Hash32, OrderId, OrderType, OrderUpdate, PriceLevel, Side, TimeInForce, UuidGenerator,
4+
};
35
use std::hint::black_box;
46
use uuid::Uuid;
57

@@ -154,26 +156,28 @@ pub fn register_benchmarks(c: &mut Criterion) {
154156
// Helper functions to create different types of orders for benchmarking
155157

156158
/// Create a standard limit order for testing
157-
fn create_standard_order(id: u64, price: u64, quantity: u64) -> OrderType<()> {
159+
fn create_standard_order(id: u64, price: u128, quantity: u64) -> OrderType<()> {
158160
OrderType::Standard {
159161
id: OrderId::from_u64(id),
160162
price,
161163
quantity,
162164
side: Side::Buy,
165+
user_id: Hash32::zero(),
163166
timestamp: 1616823000000 + id,
164167
time_in_force: TimeInForce::Gtc,
165168
extra_fields: (),
166169
}
167170
}
168171

169172
/// Create an iceberg order for testing
170-
fn create_iceberg_order(id: u64, price: u64, visible: u64, hidden: u64) -> OrderType<()> {
173+
fn create_iceberg_order(id: u64, price: u128, visible: u64, hidden: u64) -> OrderType<()> {
171174
OrderType::IcebergOrder {
172175
id: OrderId::from_u64(id),
173176
price,
174177
visible_quantity: visible,
175178
hidden_quantity: hidden,
176179
side: Side::Buy,
180+
user_id: Hash32::zero(),
177181
timestamp: 1616823000000 + id,
178182
time_in_force: TimeInForce::Gtc,
179183
extra_fields: (),
@@ -183,7 +187,7 @@ fn create_iceberg_order(id: u64, price: u64, visible: u64, hidden: u64) -> Order
183187
/// Create a reserve order for testing
184188
fn create_reserve_order(
185189
id: u64,
186-
price: u64,
190+
price: u128,
187191
visible: u64,
188192
hidden: u64,
189193
threshold: u64,
@@ -196,6 +200,7 @@ fn create_reserve_order(
196200
visible_quantity: visible,
197201
hidden_quantity: hidden,
198202
side: Side::Buy,
203+
user_id: Hash32::zero(),
199204
timestamp: 1616823000000 + id,
200205
time_in_force: TimeInForce::Gtc,
201206
replenish_threshold: threshold,

benches/price_level/update_orders.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use criterion::{BenchmarkId, Criterion};
2-
use pricelevel::{OrderId, OrderType, OrderUpdate, PriceLevel, Side, TimeInForce};
2+
use pricelevel::{Hash32, OrderId, OrderType, OrderUpdate, PriceLevel, Side, TimeInForce};
33
use std::hint::black_box;
44

55
/// Register all benchmarks for updating orders at a price level
@@ -109,9 +109,10 @@ fn setup_standard_orders(order_count: u64) -> PriceLevel {
109109
for i in 0..order_count {
110110
let order = OrderType::Standard {
111111
id: OrderId::from_u64(i),
112-
price: 10000,
112+
price: 10000u128,
113113
quantity: 10,
114114
side: Side::Buy,
115+
user_id: Hash32::zero(),
115116
timestamp: 1616823000000 + i,
116117
time_in_force: TimeInForce::Gtc,
117118
extra_fields: (),
@@ -129,10 +130,11 @@ fn setup_iceberg_orders(order_count: u64) -> PriceLevel {
129130
for i in 0..order_count {
130131
let order = OrderType::IcebergOrder {
131132
id: OrderId::from_u64(i),
132-
price: 10000,
133+
price: 10000u128,
133134
visible_quantity: 5,
134135
hidden_quantity: 15,
135136
side: Side::Buy,
137+
user_id: Hash32::zero(),
136138
timestamp: 1616823000000 + i,
137139
time_in_force: TimeInForce::Gtc,
138140
extra_fields: (),

0 commit comments

Comments
 (0)