diff --git a/csharp/TraderBot/TradingService.cs b/csharp/TraderBot/TradingService.cs index 0302809b..c22adadf 100644 --- a/csharp/TraderBot/TradingService.cs +++ b/csharp/TraderBot/TradingService.cs @@ -826,8 +826,17 @@ private async Task PlaceSellOrder(long amount, decimal price) // { // throw new InvalidOperationException($"Not enough amount to sell {amount} assets. Available amount: {securityPosition.Balance}"); // } - var response = await InvestApi.Orders.PostOrderAsync(sellOrderRequest).ResponseAsync; + using var call = InvestApi.Orders.PostOrderAsync(sellOrderRequest); + var headers = await call.ResponseHeadersAsync; + var response = await call.ResponseAsync; + + var trackingId = headers.GetValue("x-tracking-id"); Logger.LogInformation($"Sell order placed: {response}"); + if (!string.IsNullOrEmpty(trackingId)) + { + Logger.LogInformation($"Tinkoff request tracking ID: {trackingId}"); + } + return response; } @@ -847,21 +856,39 @@ private async Task PlaceBuyOrder(long amount, decimal price) // { // throw new InvalidOperationException($"Not enough money to buy {CurrentInstrument.Figi} asset."); // } - var response = await InvestApi.Orders.PostOrderAsync(buyOrderRequest).ResponseAsync; + using var call = InvestApi.Orders.PostOrderAsync(buyOrderRequest); + var headers = await call.ResponseHeadersAsync; + var response = await call.ResponseAsync; + + var trackingId = headers.GetValue("x-tracking-id"); var total = amount * price; SetCashBalance(CashBalanceFree - total, CashBalanceLocked + total); Logger.LogInformation($"Buy order placed: {response}"); + if (!string.IsNullOrEmpty(trackingId)) + { + Logger.LogInformation($"Tinkoff request tracking ID: {trackingId}"); + } + return response; } private async Task CancelOrder(string orderId) { - var response = await InvestApi.Orders.CancelOrderAsync(new CancelOrderRequest + using var call = InvestApi.Orders.CancelOrderAsync(new CancelOrderRequest { AccountId = CurrentAccount.Id, OrderId = orderId, }); + var headers = await call.ResponseHeadersAsync; + var response = await call.ResponseAsync; + + var trackingId = headers.GetValue("x-tracking-id"); Logger.LogInformation($"Order cancelled: {response}"); + if (!string.IsNullOrEmpty(trackingId)) + { + Logger.LogInformation($"Tinkoff request tracking ID: {trackingId}"); + } + return response; } diff --git a/examples/TrackingIdExample.cs b/examples/TrackingIdExample.cs new file mode 100644 index 00000000..a07285cc --- /dev/null +++ b/examples/TrackingIdExample.cs @@ -0,0 +1,45 @@ +using System; +using Grpc.Core; +using Microsoft.Extensions.Logging; + +namespace TraderBot.Examples +{ + /// + /// This example demonstrates how the tracking ID logging would work + /// when the Tinkoff API returns the x-tracking-id header + /// + public class TrackingIdExample + { + private readonly ILogger _logger; + + public TrackingIdExample(ILogger logger) + { + _logger = logger; + } + + /// + /// Example of how tracking ID is extracted and logged + /// This simulates what happens in the actual PlaceBuyOrder/PlaceSellOrder/CancelOrder methods + /// + public void SimulateTrackingIdLogging() + { + // Simulate a response with x-tracking-id header + var metadata = new Metadata + { + { "x-tracking-id", "550e8400-e29b-41d4-a716-446655440000" } + }; + + // Extract tracking ID (as done in the actual implementation) + var trackingId = metadata.GetValue("x-tracking-id"); + + // Log the tracking ID (as done in the actual implementation) + _logger.LogInformation($"Buy order placed: [order response details]"); + if (!string.IsNullOrEmpty(trackingId)) + { + _logger.LogInformation($"Tinkoff request tracking ID: {trackingId}"); + } + + Console.WriteLine($"Tracking ID logged: {trackingId}"); + } + } +} \ No newline at end of file