/// <summary> /// Submits a new request to cancel this order /// </summary> public OrderResponse Cancel(string tag = null) { var request = new CancelOrderRequest(_transactionManager.UtcTime, OrderId, tag); lock (_cancelRequestLock) { // don't submit duplicate cancel requests if (_cancelRequest != null) { return(OrderResponse.Error(request, OrderResponseErrorCode.RequestCanceled, $"Order {OrderId} has already received a cancellation request.")); } } _transactionManager.ProcessRequest(request); lock (_cancelRequestLock) { if (_cancelRequest != null) { return(_cancelRequest.Response); } } throw new ArgumentException("CancelRequest is null."); }
/// <summary> /// Submits a new request to cancel this order /// </summary> public OrderResponse Cancel(string tag = null) { var request = new CancelOrderRequest(_transactionManager.UtcTime, OrderId, tag); _transactionManager.ProcessRequest(request); return(CancelRequest.Response); }
/// <summary> /// Sets the <see cref="CancelOrderRequest"/> for this ticket. This can only be performed once. /// </summary> /// <param name="request">The <see cref="CancelOrderRequest"/> that canceled this ticket.</param> public void SetCancelRequest(CancelOrderRequest request) { if (request.OrderId != OrderId) { throw new ArgumentException("Received CancelOrderRequest for incorrect order id."); } if (_cancelRequest != null) { throw new ArgumentException("This order ticket has already been canceled."); } _cancelRequest = request; }
/// <summary> /// Sets the <see cref="CancelOrderRequest"/> for this ticket. This can only be performed once. /// </summary> /// <remarks> /// This method is thread safe. /// </remarks> /// <param name="request">The <see cref="CancelOrderRequest"/> that canceled this ticket.</param> /// <returns>False if the the CancelRequest has already been set, true if this call set it</returns> internal bool TrySetCancelRequest(CancelOrderRequest request) { if (request.OrderId != OrderId) { throw new ArgumentException("Received CancelOrderRequest for incorrect order id."); } lock (_setCancelRequestLock) { if (_cancelRequest != null) { return(false); } _cancelRequest = request; } return(true); }
/// <summary> /// Submits a new request to cancel this order /// </summary> public OrderResponse Cancel(string tag = null) { var request = new CancelOrderRequest(_transactionManager.UtcTime, OrderId, tag); _transactionManager.ProcessRequest(request); lock (_cancelRequestLock) { if (_cancelRequest != null) { return(_cancelRequest.Response); } } throw new ArgumentException("CancelRequest is null."); }
/// <summary> /// Handles a request to cancel an order /// </summary> private OrderResponse HandleCancelOrderRequest(CancelOrderRequest request) { Order order; OrderTicket ticket; if (!_orders.TryGetValue(request.OrderId, out order) || !_orderTickets.TryGetValue(request.OrderId, out ticket)) { Log.Error("BrokerageTransactionHandler.HandleCancelOrderRequest(): Unable to cancel order with ID " + request.OrderId + "."); return OrderResponse.UnableToFindOrder(request); } if (order.Status.IsClosed()) { return OrderResponse.InvalidStatus(request, order); } ticket.SetOrder(order); bool orderCanceled; try { orderCanceled = _brokerage.CancelOrder(order); } catch (Exception err) { Log.Error(err); orderCanceled = false; } if (!orderCanceled) { // failed to cancel the order var message = "Brokerage failed to cancel order with id " + order.Id; _algorithm.Error(message); HandleOrderEvent(new OrderEvent(order, _algorithm.UtcTime, 0m, "Brokerage failed to cancel order")); return OrderResponse.Error(request, OrderResponseErrorCode.BrokerageFailedToCancelOrder, message); } // we succeeded to cancel the order order.Status = OrderStatus.Canceled; if (request.Tag != null) { // update the tag, useful for 'why' we canceled the order order.Tag = request.Tag; } return OrderResponse.Success(request); }
/// <summary> /// Remove this order from outstanding queue: user is requesting a cancel. /// </summary> /// <param name="request">Request containing the specific order id to remove</param> public OrderTicket CancelOrder(CancelOrderRequest request) { OrderTicket ticket; if (!_orderTickets.TryGetValue(request.OrderId, out ticket)) { Log.Error("BrokerageTransactionHandler.CancelOrder(): Unable to locate ticket for order."); return OrderTicket.InvalidCancelOrderId(_algorithm.Transactions, request); } try { // if we couldn't set this request as the cancellation then another thread/someone // else is already doing it or it in fact has already been cancelled if (!ticket.TrySetCancelRequest(request)) { // the ticket has already been cancelled request.SetResponse(OrderResponse.Error(request, OrderResponseErrorCode.InvalidRequest, "Cancellation is already in progress.")); return ticket; } //Error check var order = GetOrderByIdInternal(request.OrderId); if (order != null && request.Tag != null) { order.Tag = request.Tag; } if (order == null) { Log.Error("BrokerageTransactionHandler.CancelOrder(): Cannot find this id."); request.SetResponse(OrderResponse.UnableToFindOrder(request)); } else if (order.Status.IsClosed()) { Log.Error("BrokerageTransactionHandler.CancelOrder(): Order already " + order.Status); request.SetResponse(OrderResponse.InvalidStatus(request, order)); } else if (_algorithm.IsWarmingUp) { request.SetResponse(OrderResponse.WarmingUp(request)); } else { // send the request to be processed request.SetResponse(OrderResponse.Success(request), OrderRequestStatus.Processing); _orderRequestQueue.Add(request); } } catch (Exception err) { Log.Error(err); request.SetResponse(OrderResponse.Error(request, OrderResponseErrorCode.ProcessingError, err.Message)); } return ticket; }
/// <summary> /// Handles a request to cancel an order /// </summary> private OrderResponse HandleCancelOrderRequest(CancelOrderRequest request) { Order order; OrderTicket ticket; if (!_orders.TryGetValue(request.OrderId, out order) || !_orderTickets.TryGetValue(request.OrderId, out ticket)) { Log.Error("BrokerageTransactionHandler.HandleCancelOrderRequest(): Unable to cancel order with ID " + request.OrderId + "."); return OrderResponse.UnableToFindOrder(request); } if (order.Status.IsClosed()) { return OrderResponse.InvalidStatus(request, order); } ticket.SetOrder(order); bool orderCanceled; try { orderCanceled = _brokerage.CancelOrder(order); } catch (Exception err) { Log.Error(err); orderCanceled = false; } if (!orderCanceled) { // we failed to cancel the order for some reason order.Status = OrderStatus.Invalid; } else { // we succeeded to cancel the order order.Status = OrderStatus.Canceled; } if (request.Tag != null) { // update the tag, useful for 'why' we canceled the order order.Tag = request.Tag; } return OrderResponse.Success(request); }
/// <summary> /// Creates a new <see cref="OrderTicket"/> that represents trying to cancel an order for which no ticket exists /// </summary> public static OrderTicket InvalidCancelOrderId(SecurityTransactionManager transactionManager, CancelOrderRequest request) { var submit = new SubmitOrderRequest(OrderType.Market, SecurityType.Base, Symbol.Empty, 0, 0, 0, DateTime.MaxValue, request.Tag); submit.SetResponse(OrderResponse.UnableToFindOrder(request)); submit.SetOrderId(request.OrderId); var ticket = new OrderTicket(transactionManager, submit); request.SetResponse(OrderResponse.UnableToFindOrder(request)); ticket.TrySetCancelRequest(request); ticket._orderStatusOverride = OrderStatus.Invalid; return(ticket); }
/// <summary> /// Remove this order from outstanding queue: user is requesting a cancel. /// </summary> /// <param name="request">Request containing the specific order id to remove</param> public OrderTicket CancelOrder(CancelOrderRequest request) { OrderTicket ticket; if (!_orderTickets.TryGetValue(request.OrderId, out ticket)) { Log.Error("BrokerageTransactionHandler.CancelOrder(): Unable to locate ticket for order."); return OrderTicket.InvalidCancelOrderId(_algorithm.Transactions, request); } ticket.SetCancelRequest(request); try { //Error check var order = GetOrderById(request.OrderId); if (order == null) { Log.Error("BrokerageTransactionHandler.CancelOrder(): Cannot find this id."); request.SetResponse(OrderResponse.UnableToFindOrder(request)); } else if (order.Status.IsClosed()) { Log.Error("BrokerageTransactionHandler.CancelOrder(): Order already filled"); request.SetResponse(OrderResponse.InvalidStatus(request, order)); } else { // send the request to be processed request.SetResponse(OrderResponse.Success(request), OrderRequestStatus.Processing); _orderRequestQueue.Enqueue(request); } } catch (Exception err) { Log.Error("TransactionManager.RemoveOrder(): " + err.Message); request.SetResponse(OrderResponse.Error(request, OrderResponseErrorCode.ProcessingError, err.Message)); } return ticket; }