@page "/assets" @using TradingBot.Models @using TradingBot.Services @inject TradingBotService BotService @implements IDisposable @rendermode InteractiveServer Asset - TradingBot
Totale Asset @totalAssets
Asset Attivi @activeAssets
Strategie Assegnate @assignedStrategies
Valore Totale $@totalValue.ToString("N0")
@if (viewMode == "grid") {
@foreach (var config in GetFilteredAssets()) { var price = BotService.GetLatestPrice(config.Symbol); var stats = BotService.AssetStatistics.TryGetValue(config.Symbol, out var s) ? s : null;
@config.Symbol.Substring(0, 1)

@config.Name

@config.Symbol
@if (price != null) {
$@price.Price.ToString("N2")
@Math.Abs(price.Change24h).ToString("F2")% (24h)
}
Holdings @config.CurrentHoldings.ToString("F6")
Valore $@((config.CurrentBalance + config.CurrentHoldings * (price?.Price ?? 0)).ToString("N2"))
Profitto $@config.TotalProfit.ToString("N2")
Trades @(stats?.TotalTrades ?? 0)
}
} else {
Asset
Prezzo
Var. 24h
Holdings
Valore
Profitto
Strategia
Stato
Azioni
@foreach (var config in GetFilteredAssets()) { var price = BotService.GetLatestPrice(config.Symbol); var stats = BotService.AssetStatistics.TryGetValue(config.Symbol, out var s) ? s : null;
@config.Symbol.Substring(0, 1)
@config.Name
@config.Symbol
@if (price != null) { $@price.Price.ToString("N2") } else { - }
@if (price != null) { @(price.Change24h >= 0 ? "+" : "")@price.Change24h.ToString("F2")% } else { - }
@config.CurrentHoldings.ToString("F6")
$@((config.CurrentBalance + config.CurrentHoldings * (price?.Price ?? 0)).ToString("N2"))
$@config.TotalProfit.ToString("N2")
}
}
@code { private string viewMode = "grid"; private string filterStatus = "all"; private int totalAssets = 0; private int activeAssets = 0; private int assignedStrategies = 0; private decimal totalValue = 0; protected override void OnInitialized() { BotService.OnStatusChanged += HandleUpdate; BotService.OnTradeExecuted += HandleTradeExecuted; BotService.OnPriceUpdated += HandlePriceUpdate; RefreshData(); } private void RefreshData() { totalAssets = BotService.AssetConfigurations.Count; activeAssets = BotService.AssetConfigurations.Values.Count(c => c.IsEnabled); assignedStrategies = BotService.AssetConfigurations.Values.Count(c => !string.IsNullOrEmpty(c.StrategyName)); totalValue = BotService.AssetConfigurations.Values.Sum(c => { var price = BotService.GetLatestPrice(c.Symbol); return c.CurrentBalance + (c.CurrentHoldings * (price?.Price ?? 0)); }); StateHasChanged(); } private IEnumerable GetFilteredAssets() { var assets = BotService.AssetConfigurations.Values.OrderBy(c => c.Symbol); return filterStatus switch { "active" => assets.Where(c => c.IsEnabled), "inactive" => assets.Where(c => !c.IsEnabled), _ => assets }; } private void ToggleAsset(string symbol, bool enabled) { BotService.ToggleAsset(symbol, enabled); RefreshData(); } private void AssignStrategy(string symbol, string strategyName) { if (BotService.AssetConfigurations.TryGetValue(symbol, out var config)) { config.StrategyName = strategyName; RefreshData(); } } private void OpenAssetDetails(string symbol) { // TODO: Open modal or navigate to asset detail page } private void ViewChart(string symbol) { var navManager = Navigation; navManager?.NavigateTo($"/market?symbol={symbol}"); } private void HandleUpdate() => InvokeAsync(RefreshData); private void HandleTradeExecuted(Trade trade) => InvokeAsync(RefreshData); private void HandlePriceUpdate(string symbol, MarketPrice price) => InvokeAsync(RefreshData); [Inject] private NavigationManager? Navigation { get; set; } public void Dispose() { BotService.OnStatusChanged -= HandleUpdate; BotService.OnTradeExecuted -= HandleTradeExecuted; BotService.OnPriceUpdated -= HandlePriceUpdate; } }