This commit is contained in:
2024-08-06 18:10:48 -04:00
parent 951c95d13f
commit 2b7e635037
2 changed files with 30 additions and 5 deletions

View File

@@ -21,6 +21,9 @@ impl FiNum {
pub fn zero() -> Self { pub fn zero() -> Self {
FiNum(0u64) FiNum(0u64)
} }
pub fn one() -> Self {
FiNum(1u64<<32)
}
pub fn is_zero(self) -> bool { pub fn is_zero(self) -> bool {
self.0==0 self.0==0
} }
@@ -30,6 +33,10 @@ impl FiNum {
pub fn recip(&self) -> Self { pub fn recip(&self) -> Self {
FiNum((0x8000000000000000u64/self.0)<<1) FiNum((0x8000000000000000u64/self.0)<<1)
} }
pub fn fmt_recip(&self) -> String {
if *self<FiNum::one() { format!("1/{}",self.recip()) }
else { format!("{}",self) }
}
pub fn serialize(&self) -> String { pub fn serialize(&self) -> String {
format!("{:X}",self.0) format!("{:X}",self.0)
} }

View File

@@ -366,7 +366,7 @@ impl Market {
for off in sorted.iter() { for off in sorted.iter() {
println!(" {} @ {} ({}) OrderID: {} PQLoc: {} RTLoc: {} Royalties: {}", println!(" {} @ {} ({}) OrderID: {} PQLoc: {} RTLoc: {} Royalties: {}",
off.sell_remain, // off.buy_qty*off.sell_remain/off.sell_qty, off.sell_remain, // off.buy_qty*off.sell_remain/off.sell_qty,
off.buy_qty/off.sell_qty, (off.buy_qty/off.sell_qty).fmt_recip(),
self.traders[off.owner as usize].name, self.traders[off.owner as usize].name,
off.id,off.pq_loc,off.rt_loc, off.id,off.pq_loc,off.rt_loc,
self.royalties.get_mut(&ap.1).unwrap().get_royalty(off.rt_loc)); self.royalties.get_mut(&ap.1).unwrap().get_royalty(off.rt_loc));
@@ -406,14 +406,25 @@ impl Market {
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)); log.push(format!("Executing batch {} {} <-> {} {}",strike0,asset0.name,strike1,asset1.name));
println!("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,bids1]=self.orders.get_many_mut([&ap0, &ap1]).unwrap(); let [bids0,bids1]=self.orders.get_many_mut([&ap0, &ap1]).unwrap();
/* let sq0=bids0.peek().sell_qty;
let bq0=bids0.peek().buy_qty;
let sq1=bids1.peek().sell_qty;
let bq1=bids1.peek().buy_qty;
let q0=sq0/bq0>=strike0/strike1;
let q1=sq1/bq1>=strike1/strike0;
println!("{}/{} >= {}/{} is {}",sq0,bq0,strike0,strike1,q0);
println!("{}/{} >= {}/{} is {}",sq1,bq1,strike1,strike0,q1);*/
while !bids0.empty() && !bids1.empty() while !bids0.empty() && !bids1.empty()
&& bids0.peek().sell_qty/bids0.peek().buy_qty>=strike0/strike1 && bids0.peek().sell_qty/bids0.peek().buy_qty>=strike0/strike1
&& bids1.peek().sell_qty/bids1.peek().buy_qty>=strike1/strike0 { && bids1.peek().sell_qty/bids1.peek().buy_qty>=strike1/strike0 {
let asset0_paying =std::cmp::min(bids0.peek().sell_remain,strike0*bids1.peek().sell_remain/bids1.peek().sell_qty); println!("For Asset0 ({}) paying either {} or {}",asset0.name,bids0.peek().sell_remain,strike0*bids1.peek().sell_remain/strike1);
let asset1_paying =std::cmp::min(bids1.peek().sell_remain,strike1*bids0.peek().sell_remain/bids0.peek().sell_qty); println!("For Asset1 ({}) paying either {} or {}",asset1.name,bids1.peek().sell_remain,strike1*bids0.peek().sell_remain/strike0);
let asset0_paying =std::cmp::min(bids0.peek().sell_remain,strike0*bids1.peek().sell_remain/strike1);
let asset1_paying =std::cmp::min(bids1.peek().sell_remain,strike1*bids0.peek().sell_remain/strike0);
bids0.peek().sell_remain-=asset0_paying; bids0.peek().sell_remain-=asset0_paying;
bids1.peek().sell_remain-=asset1_paying; bids1.peek().sell_remain-=asset1_paying;
self.traders[bids0.peek().owner].add_balance(asset_type1,asset1_paying); self.traders[bids0.peek().owner].add_balance(asset_type1,asset1_paying);
@@ -422,6 +433,14 @@ impl Market {
self.traders[bids1.peek().owner].name,asset0_paying,asset0.name)); self.traders[bids1.peek().owner].name,asset0_paying,asset0.name));
if bids0.peek().sell_remain==FiNum::zero() { bids0.pop(); } if bids0.peek().sell_remain==FiNum::zero() { bids0.pop(); }
if bids1.peek().sell_remain==FiNum::zero() { bids1.pop(); } if bids1.peek().sell_remain==FiNum::zero() { bids1.pop(); }
/* let sq0=bids0.peek().sell_qty;
let bq0=bids0.peek().buy_qty;
let sq1=bids1.peek().sell_qty;
let bq1=bids1.peek().buy_qty;
let q0=sq0/bq0>=strike0/strike1;
let q1=sq1/bq1>=strike1/strike0;
println!("{}/{} >= {}/{} is {}",sq0,bq0,strike0,strike1,q0);
println!("{}/{} >= {}/{} is {}",sq1,bq1,strike1,strike0,q1);*/
} }
Result::ExecutedBatch(log) Result::ExecutedBatch(log)
} }
@@ -973,8 +992,7 @@ fn interactive(m: &mut Market, mut out: Option<File>) {
if let Some(ref mut f)=out { if let Some(ref mut f)=out {
let ser=cmd.serialize(); let ser=cmd.serialize();
if let Err(e)=writeln!(f,"{}",ser) { eprintln!("An error occurred while writing {}",e); } if let Err(e)=writeln!(f,"{}",ser) { eprintln!("An error occurred while writing {}",e); }
else { println!("Wrote to logfile: {}",ser); } } else { println!("{}",cmd.serialize()); }
}
let res=m.execute(&cmd); let res=m.execute(&cmd);
println!("Result: {}",res.describe()); println!("Result: {}",res.describe());
Command::None Command::None