diff options
| author | lazydancer <jrpucula@gmail.com> | 2024-12-22 17:33:11 -0500 |
|---|---|---|
| committer | lazydancer <jrpucula@gmail.com> | 2024-12-22 17:33:11 -0500 |
| commit | 2c5b7da8165e3f8b90748e8ced1de0e3e8d52309 (patch) | |
| tree | 6d6e4e1d0cb0c7ec5e1dff83bfeda4b044258b81 /rust_backend/src/market/trade.rs | |
| download | haul-2c5b7da8165e3f8b90748e8ced1de0e3e8d52309.tar.gz | |
Initial
Diffstat (limited to 'rust_backend/src/market/trade.rs')
| -rw-r--r-- | rust_backend/src/market/trade.rs | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/rust_backend/src/market/trade.rs b/rust_backend/src/market/trade.rs new file mode 100644 index 0000000..362acbf --- /dev/null +++ b/rust_backend/src/market/trade.rs @@ -0,0 +1,63 @@ +use crate::order::Order; + +pub struct Trade<'a> { + from: &'a Order, + to: &'a Order, + quantity: usize, + gross_profit: f64, +} + +const TAX_RATE: f64 = 0.08 + +impl<'a> Trade<'a> { + pub fn new(from: &'a Order, to: &'a Order, quantity: usize) -> Self { + Self { from, to, quantity } + } + + pub fn create_trades(sell_orders: &'a [Order], buy_orders: &'a [Order]) -> Vec<Trade<'a>> { + let mut trades: Vec<Trade<'a>> = Vec::new(); + let mut grouped_orders: HashMap<i32, (Vec<&'a Order>, Vec<&'a Order>)> = HashMap::new(); + + // Grouping sell orders + for order in sell_orders { + grouped_orders.entry(order.type_id) + .or_insert((Vec::new(), Vec::new())) + .0 + .push(order); + } + + // Grouping buy orders + for order in buy_orders { + grouped_orders.entry(order.type_id) + .or_insert((Vec::new(), Vec::new())) + .1 + .push(order); + } + + // Iterating over each type_id's sell and buy orders to create trades + for (_type_id, (sells, buys)) in grouped_orders { + for &sell_order in sells { + for &buy_order in buys { + let quantity = std::cmp::min(sell_order.volume_remain, buy_order.volume_remain); + let gross_profit = quantity as f64 * (buy_order.price * (1-TAX_RATE) - sell_order.price); + + if gross_profit <= 0.0 { + continue; + } + + let trade = Trade::new( + sell_order, + buy_order, + quantity, + gross_profit, + ); + + trades.push(trade); + } + } + } + + trades + } + +} |
