private async Task BackgroundProcessing(CancellationToken stoppingToken) { foreach (var exchange in ProjectOrbit.Exchanges) { var subscriptionManager = new SubscriptionManager(_factory, _factory.CreateLogger <SubscriptionManager>(), exchange); await subscriptionManager.StartAsync(stoppingToken); var clientManager = new ClientManager(_factory, _factory.CreateLogger <ClientManager>(), exchange); await clientManager.StartAsync(stoppingToken); var calculator = new TriangleCalculator(_factory.CreateLogger <TriangleCalculator>(), exchange); await calculator.StartAsync(stoppingToken); var queueMonitor = new QueueMonitor(_factory, _factory.CreateLogger <QueueMonitor>(), exchange); await queueMonitor.StartAsync(stoppingToken); var subscriber = new OrderbookSubscriber(_factory, _factory.CreateLogger <OrderbookSubscriber>(), exchange); await subscriber.StartAsync(stoppingToken); var statsMonitor = new StatisticsMonitor(_factory.CreateLogger <StatisticsMonitor>(), exchange); await statsMonitor.StartAsync(stoppingToken); var activityMonitor = new ActivityMonitor(_factory, _factory.CreateLogger <ActivityMonitor>(), exchange); await activityMonitor.StartAsync(stoppingToken); //_logger.LogInformation($"there are {exchange.TradedMarkets.Count} markets traded on {exchange.ExchangeName}. Of these markets, {exchange.TriarbEligibleMarkets.Count} markets interact to form {exchange.UniqueTriangleCount} triangular arbitrage opportunities"); } }
private async Task BackgroundProcessing(CancellationToken stoppingToken) { while (!stoppingToken.IsCancellationRequested) { if (Exchange.TrianglesToRecalculate.Count > Exchange.SubscribedMarkets.Count && CalculatorCount < MaxTriangleCalculators)//start a new calculator if the queue is >75% its theoretical maximum { //TODO: implement average queue size metric to decrement TriangleCalculators. CalculatorCount++; var newCalc = new TriangleCalculator(_factory.CreateLogger <TriangleCalculator>(), CalculatorCount, Exchange); await newCalc.StartAsync(stoppingToken); } await Task.Delay(5000); } }