Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 29 additions & 3 deletions csharp/TraderBot/TradingService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,8 @@ public TradingService(ILogger<TradingService> 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}");
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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))
{
Expand Down Expand Up @@ -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)
Expand Down
2 changes: 2 additions & 0 deletions csharp/TraderBot/TradingSettings.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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; }
}
4 changes: 3 additions & 1 deletion csharp/TraderBot/appsettings.TMON.json
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
}
4 changes: 3 additions & 1 deletion csharp/TraderBot/appsettings.TRUR.json
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
}
Loading