mirror of
https://github.com/KhizarImran/backtestingfx.git
synced 2026-08-09 10:17:52 +00:00
new: better stats
This commit is contained in:
+28
-3
@@ -11,11 +11,32 @@ use crate::broker::Broker;
|
||||
pub best_trade: f64,
|
||||
pub worst_trade: f64,
|
||||
pub profit_factor: f64,
|
||||
pub max_drawdown_pct: f64
|
||||
|
||||
}
|
||||
|
||||
fn max_drawdown(equity_curve: &[f64]) -> f64 {
|
||||
let mut peak = f64::NEG_INFINITY;
|
||||
let mut max_dd = 0.0f64;
|
||||
|
||||
for &equity in equity_curve {
|
||||
if equity > peak {
|
||||
peak = equity;
|
||||
}
|
||||
if peak > 0.0 {
|
||||
let dd = (peak - equity) / peak * 100.0;
|
||||
if dd > max_dd {
|
||||
max_dd = dd;
|
||||
}
|
||||
}
|
||||
}
|
||||
max_dd
|
||||
}
|
||||
|
||||
impl Stats {
|
||||
pub fn compute(broker: &Broker, initial_cash: f64) -> Self {
|
||||
pub fn compute(broker: &Broker, equity_curve: &[f64]) -> Self {
|
||||
let num_trades = broker.trade_history.len();
|
||||
let initial_cash = broker.initial_cash;
|
||||
let final_cash = broker.cash;
|
||||
let total_return_pct = (final_cash - initial_cash) / initial_cash * 100.0;
|
||||
|
||||
@@ -39,6 +60,7 @@ use crate::broker::Broker;
|
||||
.filter(|t| t.pnl < 0.0).map(|t| t.pnl.abs()).sum();
|
||||
let profit_factor = if gross_loss > 0.0 { gross_profit / gross_loss } else {
|
||||
f64::INFINITY };
|
||||
let max_drawdown_pct = max_drawdown(equity_curve);
|
||||
|
||||
Stats {
|
||||
initial_cash,
|
||||
@@ -51,6 +73,7 @@ use crate::broker::Broker;
|
||||
best_trade: if num_trades > 0 { best_trade } else { 0.0 },
|
||||
worst_trade: if num_trades > 0 { worst_trade } else { 0.0 },
|
||||
profit_factor,
|
||||
max_drawdown_pct
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -67,10 +90,12 @@ use crate::broker::Broker;
|
||||
Avg PnL: {:.5}\n\
|
||||
Best Trade: {:.5}\n\
|
||||
Worst Trade: {:.5}\n\
|
||||
Profit Factor: {:.2}",
|
||||
Profit Factor: {:.2}\n\
|
||||
Max Drawdown: {:.2}%",
|
||||
self.initial_cash, self.final_cash, self.total_return_pct,
|
||||
self.num_trades, self.win_rate_pct, self.avg_pnl,
|
||||
self.best_trade, self.worst_trade, self.profit_factor
|
||||
self.best_trade, self.worst_trade, self.profit_factor,
|
||||
self.max_drawdown_pct
|
||||
)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user