Add management fee callbacks
This commit is contained in:
@@ -311,6 +311,8 @@ pub struct PortfolioState {
|
||||
units: f64,
|
||||
cash: f64,
|
||||
cash_liabilities: f64,
|
||||
management_fee_rate: f64,
|
||||
management_fees: f64,
|
||||
positions: IndexMap<String, Position>,
|
||||
cash_receivables: Vec<CashReceivable>,
|
||||
pending_cash_flows: Vec<PendingCashFlow>,
|
||||
@@ -341,6 +343,8 @@ impl PortfolioState {
|
||||
units: initial_cash,
|
||||
cash: initial_cash,
|
||||
cash_liabilities: 0.0,
|
||||
management_fee_rate: 0.0,
|
||||
management_fees: 0.0,
|
||||
positions: IndexMap::new(),
|
||||
cash_receivables: Vec::new(),
|
||||
pending_cash_flows: Vec::new(),
|
||||
@@ -367,6 +371,14 @@ impl PortfolioState {
|
||||
self.cash_liabilities
|
||||
}
|
||||
|
||||
pub fn management_fee_rate(&self) -> f64 {
|
||||
self.management_fee_rate
|
||||
}
|
||||
|
||||
pub fn management_fees(&self) -> f64 {
|
||||
self.management_fees
|
||||
}
|
||||
|
||||
pub fn positions(&self) -> &IndexMap<String, Position> {
|
||||
&self.positions
|
||||
}
|
||||
@@ -484,6 +496,27 @@ impl PortfolioState {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn set_management_fee_rate(&mut self, rate: f64) -> Result<(), String> {
|
||||
if !rate.is_finite() || rate < 0.0 {
|
||||
return Err("management fee rate must be finite and non-negative".to_string());
|
||||
}
|
||||
self.management_fee_rate = rate;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn default_management_fee(&self) -> f64 {
|
||||
self.total_equity().max(0.0) * self.management_fee_rate
|
||||
}
|
||||
|
||||
pub fn apply_management_fee(&mut self, fee: f64) -> Result<(), String> {
|
||||
if !fee.is_finite() || fee < 0.0 {
|
||||
return Err("management fee must be finite and non-negative".to_string());
|
||||
}
|
||||
self.cash -= fee;
|
||||
self.management_fees += fee;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn settle_cash_receivables(&mut self, date: NaiveDate) -> Vec<CashReceivable> {
|
||||
let mut settled = Vec::new();
|
||||
let mut pending = Vec::new();
|
||||
|
||||
Reference in New Issue
Block a user