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); }
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)); } } }
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); } }
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); }