Update bot workflow
This commit is contained in:
@@ -41,5 +41,8 @@
|
||||
<Content Update="appsettings.Prod.json">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Update="appsettings.ProdLocal.json">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</Content>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
|
||||
@@ -107,16 +107,16 @@ builder.Services.AddSwaggerGen(options =>
|
||||
});
|
||||
|
||||
builder.WebHost.SetupDiscordBot();
|
||||
builder.Services.AddHostedService<FeeWorker>();
|
||||
// builder.Services.AddHostedService<FeeWorker>();
|
||||
// builder.Services.AddHostedService<PositionManagerWorker>();
|
||||
// builder.Services.AddHostedService<PositionFetcher>();
|
||||
// builder.Services.AddHostedService<PricesFiveMinutesWorker>();
|
||||
builder.Services.AddHostedService<PricesFifteenMinutesWorker>();
|
||||
builder.Services.AddHostedService<PricesOneHourWorker>();
|
||||
// builder.Services.AddHostedService<PricesFourHoursWorker>();
|
||||
builder.Services.AddHostedService<PricesFourHoursWorker>();
|
||||
builder.Services.AddHostedService<PricesOneDayWorker>();
|
||||
builder.Services.AddHostedService<SpotlightWorker>();
|
||||
builder.Services.AddHostedService<TraderWatcher>();
|
||||
// builder.Services.AddHostedService<SpotlightWorker>();
|
||||
// builder.Services.AddHostedService<TraderWatcher>();
|
||||
builder.Services.AddHostedService<LeaderboardWorker>();
|
||||
builder.Services.AddHostedService<FundingRatesWatcher>();
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
24
src/Managing.Api.Workers/appsettings.ProdLocal.json
Normal file
24
src/Managing.Api.Workers/appsettings.ProdLocal.json
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"ManagingDatabase": {
|
||||
"ConnectionString": "mongodb://admin:r8oJiDIKbsEi@mongo-db.apps.managing.live:27017/?authMechanism=SCRAM-SHA-256",
|
||||
"DatabaseName": "ManagingDb"
|
||||
},
|
||||
"InfluxDb": {
|
||||
"Url": "https://influx-db.apps.managing.live",
|
||||
"Organization": "managing-org",
|
||||
"Token": "eOuXcXhH7CS13Iw4CTiDDpRjIjQtEVPOloD82pLPOejI4n0BsEj1YzUw0g3Cs1mdDG5m-RaxCavCMsVTtS5wIQ=="
|
||||
},
|
||||
"Serilog": {
|
||||
"MinimumLevel": {
|
||||
"Default": "Information",
|
||||
"Override": {
|
||||
"Microsoft": "Information",
|
||||
"System": "Warning"
|
||||
}
|
||||
}
|
||||
},
|
||||
"ElasticConfiguration": {
|
||||
"Uri": "http://elasticsearch:9200"
|
||||
},
|
||||
"AllowedHosts": "*"
|
||||
}
|
||||
Reference in New Issue
Block a user