/// <summary> /// </summary> /// <param name="dto"></param> /// <param name="game"></param> /// <param name="user"></param> /// <returns></returns> public Order CreateOrder(OpenOrderInfo dto, Game game, string user) { if (dto == null) { throw new ArgumentNullException(nameof(dto)); } if (game == null) { throw new ArgumentNullException(nameof(game)); } if (user == null) { throw new ArgumentNullException(nameof(user)); } _logger.LogDebug("创建订单"); try { ValidateOpenOrderRule(dto, game, user); _notify.OnCreating(dto); var openPrice = GetOpenPrice(dto, game, user); var order = CreateOrder(dto, user); order.Open(openPrice, game); _orderContext.UncloseOrders.Add(order); _orderStore.Add(order); _notify.OnCreated(order); return(order); } catch (Exception ex) { throw new OrderCreatingException("建仓失败", ex); } }
/// <summary> /// </summary> /// <param name="openOrderInfo"></param> /// <param name="game"></param> /// <param name="user"></param> /// <returns></returns> private Quotation GetOpenPrice(OpenOrderInfo openOrderInfo, Game game, string user) { if (game == null) { throw new ArgumentNullException(nameof(game)); } var openPricePolicies = _pricePolicyStore.GetOpenPricePolicies(user); Quotation openPrice; foreach (var policy in openPricePolicies) { if (policy.TryGetPrice(_qutationContext, openOrderInfo, game, out openPrice)) { return(openPrice); } } if (DefaultOpenOpenPricePolicy.TryGetPrice(_qutationContext, openOrderInfo, game, out openPrice)) { return(openPrice); } throw new OrderException("暂时无报价,请联系管理员."); }
/// <summary> /// </summary> /// <param name="dto"></param> /// <param name="game"></param> /// <param name="user"></param> private void ValidateOpenOrderRule(OpenOrderInfo dto, Game game, string user) { var openOrderPolicies = _orderPolicyStore.GetOpenOrderPolicies(user); foreach (var policy in openOrderPolicies) { if (!policy.IsPass(dto, game, user, _orderContext)) { throw new OrderCreatingException(policy.Message); } } }
/// <summary> /// </summary> /// <param name="dto"></param> /// <param name="user"></param> /// <param name="game"></param> /// <returns></returns> private Order CreateOrder(OpenOrderInfo dto, string user) { if (dto == null) { throw new ArgumentNullException(nameof(dto)); } if (user == null) { throw new ArgumentNullException(nameof(user)); } var order = new Order(dto.Volume, dto.Direction, user) { Id = _orderIdGenerator.Next() }; order.OpenInfo.ClientPostTime = dto.ClientPostTime; return(order); }