Update bot workflow

This commit is contained in:
2025-03-02 18:24:50 +01:00
parent 3e44b2d14e
commit e59898bccb
13 changed files with 198 additions and 112 deletions

View File

@@ -166,49 +166,63 @@ public class PositionManagerWorker : BaseWorker<PositionManagerWorker>
{
var positions = GetPositions(PositionStatus.New);
_logger.LogInformation("New positions count : {0} ", positions.Count());
_logger.LogInformation("Processing {NewPositionCount} new positions", positions.Count());
foreach (var position in positions)
{
_logger.LogInformation("Managing position: {0} - Date: {1} - Direction: {2} - Ticker: {3}",
position.Identifier, position.Date, position.OriginDirection, position.Ticker);
position.Status = PositionStatus.Updating;
_tradingService.UpdatePosition(position);
// Update status if position is open since to long
if (position.Date < DateTime.UtcNow.AddDays(-2))
using (_logger.BeginScope("Position {SignalIdentifier}", position.SignalIdentifier))
{
position.Status = PositionStatus.Canceled;
_tradingService.UpdatePosition(position);
_logger.LogInformation($"|_ Position is now Canceled");
continue;
try
{
// Immediate status update for concurrency protection
_logger.LogDebug("[{SignalIdentifier}] Acquiring position lock via status update", position.SignalIdentifier);
position.Status = PositionStatus.Updating;
_tradingService.UpdatePosition(position);
var account = await GetAccount(position.AccountName);
var trade = await _exchangeService.GetTrade(account.Key, position.Open.ExchangeOrderId, position.Ticker);
var openTrade = position.Open;
if (trade.Status == TradeStatus.PendingOpen || trade.Status == TradeStatus.Requested)
{
// Position staleness check
if (position.Date < DateTime.UtcNow.AddDays(-1))
{
position.Status = PositionStatus.Canceled;
_tradingService.UpdatePosition(position);
_logger.LogWarning("[{SignalIdentifier}] Position canceled - stale since {PositionAge} days",
position.SignalIdentifier,
(DateTime.UtcNow - position.Date).TotalDays);
}
else
{
// Reset status for retry
position.Status = PositionStatus.New;
_tradingService.UpdatePosition(position);
_logger.LogInformation("[{SignalIdentifier}] Awaiting order fill - {Ticker} (0/{ExpectedQuantity})",
position.SignalIdentifier,
position.Ticker, openTrade.Quantity);
}
}
else
{
position.Status = PositionStatus.PartiallyFilled;
position.Open = openTrade;
// Position is now open, now waiting to open SLTP
_tradingService.UpdatePosition(position);
_logger.LogInformation("[{SignalIdentifier}] Position now open ",
position.SignalIdentifier);
}
}
catch (Exception ex)
{
_logger.LogError(ex, "Error processing position {SignalIdentifier}", position.SignalIdentifier);
// Consider resetting to New status for retry if needed
position.Status = PositionStatus.New;
_tradingService.UpdatePosition(position);
}
}
var account = await GetAccount(position.AccountName);
var currentOpenOrders = await _exchangeService.GetOpenOrders(account, position.Ticker);
// if (currentOpenOrders.Any())
// {
// position.Status = PositionStatus.Canceled;
// _tradingService.UpdatePosition(position);
// _logger.LogInformation($"|_ Position is now Canceled - Position close from exchange");
// continue;
// }
var quantityInPosition = await _exchangeService.GetQuantityInPosition(account, position.Ticker);
if (quantityInPosition <= 0)
{
position.Status = PositionStatus.New;
_logger.LogInformation("|_ Position is currently waiting for filling");
}
else
{
position.Open.SetStatus(TradeStatus.Filled);
position.Status = PositionStatus.PartiallyFilled;
_logger.LogInformation($"|_ Position is now PartiallyFilled");
}
_tradingService.UpdatePosition(position);
}
}