use crate::market::quote::SimpleQuote;
use crate::order_book::OrderBook;
pub fn mid_quote(book: &OrderBook) -> Option<SimpleQuote<f64>> {
book.mid().map(SimpleQuote::new)
}
pub fn half_spread_quote(book: &OrderBook) -> Option<SimpleQuote<f64>> {
book.spread().map(|s| SimpleQuote::new(s / 2.0))
}
#[cfg(test)]
mod tests {
use super::*;
use crate::market::quote::Quote;
use crate::order_book::Side;
#[test]
fn mid_quote_from_book() {
let mut ob = OrderBook::new();
ob.add_order(Side::Buy, 100.0, 1.0);
ob.add_order(Side::Sell, 102.0, 1.0);
let q = mid_quote(&ob).unwrap();
assert!((q.value() - 101.0).abs() < 1e-12);
}
#[test]
fn half_spread_quote_from_book() {
let mut ob = OrderBook::new();
ob.add_order(Side::Buy, 100.0, 1.0);
ob.add_order(Side::Sell, 102.0, 1.0);
let q = half_spread_quote(&ob).unwrap();
assert!((q.value() - 1.0).abs() < 1e-12);
}
#[test]
fn empty_book_returns_none() {
let ob = OrderBook::new();
assert!(mid_quote(&ob).is_none());
assert!(half_spread_quote(&ob).is_none());
}
}