public async Task <TradingPosition> ProcessTradingPositionChanging(TradingPosition currentState, TradingPosition nextState, bool syncWithStock, Action <PositionChangedEventArgs> onPositionChangedCallback) { nextState.OpenPositionOrder = await _ordersService.CreateBuyLimitOrder(nextState.OpenPositionOrder); nextState.ClosePositionOrder.ParentClientId = nextState.OpenPositionOrder.ClientId; nextState.StopLossOrder.ParentClientId = nextState.OpenPositionOrder.ClientId; _orderRepository.Insert(nextState.OpenPositionOrder.ToEntity()); _orderRepository.Insert(nextState.ClosePositionOrder.ToEntity()); _orderRepository.Insert(nextState.StopLossOrder.ToEntity()); var storedOrderPair = _orderRepository.GetAll() .ToList() .GroupOrders() .SingleOrDefault(orderPair => orderPair.Item1.ClientId == nextState.OpenPositionOrder.ClientId); if (storedOrderPair == null) { throw new BusinessException("Order was not found in storage") { Details = $"Open position order: {JsonConvert.SerializeObject(nextState.OpenPositionOrder)}" } } ; nextState.OpenPositionOrder.Id = storedOrderPair.Item1.Id; nextState.ClosePositionOrder.Id = storedOrderPair.Item2.Id; nextState.StopLossOrder.Id = storedOrderPair.Item3.Id; _loggingService.LogAction(nextState.OpenPositionOrder.ToLogAction(OrderActionType.Create)); onPositionChangedCallback?.Invoke(new PositionChangedEventArgs(TradingEventType.NewPosition, nextState)); return(nextState); } }