Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -96,6 +96,26 @@ def simulate_tp_strategy_full(starting_balance, trades_min, trades_max, weeks,
|
|
| 96 |
}
|
| 97 |
|
| 98 |
return pd.DataFrame(log), summary
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 99 |
|
| 100 |
|
| 101 |
# UI
|
|
|
|
| 96 |
}
|
| 97 |
|
| 98 |
return pd.DataFrame(log), summary
|
| 99 |
+
def analytics_dashboard():
|
| 100 |
+
leaderboard = []
|
| 101 |
+
for name, config in strategy_presets.items():
|
| 102 |
+
df, summary = simulate_tp_strategy_full(**config, risk_reward_ratio=2)
|
| 103 |
+
returns = df['End Balance'].pct_change().dropna()
|
| 104 |
+
volatility = returns.std() * np.sqrt(52)
|
| 105 |
+
sharpe = returns.mean() / returns.std() * np.sqrt(52) if returns.std() > 0 else 0
|
| 106 |
+
peak = df['End Balance'].cummax()
|
| 107 |
+
dd = (peak - df['End Balance']) / peak
|
| 108 |
+
max_dd = dd.max() * 100 if not dd.empty else 0
|
| 109 |
+
final = df['End Balance'].iloc[-1] if not df.empty else config['starting_balance']
|
| 110 |
+
score = final / (1 + max_dd)
|
| 111 |
+
leaderboard.append({
|
| 112 |
+
"Strategy": name,
|
| 113 |
+
"Final Balance": round(final, 2),
|
| 114 |
+
"Max DD %": round(max_dd, 2),
|
| 115 |
+
"Sharpe": round(sharpe, 2),
|
| 116 |
+
"EdgeCast Score": round(score, 2)
|
| 117 |
+
})
|
| 118 |
+
return pd.DataFrame(leaderboard).sort_values("EdgeCast Score", ascending=False).reset_index(drop=True)
|
| 119 |
|
| 120 |
|
| 121 |
# UI
|