コード例 #1
0
        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);
        }
    }