changes
This commit is contained in:
53
src/main.rs
53
src/main.rs
@@ -44,12 +44,13 @@ use std::fs::OpenOptions;
|
|||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
use std::io::{self, BufRead, Write};
|
use std::io::{self, BufRead, Write};
|
||||||
use std::env;
|
use std::env;
|
||||||
use std::collections::HashMap;
|
//use std::collections::HashMap;
|
||||||
use std::cmp::Ordering;
|
use std::cmp::Ordering;
|
||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
use std::cell::RefCell;
|
use std::cell::RefCell;
|
||||||
use rand::prelude::*;
|
use rand::prelude::*;
|
||||||
use rand::rngs::StdRng;
|
use rand::rngs::StdRng;
|
||||||
|
use hashbrown::HashMap;
|
||||||
mod finum;
|
mod finum;
|
||||||
use finum::FiNum;
|
use finum::FiNum;
|
||||||
|
|
||||||
@@ -393,23 +394,25 @@ impl Market {
|
|||||||
let mut log:Vec<String>=Vec::new();
|
let mut log:Vec<String>=Vec::new();
|
||||||
let asset0=self.number_to_asset(asset_type0);
|
let asset0=self.number_to_asset(asset_type0);
|
||||||
let asset1=self.number_to_asset(asset_type1);
|
let asset1=self.number_to_asset(asset_type1);
|
||||||
|
log.push(format!("Executing batch {} {} <-> {} {}",strike0,asset0.name,strike1,asset1.name));
|
||||||
let ap0=(asset_type0,asset_type1);
|
let ap0=(asset_type0,asset_type1);
|
||||||
let ap1=(asset_type1,asset_type0);
|
let ap1=(asset_type1,asset_type0);
|
||||||
let bids0=self.orders.get_mut(&ap0).unwrap();
|
let [bids0,bids1]=self.orders.get_many_mut([&ap0, &ap1]).unwrap();
|
||||||
let bids1=self.orders.get_mut(&ap1).unwrap();
|
while !bids0.empty() && !bids1.empty()
|
||||||
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 {
|
&& bids0.peek().borrow().sell_qty/bids0.peek().borrow().buy_qty>=strike0/strike1
|
||||||
let asset0_getting=std::cmp::min(bids1.peek().sell_remain,bids0.peek().buy_qty*bids0.peek().sell_remain/bids0.peek().sell_qty);
|
&& bids1.peek().borrow().sell_qty/bids1.peek().borrow().buy_qty>=strike1/strike0 {
|
||||||
let asset0_paying =std::cmp::min(bids0.peek().sell_remain,bids1.peek().buy_qty*bids1.peek().sell_remain/bids1.peek().sell_qty);
|
let asset0_paying =std::cmp::min(bids0.peek().borrow().sell_remain,strike0*bids1.peek().borrow().sell_remain/bids1.peek().borrow().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().borrow().sell_remain,strike1*bids0.peek().borrow().sell_remain/bids0.peek().borrow().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().borrow_mut().sell_remain-=asset0_paying;
|
||||||
bids0.peek().sell_remain-=asset0_paying;
|
bids1.peek().borrow_mut().sell_remain-=asset1_paying;
|
||||||
bids1.peek().sell_remain-=asset1_paying;
|
self.traders[bids0.peek().borrow().owner].add_balance(asset_type1,asset1_paying);
|
||||||
self.traders[bids0.peek().owner].add_balance(asset_type0,asset0_getting);
|
self.traders[bids1.peek().borrow().owner].add_balance(asset_type0,asset0_paying);
|
||||||
self.traders[bids1.peek().owner].add_balance(asset_type1,asset1_getting);
|
log.push(format!(" {} got {} {}, {} got {} {}",self.traders[bids0.peek().borrow().owner].name,asset1_paying,asset1.name,
|
||||||
if bids0.peek().sell_remain==0 { bids0.pop(); }
|
self.traders[bids1.peek().borrow().owner].name,asset0_paying,asset0.name));
|
||||||
if bids1.peek().sell_remain==0 { bids1.pop(); }
|
if bids0.peek().borrow().sell_remain==FiNum::zero() { bids0.pop(); }
|
||||||
}
|
if bids1.peek().borrow().sell_remain==FiNum::zero() { bids1.pop(); }
|
||||||
Result::ExecutedBatch(FiNum::zero(),FiNum::zero())
|
}
|
||||||
|
Result::ExecutedBatch(log)
|
||||||
}
|
}
|
||||||
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 {
|
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();
|
||||||
@@ -531,7 +534,7 @@ impl<T: Dumpable + std::cmp::PartialOrd + std::fmt::Debug> PQueue<T> {
|
|||||||
&self.v[0]
|
&self.v[0]
|
||||||
}
|
}
|
||||||
fn empty(&self) -> bool {
|
fn empty(&self) -> bool {
|
||||||
self.v.len()>0
|
self.v.len()==0
|
||||||
}
|
}
|
||||||
fn bubble_up(&mut self, pos: usize) -> usize {
|
fn bubble_up(&mut self, pos: usize) -> usize {
|
||||||
if pos>0 {
|
if pos>0 {
|
||||||
@@ -684,11 +687,11 @@ fn royalty_stuff() {
|
|||||||
|
|
||||||
|
|
||||||
enum Result {
|
enum Result {
|
||||||
AddedTrader(usize),
|
AddedTrader(usize,String),
|
||||||
AddedAsset(usize),
|
AddedAsset(usize,String),
|
||||||
PlacedOrder(usize, Vec<String>),
|
PlacedOrder(usize, Vec<String>),
|
||||||
FundsRemaining(FiNum),
|
FundsRemaining(FiNum),
|
||||||
ExecutedBatch(FiNum,FiNum),
|
ExecutedBatch(Vec<String>),
|
||||||
Error(String),
|
Error(String),
|
||||||
Ok
|
Ok
|
||||||
}
|
}
|
||||||
@@ -763,9 +766,9 @@ impl Result {
|
|||||||
fn describe(&self) -> String {
|
fn describe(&self) -> String {
|
||||||
match self {
|
match self {
|
||||||
Self::PlacedOrder(order_id,vec) => format!("Placed order {}:\n {}",order_id,vec.join("\n ")),
|
Self::PlacedOrder(order_id,vec) => format!("Placed order {}:\n {}",order_id,vec.join("\n ")),
|
||||||
Self::AddedTrader(id) => format!("Added Trader Id {}",id),
|
Self::AddedTrader(id,name) => format!("Added Trader Id {}: {}",id,name),
|
||||||
Self::AddedAsset(id) => format!("Added Asset Id {}",id),
|
Self::AddedAsset(id,name) => format!("Added Asset Id {}: {}",id,name),
|
||||||
Self::ExecutedBatch(amt0,amt1) => format!("Executed Batch {} / {}",amt0,amt1),
|
Self::ExecutedBatch(vec) => format!("{}",vec.join("\n")),
|
||||||
Self::FundsRemaining(amt) => format!("Funds Remaining: {}",amt),
|
Self::FundsRemaining(amt) => format!("Funds Remaining: {}",amt),
|
||||||
Self::Ok => format!("Ok"),
|
Self::Ok => format!("Ok"),
|
||||||
Self::Error(str) => format!("Error: {}",str),
|
Self::Error(str) => format!("Error: {}",str),
|
||||||
@@ -783,11 +786,11 @@ impl Market {
|
|||||||
match cmd {
|
match cmd {
|
||||||
Command::AddTrader { user: user_name } => {
|
Command::AddTrader { user: user_name } => {
|
||||||
let id=self.register_trader(user_name);
|
let id=self.register_trader(user_name);
|
||||||
Result::AddedTrader(id)
|
Result::AddedTrader(id,user_name.to_string())
|
||||||
}
|
}
|
||||||
Command::AddAsset { asset: asset_name } => {
|
Command::AddAsset { asset: asset_name } => {
|
||||||
if let Some(cur)=self.register_asset(asset_name) {
|
if let Some(cur)=self.register_asset(asset_name) {
|
||||||
Result::AddedAsset(cur)
|
Result::AddedAsset(cur,asset_name.to_string())
|
||||||
} else { Result::Error(format!("Asset {} already exists.",asset_name)) }
|
} else { Result::Error(format!("Asset {} already exists.",asset_name)) }
|
||||||
}
|
}
|
||||||
Command::SetRoyalty { asset_id,roy0,com0,roy1,com1 } => {
|
Command::SetRoyalty { asset_id,roy0,com0,roy1,com1 } => {
|
||||||
|
|||||||
Reference in New Issue
Block a user