Skip to content

Commit

Permalink
feat: make OrderType::Cancel a struct and add FillMetadata.taker_side
Browse files Browse the repository at this point in the history
  • Loading branch information
rubik committed Oct 10, 2020
1 parent 1bf2ba7 commit 8cf135f
Show file tree
Hide file tree
Showing 5 changed files with 54 additions and 20 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ assert_eq!(
order_2: 1,
qty: 3,
price: 120,
taker_side: Side::Bid,
}
],
},
Expand Down
4 changes: 3 additions & 1 deletion examples/quantcup.rs
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,9 @@ fn main() {

fn convert_to_order(id: &mut u128, record: Record) -> OrderType {
if record.2 == 0 {
OrderType::Cancel(record.3 as u128)
OrderType::Cancel {
id: record.3 as u128,
}
} else {
*id += 1;
OrderType::Limit {
Expand Down
1 change: 1 addition & 0 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
//! order_2: 1,
//! qty: 3,
//! price: 120,
//! taker_side: Side::Bid,
//! }
//! ],
//! },
Expand Down
7 changes: 6 additions & 1 deletion src/models.rs
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,10 @@ pub enum OrderType {
},
/// A cancel order, which removes the order with the specified ID from the
/// order book.
Cancel(u128),
Cancel {
/// The unique ID of the order to be canceled.
id: u128,
},
}

/// An event resulting from the execution of an order.
Expand Down Expand Up @@ -95,6 +98,8 @@ pub struct FillMetadata {
pub qty: u64,
/// The price at which the trade happened.
pub price: u64,
/// The side of the taker order (order 1)
pub taker_side: Side,
}

/// A snapshot of the order book up to a certain depth level. Multiple orders at
Expand Down
61 changes: 43 additions & 18 deletions src/orderbook.rs
Original file line number Diff line number Diff line change
Expand Up @@ -248,7 +248,7 @@ impl OrderBook {
}
}
}
OrderType::Cancel(id) => {
OrderType::Cancel { id } => {
self.cancel(id);
OrderEvent::Canceled { id }
}
Expand Down Expand Up @@ -413,6 +413,7 @@ impl OrderBook {
queue,
remaining_qty,
id,
Side::Bid,
fills,
);
if queue.is_empty() {
Expand Down Expand Up @@ -455,6 +456,7 @@ impl OrderBook {
queue,
remaining_qty,
id,
Side::Ask,
fills,
);
if queue.is_empty() {
Expand Down Expand Up @@ -489,6 +491,7 @@ impl OrderBook {
opposite_orders: &mut Vec<usize>,
remaining_qty: u64,
id: u128,
side: Side,
fills: &mut Vec<FillMetadata>,
) -> u64 {
let mut qty_to_fill = remaining_qty;
Expand Down Expand Up @@ -523,6 +526,7 @@ impl OrderBook {
order_2: head_order.id,
qty: traded_quantity,
price: traded_price,
taker_side: side,
};
fills.push(fill);
filled_qty += traded_quantity;
Expand Down Expand Up @@ -717,6 +721,7 @@ mod test {
order_2: 0,
qty: 2,
price: 395,
taker_side: *ask_bid,
}],
}
]
Expand Down Expand Up @@ -920,6 +925,7 @@ mod test {
order_2: 0,
qty: 2,
price: 395,
taker_side: *ask_bid,
},],
},
OrderEvent::Placed { id: 2 }
Expand Down Expand Up @@ -985,7 +991,8 @@ mod test {
order_1: 3,
order_2: 2,
qty: 1,
price: 398
price: 398,
taker_side: *ask_bid,
}]
}
);
Expand All @@ -1010,6 +1017,7 @@ mod test {
order_2: 0,
qty: 2,
price: 395,
taker_side: *ask_bid,
},],
},
OrderEvent::Placed { id: 2 }
Expand All @@ -1024,7 +1032,8 @@ mod test {
order_1: 3,
order_2: 0,
qty: 1,
price: 395
price: 395,
taker_side: *ask_bid,
}]
}
);
Expand Down Expand Up @@ -1088,7 +1097,8 @@ mod test {
order_1: 3,
order_2: 2,
qty: 2,
price: 398
price: 398,
taker_side: *ask_bid,
}]
}
);
Expand All @@ -1113,6 +1123,7 @@ mod test {
order_2: 0,
qty: 2,
price: 395,
taker_side: *ask_bid,
},],
},
OrderEvent::Placed { id: 2 }
Expand All @@ -1127,7 +1138,8 @@ mod test {
order_1: 3,
order_2: 0,
qty: 2,
price: 395
price: 395,
taker_side: *ask_bid,
}]
}
);
Expand Down Expand Up @@ -1191,7 +1203,8 @@ mod test {
order_1: 3,
order_2: 2,
qty: 2,
price: 398
price: 398,
taker_side: *ask_bid,
}]
}
);
Expand Down Expand Up @@ -1219,6 +1232,7 @@ mod test {
order_2: 0,
qty: 2,
price: 395,
taker_side: *ask_bid,
},],
},
OrderEvent::Placed { id: 2 }
Expand All @@ -1233,7 +1247,8 @@ mod test {
order_1: 3,
order_2: 0,
qty: 5,
price: 395
price: 395,
taker_side: *ask_bid,
}]
}
);
Expand Down Expand Up @@ -1311,13 +1326,15 @@ mod test {
order_1: 3,
order_2: 2,
qty: 2,
price: 398
price: 398,
taker_side: *ask_bid,
},
FillMetadata {
order_1: 3,
order_2: 0,
qty: 12,
price: 395
price: 395,
taker_side: *ask_bid,
}
]
}
Expand All @@ -1340,7 +1357,8 @@ mod test {
order_2: 0,
qty: 2,
price: 395,
},],
taker_side: *ask_bid,
}],
},
OrderEvent::Placed { id: 2 }
]
Expand All @@ -1355,13 +1373,15 @@ mod test {
order_1: 3,
order_2: 0,
qty: 10,
price: 395
price: 395,
taker_side: *ask_bid,
},
FillMetadata {
order_1: 3,
order_2: 2,
qty: 2,
price: 398
price: 398,
taker_side: *ask_bid,
}
]
}
Expand Down Expand Up @@ -1423,13 +1443,15 @@ mod test {
order_1: 3,
order_2: 2,
qty: 2,
price: 398
price: 398,
taker_side: *ask_bid,
},
FillMetadata {
order_1: 3,
order_2: 0,
qty: 5,
price: 395
price: 395,
taker_side: *ask_bid,
}
]
}
Expand All @@ -1455,6 +1477,7 @@ mod test {
order_2: 0,
qty: 2,
price: 395,
taker_side: *ask_bid,
},],
},
OrderEvent::Placed { id: 2 }
Expand All @@ -1469,7 +1492,8 @@ mod test {
order_1: 3,
order_2: 0,
qty: 7,
price: 395
price: 395,
taker_side: *ask_bid,
},]
}
);
Expand All @@ -1488,7 +1512,7 @@ mod test {
#[test]
fn cancel_non_existing_order() {
let (mut ob, _) = init_ob(vec![]);
let result = ob.execute(OrderType::Cancel(0));
let result = ob.execute(OrderType::Cancel { id: 0 });
assert_eq!(result, OrderEvent::Canceled { id: 0 });
assert_eq!(ob.min_ask(), None);
assert_eq!(ob.max_bid(), None);
Expand All @@ -1506,7 +1530,7 @@ mod test {
qty: 12,
price: 395,
}]);
let result = ob.execute(OrderType::Cancel(0));
let result = ob.execute(OrderType::Cancel { id: 0 });
assert_eq!(results, vec![OrderEvent::Placed { id: 0 }]);
assert_eq!(result, OrderEvent::Canceled { id: 0 });
assert_eq!(ob.min_ask(), None);
Expand Down Expand Up @@ -1545,7 +1569,7 @@ mod test {
price: 398,
},
]);
let result = ob.execute(OrderType::Cancel(0));
let result = ob.execute(OrderType::Cancel { id: 0 });
if *bid_ask == Side::Bid {
assert_eq!(
results,
Expand Down Expand Up @@ -1577,6 +1601,7 @@ mod test {
order_2: 0,
qty: 2,
price: 395,
taker_side: *ask_bid,
},],
},
OrderEvent::Placed { id: 2 }
Expand Down

0 comments on commit 8cf135f

Please sign in to comment.