Update bot workflow
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user