public async Task <OpenOrderBackendResponse> PlaceOrder([FromBody] OpenOrderBackendRequest request) { var code = await _identityGenerator.GenerateIdAsync(nameof(Order)); var order = new Order { Id = Guid.NewGuid().ToString("N"), Code = code, CreateDate = DateTime.UtcNow, ClientId = request.ClientId, AccountId = request.Order.AccountId, Instrument = request.Order.Instrument, Volume = request.Order.Volume, ExpectedOpenPrice = request.Order.ExpectedOpenPrice, TakeProfit = request.Order.TakeProfit, StopLoss = request.Order.StopLoss }; var placedOrder = await _tradingEngine.PlaceOrderAsync(order); var result = BackendContractFactory.CreateOpenOrderBackendResponse(placedOrder); _consoleWriter.WriteLine($"action order.place for clientId = {request.ClientId}"); _operationsLogService.AddLog("action order.place", request.ClientId, request.Order.AccountId, request.ToJson(), result.ToJson()); return(result); }
public async Task <string> PlaceAsync([FromBody] OrderPlaceRequest request) { var(baseOrder, relatedOrders) = (default(Order), default(List <Order>)); try { (baseOrder, relatedOrders) = await _validateOrderService.ValidateRequestAndCreateOrders(request); } catch (ValidateOrderException exception) { _cqrsSender.PublishEvent(new OrderPlacementRejectedEvent { EventTimestamp = _dateService.Now(), OrderPlaceRequest = request, RejectReason = exception.RejectReason.ToType <OrderRejectReasonContract>(), RejectReasonText = exception.Message, }); throw; } var placedOrder = await _tradingEngine.PlaceOrderAsync(baseOrder); _operationsLogService.AddLog("action order.place", request.AccountId, request.ToJson(), placedOrder.ToJson()); if (placedOrder.Status == OrderStatus.Rejected) { var message = $"Order {placedOrder.Id} from account {placedOrder.AccountId} for instrument {placedOrder.AssetPairId} is rejected: {placedOrder.RejectReason} ({placedOrder.RejectReasonText}). Comment: {placedOrder.Comment}."; throw new ValidateOrderException(placedOrder.RejectReason, placedOrder.RejectReasonText, message); } foreach (var order in relatedOrders) { var placedRelatedOrder = await _tradingEngine.PlaceOrderAsync(order); _operationsLogService.AddLog("action related.order.place", request.AccountId, request.ToJson(), placedRelatedOrder.ToJson()); } return(placedOrder.Id); }