예제 #1
0
        public Task CancelAsync(string orderId, [FromBody] OrderCancelRequest request = null, string accountId = null)
        {
            if (!_ordersCache.TryGetOrderById(orderId, out var order))
            {
                throw new InvalidOperationException("Order not found");
            }

            ValidationHelper.ValidateAccountId(order, accountId);

            var reason = request?.Originator == OriginatorTypeContract.System
                ? OrderCancellationReason.CorporateAction
                : OrderCancellationReason.None;

            var canceledOrder = _tradingEngine.CancelPendingOrder(order.Id, request?.AdditionalInfo,
                                                                  request?.Comment, reason);

            _operationsLogService.AddLog("action order.cancel", order.AccountId, request?.ToJson(),
                                         canceledOrder.ToJson());

            return(Task.CompletedTask);
        }
예제 #2
0
        private void ChangeRelatedOrderVolume(List <RelatedOrderInfo> relatedOrderInfos, decimal newVolume)
        {
            foreach (var relatedOrderInfo in relatedOrderInfos)
            {
                if (_ordersCache.TryGetOrderById(relatedOrderInfo.Id, out var relatedOrder) &&
                    relatedOrder.Volume != newVolume)
                {
                    var oldVolume = relatedOrder.Volume;

                    relatedOrder.ChangeVolume(newVolume, _dateService.Now(), OriginatorType.System);
                    var metadata = new OrderChangedMetadata
                    {
                        UpdatedProperty = OrderChangedProperty.Volume,
                        OldValue        = oldVolume.ToString("F2")
                    };

                    _orderChangedEventChannel.SendEvent(this, new OrderChangedEventArgs(relatedOrder, metadata));
                }
            }
        }
예제 #3
0
        private void RemoveRelatedOrderFromParent(Order order)
        {
            if (!string.IsNullOrEmpty(order.ParentOrderId) &&
                _ordersCache.TryGetOrderById(order.ParentOrderId, out var parentOrder))
            {
                var metadata = new OrderChangedMetadata
                {
                    UpdatedProperty = OrderChangedProperty.RelatedOrderRemoved,
                    OldValue        = order.Id
                };

                parentOrder.RemoveRelatedOrder(order.Id);
                _orderChangedEventChannel.SendEvent(this, new OrderChangedEventArgs(parentOrder, metadata));
            }

            if (!string.IsNullOrEmpty(order.ParentPositionId) &&
                _ordersCache.Positions.TryGetPositionById(order.ParentPositionId, out var parentPosition))
            {
                parentPosition.RemoveRelatedOrder(order.Id);
            }
        }
예제 #4
0
        public MtBackendResponse <bool> ChangeOrderLimits([FromBody] ChangeOrderLimitsBackendRequest request)
        {
            if (!_ordersCache.TryGetOrderById(request.OrderId, out var order))
            {
                return(new MtBackendResponse <bool> {
                    Message = "Order not found"
                });
            }

            if (_assetDayOffService.IsDayOff(order.Instrument))
            {
                return(new MtBackendResponse <bool> {
                    Message = "Trades for instrument are not available"
                });
            }

            try
            {
                _tradingEngine.ChangeOrderLimits(request.OrderId, request.StopLoss, request.TakeProfit,
                                                 request.ExpectedOpenPrice);
            }
            catch (ValidateOrderException ex)
            {
                return(new MtBackendResponse <bool> {
                    Result = false, Message = ex.Message
                });
            }

            var result = new MtBackendResponse <bool> {
                Result = true
            };

            _consoleWriter.WriteLine($"action order.changeLimits for clientId = {request.ClientId}, orderId = {request.OrderId}");
            _operationsLogService.AddLog("action order.changeLimits", request.ClientId, order.AccountId, request.ToJson(), result.ToJson());

            return(result);
        }