This commit is contained in:
2024-07-30 15:27:25 -04:00
parent 8a92826c1f
commit a4e8bf1643

View File

@@ -385,7 +385,7 @@ impl Market {
} }
} }
} }
fn make_order(&mut self, owner:usize, sell_type:usize, buy_type:usize, sell_qty_initial:FiNum, buy_qty_initial:FiNum) -> Result { 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<String>=Vec::new(); let mut log:Vec<String>=Vec::new();
let initial_balance=self.traders[owner].get_balance(sell_type); let initial_balance=self.traders[owner].get_balance(sell_type);
let asset=self.number_to_asset(sell_type); let asset=self.number_to_asset(sell_type);
@@ -401,7 +401,7 @@ impl Market {
let mut royalty_acc=FiNum::zero(); let mut royalty_acc=FiNum::zero();
let mut commission_acc=FiNum::zero(); let mut commission_acc=FiNum::zero();
let new_order_id:usize; let new_order_id:usize;
while buy_qty>FiNum::new(0) && self.orders.contains_key(&ap) && self.orders.get(&ap).unwrap().v.len()>0 { while execute_if_possible && buy_qty>FiNum::new(0) && self.orders.contains_key(&ap) && self.orders.get(&ap).unwrap().v.len()>0 {
let mut elt=(*(self.orders.get(&ap).unwrap().v[0].borrow())).clone(); let mut elt=(*(self.orders.get(&ap).unwrap().v[0].borrow())).clone();
if sell_qty/buy_qty_initial>=elt.buy_qty/elt.sell_qty { // Transact at ask_rate if sell_qty/buy_qty_initial>=elt.buy_qty/elt.sell_qty { // Transact at ask_rate
let qty=std::cmp::min(elt.sell_remain,buy_qty); let qty=std::cmp::min(elt.sell_remain,buy_qty);
@@ -572,7 +572,7 @@ impl Market {
sell_qty=buy_qty*rng.gen_range(60..=70).into(); sell_qty=buy_qty*rng.gen_range(60..=70).into();
} }
let mut _success=false; let mut _success=false;
if let Result::Ok=self.make_order(seller,sell_type,buy_type,sell_qty,buy_qty) { count+=1; _success=true; }; if let Result::Ok=self.make_order(seller,sell_type,buy_type,sell_qty,buy_qty,true) { count+=1; _success=true; };
if count>=1000000 { break; } if count>=1000000 { break; }
tries+=1; tries+=1;
} }
@@ -665,6 +665,7 @@ enum Command {
AddFunds { user_id: usize, asset_id: usize, amt: FiNum }, AddFunds { user_id: usize, asset_id: usize, amt: FiNum },
SubFunds { user_id: usize, asset_id: usize, amt: FiNum }, SubFunds { user_id: usize, asset_id: usize, amt: FiNum },
Order { user_id: usize, sell_type: usize, sell_qty: FiNum, buy_type: usize, buy_qty: FiNum }, Order { user_id: usize, sell_type: usize, sell_qty: FiNum, buy_type: usize, buy_qty: FiNum },
OrderBatch { user_id: usize, sell_type: usize, sell_qty: FiNum, buy_type: usize, buy_qty: FiNum },
Retract { order_id: usize }, Retract { order_id: usize },
Error(String), Error(String),
NOP(String), NOP(String),
@@ -686,6 +687,8 @@ impl Command {
=> format!("SF {} {} {}",user_id,asset_id,amt.serialize()), => format!("SF {} {} {}",user_id,asset_id,amt.serialize()),
Self::Order { user_id, sell_type, sell_qty, buy_type, buy_qty } Self::Order { user_id, sell_type, sell_qty, buy_type, buy_qty }
=> format!("OR {} {} {} {} {}",user_id,sell_type,sell_qty.serialize(),buy_type,buy_qty.serialize()), => format!("OR {} {} {} {} {}",user_id,sell_type,sell_qty.serialize(),buy_type,buy_qty.serialize()),
Self::OrderBatch { user_id, sell_type, sell_qty, buy_type, buy_qty }
=> format!("ORB {} {} {} {} {}",user_id,sell_type,sell_qty.serialize(),buy_type,buy_qty.serialize()),
Self::Retract { order_id } => format!("RE {}",order_id), Self::Retract { order_id } => format!("RE {}",order_id),
Self::Error(str) => format!("NOP Error: {}",str), Self::Error(str) => format!("NOP Error: {}",str),
Self::NOP(str) => format!("NOP {}",clean(str)), Self::NOP(str) => format!("NOP {}",clean(str)),
@@ -707,6 +710,9 @@ impl Command {
["OR",user_id,sell_type,sell_qty,buy_type,buy_qty] => ["OR",user_id,sell_type,sell_qty,buy_type,buy_qty] =>
Self::Order { user_id: user_id.parse::<usize>().unwrap(), sell_type: sell_type.parse::<usize>().unwrap(), sell_qty: FiNum::new_deserialize(sell_qty), Self::Order { user_id: user_id.parse::<usize>().unwrap(), sell_type: sell_type.parse::<usize>().unwrap(), sell_qty: FiNum::new_deserialize(sell_qty),
buy_type: buy_type.parse::<usize>().unwrap(), buy_qty: FiNum::new_deserialize(buy_qty) }, buy_type: buy_type.parse::<usize>().unwrap(), buy_qty: FiNum::new_deserialize(buy_qty) },
["ORB",user_id,sell_type,sell_qty,buy_type,buy_qty] =>
Self::OrderBatch { user_id: user_id.parse::<usize>().unwrap(), sell_type: sell_type.parse::<usize>().unwrap(), sell_qty: FiNum::new_deserialize(sell_qty),
buy_type: buy_type.parse::<usize>().unwrap(), buy_qty: FiNum::new_deserialize(buy_qty) },
["NOP", many_things @ ..] => Self::NOP(clean(&line)), ["NOP", many_things @ ..] => Self::NOP(clean(&line)),
_ => Self::Error("Unimplemented Parse".to_string()), _ => Self::Error("Unimplemented Parse".to_string()),
} }
@@ -765,7 +771,10 @@ impl Market {
} }
} }
Command::Order { user_id, sell_type, sell_qty, buy_type, buy_qty } => { Command::Order { user_id, sell_type, sell_qty, buy_type, buy_qty } => {
self.make_order(*user_id,*sell_type,*buy_type,*sell_qty,*buy_qty) self.make_order(*user_id,*sell_type,*buy_type,*sell_qty,*buy_qty,true)
}
Command::OrderBatch { user_id, sell_type, sell_qty, buy_type, buy_qty } => {
self.make_order(*user_id,*sell_type,*buy_type,*sell_qty,*buy_qty,false)
} }
Command::Error(str) => Result::Error(format!("Command Error")), Command::Error(str) => Result::Error(format!("Command Error")),
Command::NOP(str) => Result::Ok, Command::NOP(str) => Result::Ok,
@@ -841,6 +850,17 @@ fn tokens_to_command(m: &Market, logged_in: usize, tokens: Vec<&str>,line: &str)
else if qty1.is_zero() { Command::Error("Qty1 is must be > 0".to_string()) } else if qty1.is_zero() { Command::Error("Qty1 is must be > 0".to_string()) }
else { Command::Order { user_id: logged_in, sell_type: *cur0.unwrap(), sell_qty: qty0, buy_type: *cur1.unwrap(), buy_qty: qty1 } } else { Command::Order { user_id: logged_in, sell_type: *cur0.unwrap(), sell_qty: qty0, buy_type: *cur1.unwrap(), buy_qty: qty1 } }
} }
["orderbatch", qty0, cur0, qty1, cur1 ] => {
let qty0=FiNum::new_str(qty0);
let cur0=m.name_to_number(cur0);
let qty1=FiNum::new_str(qty1);
let cur1=m.name_to_number(cur1);
if !cur0.is_some() { Command::Error("Count not find currency".to_string()) }
else if !cur1.is_some() { Command::Error("Count not find currency".to_string()) }
else if qty0.is_zero() { Command::Error("Qty0 is must be > 0".to_string()) }
else if qty1.is_zero() { Command::Error("Qty1 is must be > 0".to_string()) }
else { Command::Orderbatch { user_id: logged_in, sell_type: *cur0.unwrap(), sell_qty: qty0, buy_type: *cur1.unwrap(), buy_qty: qty1 } }
}
_ => { Command::Error(line.to_string()) }, _ => { Command::Error(line.to_string()) },
}; };
cmd cmd