Add event
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user