From 2c173df8883a646be3a02e90c3bbfb537e2e3b2f Mon Sep 17 00:00:00 2001 From: Teppy Date: Wed, 31 Jul 2024 19:45:35 -0400 Subject: [PATCH] changes --- src/main.rs | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 411cb76..c83209e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -390,7 +390,26 @@ impl Market { } } fn execute_batch(&mut self, asset_type0: usize, strike0: FiNum, asset_type1: usize, strike1: FiNum) -> Result { - Result::Error("Execute_batch not yet implemented".to_string()) + let mut log:Vec=Vec::new(); + let asset0=self.number_to_asset(asset_type0); + let asset1=self.number_to_asset(asset_type1); + let ap0=(asset_type0,asset_type1); + let ap1=(asset_type1,asset_type0); + let bids0=self.orders.get_mut(&ap0).unwrap(); + let bids1=self.orders.get_mut(&ap1).unwrap(); + while !bids0.empty() && !bids1.empty() && bids0.peek().sell_qty/bids0.peek().buy_qty>=strike0/strike1 && bids1.peek().sell_qty/bids1.peek().buy_qty<=strike1/strike0 { + let asset0_getting=std::cmp::min(bids1.peek().sell_remain,bids0.peek().buy_qty*bids0.peek().sell_remain/bids0.peek().sell_qty); + let asset0_paying =std::cmp::min(bids0.peek().sell_remain,bids1.peek().buy_qty*bids1.peek().sell_remain/bids1.peek().sell_qty); + let asset1_getting=std::cmp::min(bids0.peek().sell_remain,bids1.peek().buy_qty*bids1.peek().sell_remain/bids1.peek().sell_qty); + let asset1_paying =std::cmp::min(bids1.peek().sell_remain,bids0.peek().buy_qty*bids0.peek().sell_remain/bids0.peek().sell_qty); + bids0.peek().sell_remain-=asset0_paying; + bids1.peek().sell_remain-=asset1_paying; + self.traders[bids0.peek().owner].add_balance(asset_type0,asset0_getting); + self.traders[bids1.peek().owner].add_balance(asset_type1,asset1_getting); + if bids0.peek().sell_remain==0 { bids0.pop(); } + if bids1.peek().sell_remain==0 { bids1.pop(); } + } + Result::ExecutedBatch(FiNum::zero(),FiNum::zero()) } fn make_order(&mut self, owner:usize, sell_type:usize, buy_type:usize, sell_qty_initial:FiNum, buy_qty_initial:FiNum, execute_if_possible:bool) -> Result { let mut log:Vec=Vec::new(); @@ -511,6 +530,9 @@ impl PQueue { fn peek(&self) -> &T { &self.v[0] } + fn empty(&self) -> bool { + self.v.len()>0 + } fn bubble_up(&mut self, pos: usize) -> usize { if pos>0 { let parent=(pos-1)/2;