diff --git a/csharp/TraderBot/TradingService.cs b/csharp/TraderBot/TradingService.cs index 0302809b..7042de61 100644 --- a/csharp/TraderBot/TradingService.cs +++ b/csharp/TraderBot/TradingService.cs @@ -63,6 +63,8 @@ public TradingService(ILogger logger, InvestApiClient investApi, Logger.LogInformation($"EarlySellOwnedLotsDelta: {settings.EarlySellOwnedLotsDelta}"); Logger.LogInformation($"EarlySellOwnedLotsMultiplier: {settings.EarlySellOwnedLotsMultiplier}"); Logger.LogInformation($"LoadOperationsFrom: {settings.LoadOperationsFrom}"); + Logger.LogInformation($"MaxSpreadPercentToBuy: {settings.MaxSpreadPercentToBuy}"); + Logger.LogInformation($"MinimumCombinedLiquidityToBuy: {settings.MinimumCombinedLiquidityToBuy}"); var currentTime = DateTime.UtcNow.TimeOfDay; Logger.LogInformation($"Current time: {currentTime}"); @@ -468,7 +470,7 @@ await marketDataStream.RequestStream.WriteAsync(new MarketDataRequest } if (!areOrdersPlaced) { - if (IsTimeToBuy()) + if (IsTimeToBuy() && IsMarketConditionsSuitableForBuying(bestBid, bestAsk, orderBook)) { // Process potential buy order var (cashBalance, _) = await GetCashBalance(); @@ -516,7 +518,7 @@ await marketDataStream.RequestStream.WriteAsync(new MarketDataRequest else if (ActiveBuyOrders.Count == 1) { var activeBuyOrder = ActiveBuyOrders.Single().Value; - if (IsTimeToBuy()) + if (IsTimeToBuy() && IsMarketConditionsSuitableForBuying(bestBid, bestAsk, orderBook)) { var initialOrderPrice = MoneyValueToDecimal(activeBuyOrder.InitialSecurityPrice); if (LotsSets.TryGetValue(initialOrderPrice, out var boughtLots) || LotsSets.Count == 0) @@ -569,7 +571,7 @@ await marketDataStream.RequestStream.WriteAsync(new MarketDataRequest } else { - Logger.LogInformation($"It is not time to buy, cancelling buy order"); + Logger.LogInformation($"Conditions not suitable for buying, cancelling buy order"); // Cancel order if (!await TryCancelOrder(activeBuyOrder.OrderId)) { @@ -652,6 +654,30 @@ private bool IsTimeToBuy() { var currentTime = DateTime.UtcNow.TimeOfDay; return currentTime > MinimumTimeToBuy && currentTime < MaximumTimeToBuy; + } + + private bool IsMarketConditionsSuitableForBuying(decimal bestBid, decimal bestAsk, OrderBook orderBook) + { + // Check if spread is not too wide + var spread = bestAsk - bestBid; + var spreadPercent = (spread / bestBid) * 100; + if (spreadPercent > Settings.MaxSpreadPercentToBuy) + { + Logger.LogInformation($"Spread too wide for buying: {spreadPercent:F2}% (max allowed: {Settings.MaxSpreadPercentToBuy}%)"); + return false; + } + + // Check combined liquidity at best bid and ask + var bestBidOrder = orderBook.Bids.FirstOrDefault(); + var bestAskOrder = orderBook.Asks.FirstOrDefault(); + var combinedLiquidity = (bestBidOrder?.Quantity ?? 0) + (bestAskOrder?.Quantity ?? 0); + if (combinedLiquidity < Settings.MinimumCombinedLiquidityToBuy) + { + Logger.LogInformation($"Insufficient liquidity for buying: {combinedLiquidity} (minimum required: {Settings.MinimumCombinedLiquidityToBuy})"); + return false; + } + + return true; } private async Task<(decimal, decimal)> GetCashBalance(bool forceRemote = false) diff --git a/csharp/TraderBot/TradingSettings.cs b/csharp/TraderBot/TradingSettings.cs index 884a25df..cc520e4d 100644 --- a/csharp/TraderBot/TradingSettings.cs +++ b/csharp/TraderBot/TradingSettings.cs @@ -17,4 +17,6 @@ public class TradingSettings public long EarlySellOwnedLotsDelta { get; set; } public decimal EarlySellOwnedLotsMultiplier { get; set; } public DateTime LoadOperationsFrom { get; set; } + public decimal MaxSpreadPercentToBuy { get; set; } + public long MinimumCombinedLiquidityToBuy { get; set; } } \ No newline at end of file diff --git a/csharp/TraderBot/appsettings.TMON.json b/csharp/TraderBot/appsettings.TMON.json index c7b66d7a..06bddedc 100644 --- a/csharp/TraderBot/appsettings.TMON.json +++ b/csharp/TraderBot/appsettings.TMON.json @@ -24,6 +24,8 @@ "MaximumTimeToBuy": "23:59:59", "EarlySellOwnedLotsDelta": 300000, "EarlySellOwnedLotsMultiplier": 0, - "LoadOperationsFrom": "2025-03-01T00:00:01.3389860Z" + "LoadOperationsFrom": "2025-03-01T00:00:01.3389860Z", + "MaxSpreadPercentToBuy": 1.0, + "MinimumCombinedLiquidityToBuy": 1000000 } } diff --git a/csharp/TraderBot/appsettings.TRUR.json b/csharp/TraderBot/appsettings.TRUR.json index 1dc848e6..9fdc4760 100644 --- a/csharp/TraderBot/appsettings.TRUR.json +++ b/csharp/TraderBot/appsettings.TRUR.json @@ -24,6 +24,8 @@ "MaximumTimeToBuy": "14:45:00", "EarlySellOwnedLotsDelta": 300000, "EarlySellOwnedLotsMultiplier": 0, - "LoadOperationsFrom": "2025-03-01T00:00:01.3389860Z" + "LoadOperationsFrom": "2025-03-01T00:00:01.3389860Z", + "MaxSpreadPercentToBuy": 1.0, + "MinimumCombinedLiquidityToBuy": 1000000 } }