private void DoArbitrage(Observation observation, ArbitrageInfo info) { var volume = Math.Min(observation.PerVolume, observation.AvailabeVolume); volume = Math.Min(volume, info.SpreadVolume); var orderBuyId = Guid.NewGuid(); var orderSellId = Guid.NewGuid(); var buyRequest = new OrderRequest() { ClientOrderId = orderBuyId.ToString(), CurrencyPair = observation.CurrencyPair, OrderType = OrderType.Market, Price = 0m, TradeType = TradeType.Buy, Volume = volume, }; var sellRequest = new OrderRequest() { ClientOrderId = orderSellId.ToString(), CurrencyPair = observation.CurrencyPair, OrderType = OrderType.Market, Price = 0m, TradeType = TradeType.Sell, Volume = volume, }; var buyResult = _exchangeTradeService.MakeANewOrder(observation.FromExchangeName, buyRequest); var sellResult = _exchangeTradeService.MakeANewOrder(observation.ToExchangeName, sellRequest); if (!buyResult.IsSuccessful) { var message = $"Make a buy failed {buyResult.Message} {observation.GetName()}"; _messageService.Error(observation.Id, observation.Name, message); observation.RunningStatus = RunningStatus.Error; _logger.LogError(message); } if (!sellResult.IsSuccessful) { var message = $"Make a sell order failed {sellResult.Message} {observation.GetName()}"; _messageService.Error(observation.Id, observation.Name, message); observation.RunningStatus = RunningStatus.Error; _logger.LogError(message); } if (buyResult.IsSuccessful ^ sellResult.IsSuccessful) { var message = $"only one order is executed!!!! buy {buyResult.IsSuccessful} sell {sellResult.IsSuccessful} {observation.GetName()}"; _messageService.Error(observation.Id, observation.Name, message); _logger.LogCritical(message); } if (buyResult.IsSuccessful && sellResult.IsSuccessful) { _observationService.SubtractAvailabeVolume(observation.Id, volume); var arbitrage = new Arbitrage { DateCreated = DateTime.UtcNow, Id = Guid.NewGuid(), ObservationId = observation.Id, ObservationName = observation.Name, Volume = volume, Spread = info.SpreadValue }; _arbitrageService.Add(arbitrage); var buyOrder = new Order { ArbitrageId = arbitrage.Id, ObservationId = arbitrage.ObservationId, ObservationName = arbitrage.ObservationName, DateCreated = DateTime.UtcNow, ExchangeName = observation.FromExchangeName, Id = Guid.NewGuid(), OrderStatus = buyResult.Data.Status, Price = info.FromPrice, RemoteId = buyResult.Data.Id, CurrencyPair = observation.CurrencyPair, TradeType = TradeType.Buy, Volume = volume, }; var sellOrder = new Order { ArbitrageId = arbitrage.Id, ObservationId = arbitrage.ObservationId, ObservationName = arbitrage.ObservationName, DateCreated = DateTime.UtcNow, ExchangeName = observation.ToExchangeName, Id = Guid.NewGuid(), OrderStatus = buyResult.Data.Status, Price = info.ToPrice, RemoteId = buyResult.Data.Id, CurrencyPair = observation.CurrencyPair, TradeType = TradeType.Sell, Volume = volume }; _orderService.Add(buyOrder, sellOrder); _messageService.Write(observation.Id, observation.Name, $"{observation.Name} do a arbitrage spreadValue:{info.SpreadValue:f2} volume:{volume:f5} {DateTime.UtcNow}"); } }