Add event

This commit is contained in:
2025-08-15 01:23:39 +07:00
parent 2622da05e6
commit e6c3ec139a
8 changed files with 169 additions and 44 deletions

View File

@@ -1,4 +1,5 @@
using Managing.Application.Abstractions;
using Managing.Application.Abstractions.Grains;
using Managing.Application.Abstractions.Services;
using Managing.Application.Trading.Commands;
using Managing.Domain.Shared.Helpers;
@@ -12,6 +13,7 @@ public class ClosePositionCommandHandler(
IExchangeService exchangeService,
IAccountService accountService,
ITradingService tradingService,
IGrainFactory? grainFactory = null,
ILogger<ClosePositionCommandHandler> logger = null)
: ICommandHandler<ClosePositionCommand, Position>
{
@@ -68,6 +70,30 @@ public class ClosePositionCommandHandler(
if (!request.IsForBacktest)
await tradingService.UpdatePositionAsync(request.Position);
// Notify platform summary about the closed position
try
{
var platformGrain = grainFactory?.GetGrain<IPlatformSummaryGrain>("platform-summary");
if (platformGrain != null)
{
var positionClosedEvent = new PositionClosedEvent
{
PositionId = request.Position.Identifier,
Ticker = request.Position.Ticker,
RealizedPnL = request.Position.ProfitAndLoss?.Realized ?? 0,
Volume = closedPosition.Quantity * lastPrice * request.Position.Open.Leverage,
InitialVolume = request.Position.Open.Quantity * request.Position.Open.Price * request.Position.Open.Leverage
};
await platformGrain.OnPositionClosedAsync(positionClosedEvent);
}
}
catch (Exception ex)
{
SentrySdk.CaptureException(ex);
logger?.LogError(ex, "Failed to notify platform summary about position closure for position {PositionId}", request.Position.Identifier);
}
}
return request.Position;
@@ -77,6 +103,7 @@ public class ClosePositionCommandHandler(
logger?.LogError(ex, "Error closing position: {Message} \n Stacktrace : {StackTrace}", ex.Message,
ex.StackTrace);
SentrySdk.CaptureException(ex);
throw;
}
}

View File

@@ -1,4 +1,5 @@
using Managing.Application.Abstractions;
using Managing.Application.Abstractions.Grains;
using Managing.Application.Abstractions.Services;
using Managing.Application.Trading.Commands;
using Managing.Common;
@@ -11,20 +12,14 @@ namespace Managing.Application.Trading.Handlers
public class OpenPositionCommandHandler(
IExchangeService exchangeService,
IAccountService accountService,
ITradingService tradingService)
ITradingService tradingService,
IGrainFactory? grainFactory = null)
: ICommandHandler<OpenPositionRequest, Position>
{
public async Task<Position> Handle(OpenPositionRequest request)
{
var account = await accountService.GetAccount(request.AccountName, hideSecrets: false, getBalance: false);
if (!request.IsForPaperTrading)
{
// var cancelOrderResult = await exchangeService.CancelOrder(account, request.Ticker);
// if (!cancelOrderResult)
// {
// throw new Exception($"Not able to close all orders for {request.Ticker}");
// }
}
var initiator = request.IsForPaperTrading ? PositionInitiator.PaperTrading : request.Initiator;
var position = new Position(Guid.NewGuid(), request.AccountName, request.Direction,
@@ -108,6 +103,29 @@ namespace Managing.Application.Trading.Handlers
if (!request.IsForPaperTrading)
{
await tradingService.InsertPositionAsync(position);
// Notify platform summary about the opened position
try
{
var platformGrain = grainFactory?.GetGrain<IPlatformSummaryGrain>("platform-summary");
if (platformGrain != null)
{
var positionOpenedEvent = new PositionOpenedEvent
{
PositionId = position.Identifier,
Ticker = position.Ticker,
Volume = position.Open.Price * position.Open.Quantity * position.Open.Leverage,
Direction = position.OriginDirection
};
await platformGrain.OnPositionOpenedAsync(positionOpenedEvent);
}
}
catch (Exception)
{
// Log error but don't fail the position creation
// This is a non-critical notification
}
}
return position;