Ejemplo n.º 1
0
        public ActionResult Cancel(int id)
        {
            var result = _ordersService.CancelOrder(id);

            if (result == ChangeOrderStatusResult.InvalidStatus)
            {
                return(View("InvalidStatus"));
            }

            if (result == ChangeOrderStatusResult.NotFound)
            {
                return(HttpNotFound());
            }

            return(RedirectToAction("Index"));
        }
Ejemplo n.º 2
0
        public ActionResult Cancel(int id)
        {
            var    cc      = DateTime.Now - ordersService.GetOrderById(id).Created;
            string Message = "";

            if (cc.Minutes <= 10)
            {
                ordersService.CancelOrder(id);
                Message = "That order has been canceled sir :)";
            }
            else
            {
                Message = "You cannot cancel orders older than 10 minutes.";
            }

            return(Content(Message));
        }
Ejemplo n.º 3
0
        public async Task <TradingPosition> ProcessTradingPositionChanging(TradingPosition currentState,
                                                                           TradingPosition nextState,
                                                                           bool syncWithStock,
                                                                           Action <PositionChangedEventArgs> onPositionChangedCallback)
        {
            if (syncWithStock)
            {
                try
                {
                    nextState.StopLossOrder = await _ordersService.CancelOrder(currentState.StopLossOrder);
                }
                catch (ConnectorException e)
                {
                    if (e.Message?.Contains("Order not found") ?? false)
                    {
                        var activeOrders = await _ordersService.GetActiveOrders(currentState.StopLossOrder.CurrencyPair);

                        var serverSideStopLossOrder = activeOrders.FirstOrDefault(order => order.ClientId == currentState.StopLossOrder.ClientId) ??
                                                      await _ordersService.GetOrderFromHistory(currentState.StopLossOrder.ClientId, currentState.StopLossOrder.CurrencyPair);

                        if (serverSideStopLossOrder != null)
                        {
                            if (serverSideStopLossOrder.OrderStateType == OrderStateType.Filled)
                            {
                                nextState.StopLossOrder.SyncWithAnotherOrder(serverSideStopLossOrder);
                                var nextProcessor = new StopLossOrderFillingProcessor(_orderRepository, _ordersService, _loggingService);
                                return(await nextProcessor.ProcessTradingPositionChanging(currentState, nextState, true, onPositionChangedCallback));
                            }

                            if (serverSideStopLossOrder.OrderStateType == OrderStateType.Cancelled || serverSideStopLossOrder.OrderStateType == OrderStateType.Expired)
                            {
                                nextState.StopLossOrder.SyncWithAnotherOrder(serverSideStopLossOrder);
                            }
                            else
                            {
                                throw;
                            }
                        }
                        else
                        {
                            throw;
                        }
                    }
                    else
                    {
                        throw;
                    }
                }
            }

            nextState.StopLossOrder.OrderStateType = OrderStateType.Cancelled;

            if (currentState.ClosePositionOrder.OrderStateType != OrderStateType.Filled)
            {
                if (!(currentState.ClosePositionOrder.OrderStateType == OrderStateType.Pending ||
                      currentState.ClosePositionOrder.OrderStateType == OrderStateType.Cancelled ||
                      currentState.ClosePositionOrder.OrderStateType == OrderStateType.Expired))
                {
                    try
                    {
                        await _ordersService.CancelOrder(currentState.ClosePositionOrder);
                    }
                    catch
                    {
                        // ignored
                    }
                    finally
                    {
                        nextState.ClosePositionOrder.OrderStateType = OrderStateType.Cancelled;
                    }
                }

                var immediateCloseOrder = new Order
                {
                    ClientId       = Guid.NewGuid(),
                    CurrencyPair   = currentState.ClosePositionOrder.CurrencyPair,
                    Role           = OrderRoleType.ClosePosition,
                    OrderSide      = currentState.ClosePositionOrder.OrderSide,
                    OrderType      = OrderType.Market,
                    OrderStateType = OrderStateType.New,
                    TimeInForce    = OrderTimeInForceType.GoodTillCancelled
                };

                var serverSideOrder = await _ordersService.CreateSellMarketOrder(immediateCloseOrder);

                if (serverSideOrder.OrderStateType != OrderStateType.Filled)
                {
                    throw new BusinessException("Unexpected order state found")
                          {
                              Details = $"Close position market order: {JsonConvert.SerializeObject(serverSideOrder)}"
                          }
                }
                ;
            }

            var stopLossOrderEntity = _orderRepository.Get(nextState.StopLossOrder.Id);

            if (stopLossOrderEntity == null)
            {
                throw new BusinessException("Order was not found in storage")
                      {
                          Details = $"Stop loss order: {JsonConvert.SerializeObject(nextState.StopLossOrder)}"
                      }
            }
            ;
            _orderRepository.Update(nextState.StopLossOrder.ToEntity(stopLossOrderEntity));
            _loggingService.LogAction(nextState.ClosePositionOrder.ToLogAction(OrderActionType.Cancel));

            return(nextState);
        }
    }
}
Ejemplo n.º 4
0
        public async Task <TradingPosition> ProcessTradingPositionChanging(TradingPosition currentState,
                                                                           TradingPosition nextState,
                                                                           bool syncWithStock,
                                                                           Action <PositionChangedEventArgs> onPositionChangedCallback)
        {
            if (nextState.OpenPositionOrder.OrderStateType == OrderStateType.PartiallyFilled)
            {
                try
                {
                    await _ordersService.CancelOrder(currentState.OpenPositionOrder);
                }
                catch (ConnectorException e)
                {
                    if (e.Message?.Contains("Order not found") ?? false)
                    {
                        var activeOrders = await _ordersService.GetActiveOrders(currentState.OpenPositionOrder.CurrencyPair);

                        var serverSideOpenPositionOrder = activeOrders.FirstOrDefault(order => order.ClientId == currentState.OpenPositionOrder.ClientId) ??
                                                          await _ordersService.GetOrderFromHistory(currentState.OpenPositionOrder.ClientId, currentState.OpenPositionOrder.CurrencyPair);

                        if (serverSideOpenPositionOrder?.OrderStateType != OrderStateType.Filled)
                        {
                            throw;
                        }
                    }
                    else
                    {
                        throw;
                    }
                }

                nextState.OpenPositionOrder.OrderStateType = OrderStateType.Filled;
            }

            nextState.StopLossOrder.OrderStateType = OrderStateType.Suspended;
            nextState.StopLossOrder = await _ordersService.CreateSellMarketOrder(nextState.StopLossOrder);

            var openOrderEntity = _orderRepository.Get(nextState.OpenPositionOrder.Id);

            if (openOrderEntity == null)
            {
                throw new BusinessException("Order was not found in storage")
                      {
                          Details = $"Open position order: {JsonConvert.SerializeObject(nextState.OpenPositionOrder)}"
                      }
            }
            ;
            _orderRepository.Update(nextState.OpenPositionOrder.ToEntity(openOrderEntity));
            _loggingService.LogAction(nextState.OpenPositionOrder.ToLogAction(OrderActionType.Fill));

            var stopLossOrderEntity = _orderRepository.Get(nextState.StopLossOrder.Id);

            if (stopLossOrderEntity == null)
            {
                throw new BusinessException("Order was not found in storage")
                      {
                          Details = $"Stop loss order: {JsonConvert.SerializeObject(nextState.StopLossOrder)}"
                      }
            }
            ;
            _orderRepository.Update(nextState.StopLossOrder.ToEntity(stopLossOrderEntity));
            _loggingService.LogAction(nextState.StopLossOrder.ToLogAction(OrderActionType.Create));

            onPositionChangedCallback?.Invoke(new PositionChangedEventArgs(TradingEventType.PositionOpened, nextState));

            return(nextState);
        }
    }
}
        public async Task <TradingPosition> ProcessTradingPositionChanging(TradingPosition currentState,
                                                                           TradingPosition nextState,
                                                                           bool syncWithStock,
                                                                           Action <PositionChangedEventArgs> onPositionChangedCallback)
        {
            if (syncWithStock)
            {
                try
                {
                    nextState.OpenPositionOrder = await _ordersService.CancelOrder(currentState.OpenPositionOrder);
                }
                catch (ConnectorException e)
                {
                    if (e.Message?.Contains("Order not found") ?? false)
                    {
                        var activeOrders = await _ordersService.GetActiveOrders(currentState.OpenPositionOrder.CurrencyPair);

                        var serverSideOpenPositionOrder = activeOrders.FirstOrDefault(order => order.ClientId == currentState.OpenPositionOrder.ClientId) ??
                                                          await _ordersService.GetOrderFromHistory(currentState.OpenPositionOrder.ClientId, currentState.OpenPositionOrder.CurrencyPair);

                        if (serverSideOpenPositionOrder != null)
                        {
                            if (serverSideOpenPositionOrder.OrderStateType == OrderStateType.Filled)
                            {
                                nextState.OpenPositionOrder.SyncWithAnotherOrder(serverSideOpenPositionOrder);
                                var nextProcessor = new BuyOrderFillingProcessor(_orderRepository, _ordersService, _loggingService);
                                return(await nextProcessor.ProcessTradingPositionChanging(currentState, nextState, true, onPositionChangedCallback));
                            }

                            if (serverSideOpenPositionOrder.OrderStateType == OrderStateType.Cancelled || serverSideOpenPositionOrder.OrderStateType == OrderStateType.Expired)
                            {
                                nextState.OpenPositionOrder.SyncWithAnotherOrder(serverSideOpenPositionOrder);
                            }
                            else
                            {
                                throw;
                            }
                        }
                        else
                        {
                            throw;
                        }
                    }
                    else
                    {
                        throw;
                    }
                }
            }

            var openOrderEntity = _orderRepository.Get(nextState.OpenPositionOrder.Id);

            if (openOrderEntity == null)
            {
                throw new BusinessException("Order was not found in storage")
                      {
                          Details = $"Open position order: {JsonConvert.SerializeObject(nextState.OpenPositionOrder)}"
                      }
            }
            ;
            _orderRepository.Update(nextState.OpenPositionOrder.ToEntity(openOrderEntity));
            _loggingService.LogAction(nextState.OpenPositionOrder.ToLogAction(nextState.OpenPositionOrder.OrderStateType == OrderStateType.Cancelled ? OrderActionType.Cancel : OrderActionType.Update));

            if (nextState.OpenPositionOrder.OrderStateType == OrderStateType.Cancelled)
            {
                onPositionChangedCallback?.Invoke(new PositionChangedEventArgs(TradingEventType.PositionCancelled, nextState));
            }

            return(nextState);
        }
    }
Ejemplo n.º 6
0
        public async Task <TradingPosition> ProcessTradingPositionChanging(TradingPosition currentState,
                                                                           TradingPosition nextState,
                                                                           bool syncWithStock,
                                                                           Action <PositionChangedEventArgs> onPositionChangedCallback)
        {
            if (syncWithStock && currentState.ClosePositionOrder.OrderStateType != OrderStateType.Pending)
            {
                try
                {
                    await _ordersService.CancelOrder(currentState.ClosePositionOrder);
                }
                catch (ConnectorException e)
                {
                    if (e.Message?.Contains("Order not found") ?? false)
                    {
                        var activeOrders = await _ordersService.GetActiveOrders(currentState.ClosePositionOrder.CurrencyPair);

                        var serverSideClosePositionOrder = activeOrders.FirstOrDefault(order => order.ClientId == currentState.ClosePositionOrder.ClientId) ??
                                                           await _ordersService.GetOrderFromHistory(currentState.ClosePositionOrder.ClientId, currentState.ClosePositionOrder.CurrencyPair);

                        if (serverSideClosePositionOrder?.OrderStateType != OrderStateType.Filled)
                        {
                            throw;
                        }
                    }
                    else
                    {
                        throw;
                    }
                }
            }

            if (!(nextState.StopLossOrder.OrderStateType == OrderStateType.Pending ||
                  nextState.StopLossOrder.OrderStateType == OrderStateType.Cancelled ||
                  nextState.StopLossOrder.OrderStateType == OrderStateType.Expired))
            {
                try
                {
                    await _ordersService.CancelOrder(currentState.StopLossOrder);
                }
                catch
                {
                    // ignored
                }
                finally
                {
                    nextState.StopLossOrder.OrderStateType = OrderStateType.Cancelled;
                }
            }

            var closeOrderEntity = _orderRepository.Get(nextState.ClosePositionOrder.Id);

            if (closeOrderEntity == null)
            {
                throw new BusinessException("Order was not found in storage")
                      {
                          Details = $"Close position order: {JsonConvert.SerializeObject(nextState.ClosePositionOrder)}"
                      }
            }
            ;
            _orderRepository.Update(nextState.ClosePositionOrder.ToEntity(closeOrderEntity));
            _loggingService.LogAction(nextState.ClosePositionOrder.ToLogAction(OrderActionType.Fill));

            var stopLossOrderEntity = _orderRepository.Get(nextState.StopLossOrder.Id);

            if (stopLossOrderEntity == null)
            {
                throw new BusinessException("Order was not found in storage")
                      {
                          Details = $"Stop loss order: {JsonConvert.SerializeObject(nextState.StopLossOrder)}"
                      }
            }
            ;
            _orderRepository.Update(nextState.StopLossOrder.ToEntity(stopLossOrderEntity));
            _loggingService.LogAction(nextState.StopLossOrder.ToLogAction(OrderActionType.Cancel));

            return(nextState);
        }
    }
}
 public void CancelOrder(int orderId)
 {
     _ordersService.CancelOrder(orderId);
 }