pub trait MarketMetric<V> {
fn compute(bids: &V, asks: &V, depth: usize) -> f64;
}
pub struct Spread;
impl MarketMetric<f64> for Spread {
fn compute(bids: &f64, asks: &f64, _depth: usize) -> f64 {
asks - bids
}
}
pub struct Midprice;
impl MarketMetric<f64> for Midprice {
fn compute(bids: &f64, asks: &f64, _depth: usize) -> f64 {
(bids + asks) / 2.0
}
}
pub struct VWAP;
impl MarketMetric<Vec<Vec<f64>>> for VWAP {
fn compute(bids: &Vec<Vec<f64>>, asks: &Vec<Vec<f64>>, depth: usize) -> f64 {
let mut bids_mult: Vec<f64> = vec![];
let mut asks_mult: Vec<f64> = vec![];
let mut vol_sum: Vec<f64> = vec![];
for i_level in 0..=depth {
bids_mult.push(bids[i_level][0] * bids[i_level][1]);
asks_mult.push(asks[i_level][0] * asks[i_level][1]);
vol_sum.push(bids[i_level][1] + asks[i_level][1]);
}
let r_vwap_1: f64 = bids_mult.iter().sum();
let r_vwap_2: f64 = asks_mult.iter().sum();
let r_vwap_3: f64 = vol_sum.iter().sum();
(r_vwap_1 + r_vwap_2) / r_vwap_3
}
}
pub struct VolumeImbalance;
impl MarketMetric<Vec<f64>> for VolumeImbalance {
fn compute(bids: &Vec<f64>, asks: &Vec<f64>, depth: usize) -> f64 {
let mut bids_mult: Vec<f64> = vec![];
let mut asks_mult: Vec<f64> = vec![];
for i_level in 0..=depth {
bids_mult.push(bids[i_level]);
asks_mult.push(asks[i_level]);
}
let r_obimb_1: f64 = bids_mult.iter().sum();
let r_obimb_2: f64 = asks_mult.iter().sum();
(r_obimb_1 - r_obimb_2) / (r_obimb_1 + r_obimb_2)
}
}