@page "/trading"
@using TradingBot.Models
@using TradingBot.Services
@inject TradingBotService BotService
@implements IDisposable
@rendermode InteractiveServer
Trading - TradingBot
@foreach (var config in BotService.AssetConfigurations.Values.OrderBy(c => c.Symbol))
{
var stats = BotService.AssetStatistics.TryGetValue(config.Symbol, out var s) ? s : null;
var latestPrice = BotService.GetLatestPrice(config.Symbol);
@if (latestPrice != null)
{
$@latestPrice.Price.ToString("N2")
@Math.Abs(latestPrice.Change24h).ToString("F2")%
}
else
{
}
Strategia Applicata
@config.StrategyName
Holdings
@config.CurrentHoldings.ToString("F4")
Valore
$@((config.CurrentBalance + config.CurrentHoldings * (latestPrice?.Price ?? 0)).ToString("N2"))
Profitto
$@config.TotalProfit.ToString("N2")
Trades
@(stats?.TotalTrades ?? 0)
OpenAssetConfig(config.Symbol)">
Configura
ViewChart(config.Symbol)">
Grafico
}
@if (BotService.Trades.Count == 0)
{
Nessuna operazione ancora
Avvia il trading per iniziare a eseguire operazioni
}
else
{
@foreach (var trade in BotService.Trades.Take(20))
{
@trade.Symbol
@(trade.Type == TradeType.Buy ? "BUY" : "SELL")
@trade.Amount.ToString("F6")
$@trade.Price.ToString("N2")
$@((trade.Amount * trade.Price).ToString("N2"))
@if (trade.IsBot)
{
@trade.Strategy
}
else
{
Manuale
}
@trade.Timestamp.ToLocalTime().ToString("dd/MM HH:mm:ss")
}
}
@code {
protected override void OnInitialized()
{
BotService.OnStatusChanged += HandleUpdate;
BotService.OnTradeExecuted += HandleTradeExecuted;
BotService.OnPriceUpdated += HandlePriceUpdate;
if (!BotService.Status.IsRunning)
{
BotService.Start();
}
}
private void ToggleBot()
{
if (BotService.Status.IsRunning)
BotService.Stop();
else
BotService.Start();
}
private void ToggleAsset(string symbol, bool enabled)
{
BotService.ToggleAsset(symbol, enabled);
}
private void OpenAssetConfig(string symbol)
{
// TODO: Open asset configuration modal
}
private void ViewChart(string symbol)
{
// TODO: Navigate to market analysis with selected symbol
}
private void HandleUpdate() => InvokeAsync(StateHasChanged);
private void HandleTradeExecuted(Trade trade) => InvokeAsync(StateHasChanged);
private void HandlePriceUpdate(string symbol, MarketPrice price) => InvokeAsync(StateHasChanged);
public void Dispose()
{
BotService.OnStatusChanged -= HandleUpdate;
BotService.OnTradeExecuted -= HandleTradeExecuted;
BotService.OnPriceUpdated -= HandlePriceUpdate;
}
}