Skip to content

Commit

Permalink
feat: add id field to all OrderEvent variants
Browse files Browse the repository at this point in the history
This way all the variants are consistent in their structure and it's
always possible to retrieve the order ID from an order event without
matching.
  • Loading branch information
rubik committed Oct 10, 2020
1 parent 737546e commit c557a1e
Show file tree
Hide file tree
Showing 4 changed files with 74 additions and 56 deletions.
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,10 @@ use lobster::{FillMetadata, OrderBook, OrderEvent, OrderType, Side};

let mut ob = OrderBook::default();
let event = ob.execute(OrderType::Market { id: 0, qty: 1, side: Side::Bid });
assert_eq!(event, OrderEvent::Unfilled(0));
assert_eq!(event, OrderEvent::Unfilled { id: 0 });

let event = ob.execute(OrderType::Limit { id: 1, price: 120, qty: 3, side: Side::Ask });
assert_eq!(event, OrderEvent::Placed(1));
assert_eq!(event, OrderEvent::Placed { id: 1 });

let event = ob.execute(OrderType::Market { id: 2, qty: 4, side: Side::Bid });
assert_eq!(
Expand Down
4 changes: 2 additions & 2 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,10 @@
//!
//! let mut ob = OrderBook::default();
//! let event = ob.execute(OrderType::Market { id: 0, qty: 1, side: Side::Bid });
//! assert_eq!(event, OrderEvent::Unfilled(0));
//! assert_eq!(event, OrderEvent::Unfilled { id: 0 });
//!
//! let event = ob.execute(OrderType::Limit { id: 1, price: 120, qty: 3, side: Side::Ask });
//! assert_eq!(event, OrderEvent::Placed(1));
//! assert_eq!(event, OrderEvent::Placed { id: 1 });
//!
//! let event = ob.execute(OrderType::Market { id: 2, qty: 4, side: Side::Bid });
//! assert_eq!(
Expand Down
15 changes: 12 additions & 3 deletions src/models.rs
Original file line number Diff line number Diff line change
Expand Up @@ -45,13 +45,22 @@ pub enum OrderType {
pub enum OrderEvent {
/// Indicating that the corresponding order was not filled. It is only sent
/// in response to market orders.
Unfilled(u128),
Unfilled {
/// The ID of the order this event is referring to.
id: u128,
},
/// Indicating that the corresponding order was placed on the order book. It
/// is only send in response to limit orders.
Placed(u128),
Placed {
/// The ID of the order this event is referring to.
id: u128,
},
/// Indicating that the corresponding order was removed from the order book.
/// It is only sent in response to cancel orders.
Canceled(u128),
Canceled {
/// The ID of the order this event is referring to.
id: u128,
},
/// Indicating that the corresponding order was only partially filled. It is
/// sent in response to market or limit orders.
PartiallyFilled {
Expand Down
107 changes: 58 additions & 49 deletions src/orderbook.rs
Original file line number Diff line number Diff line change
Expand Up @@ -207,7 +207,7 @@ impl OrderBook {
OrderType::Market { id, side, qty } => {
let (fills, partial, filled_qty) = self.market(id, side, qty);
if fills.is_empty() {
OrderEvent::Unfilled(id)
OrderEvent::Unfilled { id }
} else {
match partial {
false => OrderEvent::Filled {
Expand All @@ -232,7 +232,7 @@ impl OrderBook {
let (fills, partial, filled_qty) =
self.limit(id, side, qty, price);
if fills.is_empty() {
OrderEvent::Placed(id)
OrderEvent::Placed { id }
} else {
match partial {
false => OrderEvent::Filled {
Expand All @@ -250,7 +250,7 @@ impl OrderBook {
}
OrderType::Cancel(id) => {
self.cancel(id);
OrderEvent::Canceled(id)
OrderEvent::Canceled { id }
}
}
}
Expand Down Expand Up @@ -618,7 +618,7 @@ mod test {
qty: 12,
price: 395,
}]);
assert_eq!(results, vec![OrderEvent::Placed(0)]);
assert_eq!(results, vec![OrderEvent::Placed { id: 0 }]);
if *bid_ask == Side::Bid {
assert_eq!(ob.min_ask(), None);
assert_eq!(ob.max_bid(), Some(395));
Expand Down Expand Up @@ -681,7 +681,10 @@ mod test {
if *bid_ask == Side::Bid {
assert_eq!(
results,
vec![OrderEvent::Placed(0), OrderEvent::Placed(1)]
vec![
OrderEvent::Placed { id: 0 },
OrderEvent::Placed { id: 1 }
]
);
assert_eq!(ob.min_ask(), Some(398));
assert_eq!(ob.max_bid(), Some(395));
Expand All @@ -705,7 +708,7 @@ mod test {
assert_eq!(
results,
vec![
OrderEvent::Placed(0),
OrderEvent::Placed { id: 0 },
OrderEvent::Filled {
id: 1,
filled_qty: 2,
Expand Down Expand Up @@ -765,7 +768,10 @@ mod test {
]);
assert_eq!(
results,
vec![OrderEvent::Placed(0), OrderEvent::Placed(1)]
vec![
OrderEvent::Placed { id: 0 },
OrderEvent::Placed { id: 1 }
]
);
if *bid_ask == Side::Bid {
assert_eq!(ob.min_ask(), None);
Expand Down Expand Up @@ -834,7 +840,10 @@ mod test {
]);
assert_eq!(
results,
vec![OrderEvent::Placed(0), OrderEvent::Placed(1)]
vec![
OrderEvent::Placed { id: 0 },
OrderEvent::Placed { id: 1 }
]
);
if *bid_ask == Side::Bid {
assert_eq!(ob.min_ask(), None);
Expand Down Expand Up @@ -885,9 +894,9 @@ mod test {
assert_eq!(
results,
vec![
OrderEvent::Placed(0),
OrderEvent::Placed(1),
OrderEvent::Placed(2)
OrderEvent::Placed { id: 0 },
OrderEvent::Placed { id: 1 },
OrderEvent::Placed { id: 2 }
]
);
assert_eq!(ob.min_ask(), Some(399));
Expand All @@ -902,7 +911,7 @@ mod test {
assert_eq!(
results,
vec![
OrderEvent::Placed(0),
OrderEvent::Placed { id: 0 },
OrderEvent::Filled {
id: 1,
filled_qty: 2,
Expand All @@ -913,7 +922,7 @@ mod test {
price: 395,
},],
},
OrderEvent::Placed(2)
OrderEvent::Placed { id: 2 }
]
);
assert_eq!(ob.min_ask(), Some(395));
Expand Down Expand Up @@ -962,9 +971,9 @@ mod test {
assert_eq!(
results,
vec![
OrderEvent::Placed(0),
OrderEvent::Placed(1),
OrderEvent::Placed(2)
OrderEvent::Placed { id: 0 },
OrderEvent::Placed { id: 1 },
OrderEvent::Placed { id: 2 }
]
);
assert_eq!(
Expand Down Expand Up @@ -992,7 +1001,7 @@ mod test {
assert_eq!(
results,
vec![
OrderEvent::Placed(0),
OrderEvent::Placed { id: 0 },
OrderEvent::Filled {
id: 1,
filled_qty: 2,
Expand All @@ -1003,7 +1012,7 @@ mod test {
price: 395,
},],
},
OrderEvent::Placed(2)
OrderEvent::Placed { id: 2 }
]
);
assert_eq!(
Expand Down Expand Up @@ -1065,9 +1074,9 @@ mod test {
assert_eq!(
results,
vec![
OrderEvent::Placed(0),
OrderEvent::Placed(1),
OrderEvent::Placed(2)
OrderEvent::Placed { id: 0 },
OrderEvent::Placed { id: 1 },
OrderEvent::Placed { id: 2 }
]
);
assert_eq!(
Expand Down Expand Up @@ -1095,7 +1104,7 @@ mod test {
assert_eq!(
results,
vec![
OrderEvent::Placed(0),
OrderEvent::Placed { id: 0 },
OrderEvent::Filled {
id: 1,
filled_qty: 2,
Expand All @@ -1106,7 +1115,7 @@ mod test {
price: 395,
},],
},
OrderEvent::Placed(2)
OrderEvent::Placed { id: 2 }
]
);
assert_eq!(
Expand Down Expand Up @@ -1168,9 +1177,9 @@ mod test {
assert_eq!(
results,
vec![
OrderEvent::Placed(0),
OrderEvent::Placed(1),
OrderEvent::Placed(2)
OrderEvent::Placed { id: 0 },
OrderEvent::Placed { id: 1 },
OrderEvent::Placed { id: 2 }
]
);
assert_eq!(
Expand Down Expand Up @@ -1201,7 +1210,7 @@ mod test {
assert_eq!(
results,
vec![
OrderEvent::Placed(0),
OrderEvent::Placed { id: 0 },
OrderEvent::Filled {
id: 1,
filled_qty: 2,
Expand All @@ -1212,7 +1221,7 @@ mod test {
price: 395,
},],
},
OrderEvent::Placed(2)
OrderEvent::Placed { id: 2 }
]
);
assert_eq!(
Expand Down Expand Up @@ -1250,7 +1259,7 @@ mod test {
qty: 5,
});

assert_eq!(result, OrderEvent::Unfilled(0));
assert_eq!(result, OrderEvent::Unfilled { id: 0 });
}
}

Expand Down Expand Up @@ -1287,9 +1296,9 @@ mod test {
assert_eq!(
results,
vec![
OrderEvent::Placed(0),
OrderEvent::Placed(1),
OrderEvent::Placed(2)
OrderEvent::Placed { id: 0 },
OrderEvent::Placed { id: 1 },
OrderEvent::Placed { id: 2 }
]
);
assert_eq!(
Expand Down Expand Up @@ -1322,7 +1331,7 @@ mod test {
assert_eq!(
results,
vec![
OrderEvent::Placed(0),
OrderEvent::Placed { id: 0 },
OrderEvent::Filled {
id: 1,
filled_qty: 2,
Expand All @@ -1333,7 +1342,7 @@ mod test {
price: 395,
},],
},
OrderEvent::Placed(2)
OrderEvent::Placed { id: 2 }
]
);
assert_eq!(
Expand Down Expand Up @@ -1399,9 +1408,9 @@ mod test {
assert_eq!(
results,
vec![
OrderEvent::Placed(0),
OrderEvent::Placed(1),
OrderEvent::Placed(2)
OrderEvent::Placed { id: 0 },
OrderEvent::Placed { id: 1 },
OrderEvent::Placed { id: 2 }
]
);
assert_eq!(
Expand Down Expand Up @@ -1437,7 +1446,7 @@ mod test {
assert_eq!(
results,
vec![
OrderEvent::Placed(0),
OrderEvent::Placed { id: 0 },
OrderEvent::Filled {
id: 1,
filled_qty: 2,
Expand All @@ -1448,7 +1457,7 @@ mod test {
price: 395,
},],
},
OrderEvent::Placed(2)
OrderEvent::Placed { id: 2 }
]
);
assert_eq!(
Expand Down Expand Up @@ -1480,7 +1489,7 @@ mod test {
fn cancel_non_existing_order() {
let (mut ob, _) = init_ob(vec![]);
let result = ob.execute(OrderType::Cancel(0));
assert_eq!(result, OrderEvent::Canceled(0));
assert_eq!(result, OrderEvent::Canceled { id: 0 });
assert_eq!(ob.min_ask(), None);
assert_eq!(ob.max_bid(), None);
assert_eq!(ob._asks(), BTreeMap::new());
Expand All @@ -1498,8 +1507,8 @@ mod test {
price: 395,
}]);
let result = ob.execute(OrderType::Cancel(0));
assert_eq!(results, vec![OrderEvent::Placed(0)]);
assert_eq!(result, OrderEvent::Canceled(0));
assert_eq!(results, vec![OrderEvent::Placed { id: 0 }]);
assert_eq!(result, OrderEvent::Canceled { id: 0 });
assert_eq!(ob.min_ask(), None);
assert_eq!(ob.max_bid(), None);
if *bid_ask == Side::Bid {
Expand Down Expand Up @@ -1541,12 +1550,12 @@ mod test {
assert_eq!(
results,
vec![
OrderEvent::Placed(0),
OrderEvent::Placed(1),
OrderEvent::Placed(2)
OrderEvent::Placed { id: 0 },
OrderEvent::Placed { id: 1 },
OrderEvent::Placed { id: 2 }
]
);
assert_eq!(result, OrderEvent::Canceled(0));
assert_eq!(result, OrderEvent::Canceled { id: 0 });
assert_eq!(ob.min_ask(), Some(399));
assert_eq!(ob.max_bid(), Some(398));
assert_eq!(ob._asks(), init_book(vec![(399, 9998)]));
Expand All @@ -1559,7 +1568,7 @@ mod test {
assert_eq!(
results,
vec![
OrderEvent::Placed(0),
OrderEvent::Placed { id: 0 },
OrderEvent::Filled {
id: 1,
filled_qty: 2,
Expand All @@ -1570,10 +1579,10 @@ mod test {
price: 395,
},],
},
OrderEvent::Placed(2)
OrderEvent::Placed { id: 2 }
]
);
assert_eq!(result, OrderEvent::Canceled(0));
assert_eq!(result, OrderEvent::Canceled { id: 0 });
assert_eq!(ob.min_ask(), Some(398));
assert_eq!(ob.max_bid(), None);
assert_eq!(
Expand Down

0 comments on commit c557a1e

Please sign in to comment.