Ejemplo n.º 1
0
        private bool ProcessLimitOrder(Order order, MarketDataPoint currentMarketDataPoint)
        {
            Log.Debug($"Processing limit order {order}");
            var orderProcessed = false;

            switch (order.Side)
            {
            case OrderSide.Buy:
                if (order.Price >= currentMarketDataPoint.Price)
                {
                    if (Portfolio.UnfreezeSecurity(order.BaseCurrency, order.Volume * order.Price * (1 + _TradeFee)) &&
                        Portfolio.RemoveSecurity(order.BaseCurrency, order.Volume * currentMarketDataPoint.Price * (1 + _TradeFee)))
                    {
                        Portfolio.AddSecurity(order.Security, order.Volume);
                        orderProcessed = true;
                    }
                }
                break;

            case OrderSide.Sell:
                if (order.Price <= currentMarketDataPoint.Price)
                {
                    if (Portfolio.UnfreezeSecurity(order.Security, order.Volume) && Portfolio.RemoveSecurity(order.Security, order.Volume))
                    {
                        var transactionAmount = order.Volume * currentMarketDataPoint.Price * (1 - _TradeFee);
                        Portfolio.AddSecurity(order.BaseCurrency, transactionAmount);
                        orderProcessed = true;
                    }
                }
                break;
            }

            if (orderProcessed)
            {
                Log.Debug($"Limit order processed");
                _PendingOrders.Remove(order);
                OnTradeExecuted(new Trade()
                {
                    Timestamp       = currentMarketDataPoint.Timestamp,
                    Order           = order,
                    ExecutionPrice  = currentMarketDataPoint.Price,
                    ExecutionVolume = order.Volume
                });
            }
            else
            {
                Log.Warn($"Cannot place order: {order.ToFormattedString()}");
            }

            return(orderProcessed);
        }
Ejemplo n.º 2
0
        private Order ProcessMarketOrder(Order order, MarketDataPoint currentMarketDataPoint)
        {
            Log.Debug($"Processed market order {order}");
            var orderProcessed = false;

            switch (order.Side)
            {
            case OrderSide.Buy:
                if (Portfolio.RemoveSecurity(order.BaseCurrency, order.Volume * currentMarketDataPoint.Price * (1 + _TradeFee)))
                {
                    Portfolio.AddSecurity(order.Security, order.Volume);
                    orderProcessed = true;
                }
                break;

            case OrderSide.Sell:
                if (Portfolio.RemoveSecurity(order.Security, order.Volume))
                {
                    Portfolio.AddSecurity(order.BaseCurrency, order.Volume * currentMarketDataPoint.Price * (1 - _TradeFee));
                    orderProcessed = true;
                }
                break;
            }
            if (orderProcessed)
            {
                Log.Debug($"Market order processed");
                OnTradeExecuted(new Trade()
                {
                    Timestamp       = currentMarketDataPoint.Timestamp,
                    Order           = order,
                    ExecutionPrice  = currentMarketDataPoint.Price,
                    ExecutionVolume = order.Volume
                });
                return(order);
            }
            else
            {
                Log.Warn($"Unable to place order: {order.ToFormattedString()}");
                return(null);
            }
        }
Ejemplo n.º 3
0
        public void OpenOrder_LimitOrder()
        {
            var startingPortfolio = new Portfolio();

            startingPortfolio.AddSecurity("USD", 1000m);
            var market = new HistoricalMarket(TimeSpan.FromHours(1), startingPortfolio, 0);

            GenerateConstantDataCsv("test.csv", 100, 100, TimeSpan.FromHours(1));
            market.LoadDataFromCsv("test.csv", "SPX", "USD");

            market.Tick();

            market.OpenOrder(new Order()
            {
                BaseCurrency = "USD",
                Price        = 100,
                Security     = "SPX",
                Side         = OrderSide.Buy,
                Type         = OrderType.LimitOrder,
                Volume       = 1
            });
        }