From b4f6dc871b02c746581fcf26df50b2a0953f6aea Mon Sep 17 00:00:00 2001 From: cryptooda Date: Fri, 15 Aug 2025 21:27:07 +0700 Subject: [PATCH] Add volume history to platform summary --- .../Extensions/PlatformSummaryExtensions.cs | 3 ++- .../Models/Responses/AgentSummaryViewModel.cs | 2 ++ .../Grains/IPlatformSummaryGrain.cs | 5 ++++ .../Grains/PlatformSummaryGrainState.cs | 2 ++ .../Models/PlatformSummaryViewModel.cs | 25 +++++++++++++++++ .../Grains/PlatformSummaryGrain.cs | 27 +++++++++++++++++++ .../src/generated/ManagingApi.ts | 2 ++ .../src/generated/ManagingApiTypes.ts | 2 ++ 8 files changed, 67 insertions(+), 1 deletion(-) diff --git a/src/Managing.Api/Extensions/PlatformSummaryExtensions.cs b/src/Managing.Api/Extensions/PlatformSummaryExtensions.cs index dfc85f8..2bb719e 100644 --- a/src/Managing.Api/Extensions/PlatformSummaryExtensions.cs +++ b/src/Managing.Api/Extensions/PlatformSummaryExtensions.cs @@ -35,7 +35,8 @@ public static class PlatformSummaryExtensions kvp => kvp.Key, kvp => kvp.Value) ?? new Dictionary(), LastUpdated = abstractionsModel.LastUpdated, - Last24HourSnapshot = abstractionsModel.Last24HourSnapshot + Last24HourSnapshot = abstractionsModel.Last24HourSnapshot, + VolumeHistory = abstractionsModel.VolumeHistory, }; } } \ No newline at end of file diff --git a/src/Managing.Api/Models/Responses/AgentSummaryViewModel.cs b/src/Managing.Api/Models/Responses/AgentSummaryViewModel.cs index 72dba06..b8d4ee3 100644 --- a/src/Managing.Api/Models/Responses/AgentSummaryViewModel.cs +++ b/src/Managing.Api/Models/Responses/AgentSummaryViewModel.cs @@ -1,3 +1,4 @@ +using Managing.Application.Abstractions.Models; using Managing.Common; namespace Managing.Api.Models.Responses @@ -146,6 +147,7 @@ namespace Managing.Api.Models.Responses /// When the last 24-hour snapshot was taken /// public required DateTime Last24HourSnapshot { get; set; } + public List VolumeHistory { get; internal set; } } /// diff --git a/src/Managing.Application.Abstractions/Grains/IPlatformSummaryGrain.cs b/src/Managing.Application.Abstractions/Grains/IPlatformSummaryGrain.cs index 5369966..e3455df 100644 --- a/src/Managing.Application.Abstractions/Grains/IPlatformSummaryGrain.cs +++ b/src/Managing.Application.Abstractions/Grains/IPlatformSummaryGrain.cs @@ -39,6 +39,11 @@ public interface IPlatformSummaryGrain : IGrainWithStringKey /// Task GetTotalPositionCountAsync(); + /// + /// Gets the daily volume history for the last 30 days for chart visualization + /// + Task> GetVolumeHistoryAsync(); + // Event handlers for immediate updates /// /// Updates the active strategy count diff --git a/src/Managing.Application.Abstractions/Grains/PlatformSummaryGrainState.cs b/src/Managing.Application.Abstractions/Grains/PlatformSummaryGrainState.cs index b80cfd5..6a80a29 100644 --- a/src/Managing.Application.Abstractions/Grains/PlatformSummaryGrainState.cs +++ b/src/Managing.Application.Abstractions/Grains/PlatformSummaryGrainState.cs @@ -130,3 +130,5 @@ public class DailySnapshot [Id(6)] public int TotalPositionCount { get; set; } } + + diff --git a/src/Managing.Application.Abstractions/Models/PlatformSummaryViewModel.cs b/src/Managing.Application.Abstractions/Models/PlatformSummaryViewModel.cs index bdfdef7..ec1d472 100644 --- a/src/Managing.Application.Abstractions/Models/PlatformSummaryViewModel.cs +++ b/src/Managing.Application.Abstractions/Models/PlatformSummaryViewModel.cs @@ -119,4 +119,29 @@ public class PlatformSummaryViewModel /// [Id(17)] public required DateTime Last24HourSnapshot { get; set; } + + /// + /// Daily volume history for the last 30 days for chart visualization + /// + [Id(18)] + public required List VolumeHistory { get; set; } +} + +/// +/// Represents a volume data point for historical charting +/// +[GenerateSerializer] +public class VolumeHistoryPoint +{ + /// + /// Date of the volume measurement + /// + [Id(0)] + public required DateTime Date { get; set; } + + /// + /// Total volume for that date in USD + /// + [Id(1)] + public required decimal Volume { get; set; } } diff --git a/src/Managing.Application/Grains/PlatformSummaryGrain.cs b/src/Managing.Application/Grains/PlatformSummaryGrain.cs index 527e081..10dc602 100644 --- a/src/Managing.Application/Grains/PlatformSummaryGrain.cs +++ b/src/Managing.Application/Grains/PlatformSummaryGrain.cs @@ -229,6 +229,20 @@ public class PlatformSummaryGrain : Grain, IPlatformSummaryGrain, IRemindable return Task.FromResult(_state.State.TotalPositionCount); } + public Task> GetVolumeHistoryAsync() + { + var historyPoints = _state.State.DailySnapshots + .OrderBy(s => s.Date) + .Select(s => new VolumeHistoryPoint + { + Date = s.Date, + Volume = s.TotalVolume + }) + .ToList(); + + return Task.FromResult(historyPoints); + } + // Event handlers for immediate updates public async Task UpdateActiveStrategyCountAsync(int newActiveCount) { @@ -374,6 +388,16 @@ public class PlatformSummaryGrain : Grain, IPlatformSummaryGrain, IRemindable private PlatformSummaryViewModel MapToViewModel(PlatformSummaryGrainState state) { + // Generate volume history from daily snapshots + var volumeHistory = state.DailySnapshots + .OrderBy(s => s.Date) + .Select(s => new VolumeHistoryPoint + { + Date = s.Date, + Volume = s.TotalVolume + }) + .ToList(); + return new PlatformSummaryViewModel { TotalAgents = state.TotalAgents, @@ -397,6 +421,9 @@ public class PlatformSummaryGrain : Grain, IPlatformSummaryGrain, IRemindable PositionCountByAsset = state.PositionCountByAsset ?? new Dictionary(), PositionCountByDirection = state.PositionCountByDirection ?? new Dictionary(), + // Volume history for charting (last 30 days) + VolumeHistory = volumeHistory, + // Metadata LastUpdated = state.LastUpdated, Last24HourSnapshot = state.LastSnapshot diff --git a/src/Managing.WebApp/src/generated/ManagingApi.ts b/src/Managing.WebApp/src/generated/ManagingApi.ts index 870802e..8c029c1 100644 --- a/src/Managing.WebApp/src/generated/ManagingApi.ts +++ b/src/Managing.WebApp/src/generated/ManagingApi.ts @@ -4588,6 +4588,7 @@ export interface TopStrategiesViewModel { export interface StrategyPerformance { strategyName?: string | null; pnL?: number; + agentName?: string | null; } export interface TopStrategiesByRoiViewModel { @@ -4661,6 +4662,7 @@ export interface AgentSummaryViewModel { losses?: number; activeStrategiesCount?: number; totalVolume?: number; + totalBalance?: number; } export enum SortableFields { diff --git a/src/Managing.WebApp/src/generated/ManagingApiTypes.ts b/src/Managing.WebApp/src/generated/ManagingApiTypes.ts index 8b6d966..70232a4 100644 --- a/src/Managing.WebApp/src/generated/ManagingApiTypes.ts +++ b/src/Managing.WebApp/src/generated/ManagingApiTypes.ts @@ -943,6 +943,7 @@ export interface TopStrategiesViewModel { export interface StrategyPerformance { strategyName?: string | null; pnL?: number; + agentName?: string | null; } export interface TopStrategiesByRoiViewModel { @@ -1016,6 +1017,7 @@ export interface AgentSummaryViewModel { losses?: number; activeStrategiesCount?: number; totalVolume?: number; + totalBalance?: number; } export enum SortableFields {