Fix volume when position not open
This commit is contained in:
@@ -368,6 +368,16 @@ public class TradingBotBase : ITradingBot
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
// Skip processing if position is already canceled or rejected (never filled)
|
||||||
|
if (positionForSignal.Status == PositionStatus.Canceled ||
|
||||||
|
positionForSignal.Status == PositionStatus.Rejected)
|
||||||
|
{
|
||||||
|
Logger.LogDebug(
|
||||||
|
"Skipping update for position {PositionId} - status is {Status} (never filled)",
|
||||||
|
positionForSignal.Identifier, positionForSignal.Status);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
Position internalPosition = null;
|
Position internalPosition = null;
|
||||||
List<Position> brokerPositions = null;
|
List<Position> brokerPositions = null;
|
||||||
await ServiceScopeHelpers.WithScopedService<ITradingService>(_scopeFactory, async tradingService =>
|
await ServiceScopeHelpers.WithScopedService<ITradingService>(_scopeFactory, async tradingService =>
|
||||||
@@ -566,8 +576,12 @@ public class TradingBotBase : ITradingBot
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
await LogWarning(
|
await LogWarning(
|
||||||
$"❌ **Position Closed**\nNo position on exchange and no orders\nSignal: `{signal.Identifier}`\nPosition have been closed.");
|
$"❌ **Position Never Filled**\nNo position on exchange and no orders\nSignal: `{signal.Identifier}`\nPosition was never filled and will be marked as canceled.");
|
||||||
await HandleClosedPosition(positionForSignal);
|
|
||||||
|
// Position was never filled (still in New status), so just mark it as canceled
|
||||||
|
// Don't call HandleClosedPosition as that would incorrectly add volume/PnL
|
||||||
|
await SetPositionStatus(signal.Identifier, PositionStatus.Canceled);
|
||||||
|
SetSignalStatus(signal.Identifier, SignalStatus.Expired);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (internalPosition.Status == PositionStatus.Finished ||
|
else if (internalPosition.Status == PositionStatus.Finished ||
|
||||||
@@ -1395,12 +1409,28 @@ public class TradingBotBase : ITradingBot
|
|||||||
{
|
{
|
||||||
position.Status = PositionStatus.Finished;
|
position.Status = PositionStatus.Finished;
|
||||||
await UpdatePositionDatabase(position);
|
await UpdatePositionDatabase(position);
|
||||||
|
|
||||||
|
// Only send PositionClosed notification if the position was actually filled
|
||||||
|
// Check if Open trade was filled (means position was opened on the broker)
|
||||||
|
if (position.Open?.Status == TradeStatus.Filled)
|
||||||
|
{
|
||||||
await NotifyAgentAndPlatformGrainAsync(NotificationEventType.PositionClosed, position);
|
await NotifyAgentAndPlatformGrainAsync(NotificationEventType.PositionClosed, position);
|
||||||
}
|
|
||||||
|
|
||||||
// Update the last position closing time for cooldown period tracking
|
// Update the last position closing time for cooldown period tracking
|
||||||
|
// Only update if position was actually filled
|
||||||
LastPositionClosingTime = Config.IsForBacktest ? currentCandle.Date : DateTime.UtcNow;
|
LastPositionClosingTime = Config.IsForBacktest ? currentCandle.Date : DateTime.UtcNow;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Logger.LogDebug(
|
||||||
|
"Skipping PositionClosed notification for position {PositionId} - position was never filled (Open trade status: {OpenStatus})",
|
||||||
|
position.Identifier, position.Open?.Status);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Only update balance and log success if position was actually filled
|
||||||
|
if (position.Open?.Status == TradeStatus.Filled)
|
||||||
|
{
|
||||||
Logger.LogInformation(
|
Logger.LogInformation(
|
||||||
$"✅ **Position Closed Successfully**\nPosition: `{position.SignalIdentifier}`\nPnL: `${position.ProfitAndLoss?.Realized:F2}`");
|
$"✅ **Position Closed Successfully**\nPosition: `{position.SignalIdentifier}`\nPnL: `${position.ProfitAndLoss?.Realized:F2}`");
|
||||||
|
|
||||||
@@ -1414,6 +1444,12 @@ public class TradingBotBase : ITradingBot
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
Logger.LogInformation(
|
||||||
|
$"✅ **Position Cleanup**\nPosition: `{position.SignalIdentifier}` was never filled - no balance or PnL changes");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
await LogWarning("Weird things happen - Trying to update position status, but no position found");
|
await LogWarning("Weird things happen - Trying to update position status, but no position found");
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user