Esempio n. 1
0
        public void OrderProcessedInLooper(OrderType orderType, double stopPrice, double limitPrice, bool hasNullLastFillTime = false)
        {
            var equityPoints = new SortedList <DateTime, double>
            {
                { new DateTime(2019, 1, 3, 5, 0, 5), 100000 },
                { new DateTime(2019, 1, 4, 5, 0, 5), 90000 },
            };

            var series     = new Series <DateTime, double>(equityPoints);
            var entryOrder = Order.CreateOrder(new SubmitOrderRequest(
                                                   orderType,
                                                   SecurityType.Equity,
                                                   Symbols.SPY,
                                                   1,
                                                   (decimal)stopPrice,
                                                   (decimal)limitPrice,
                                                   new DateTime(2019, 1, 3, 5, 0, 5),
                                                   string.Empty
                                                   ));
            var exitOrder = Order.CreateOrder(new SubmitOrderRequest(
                                                  orderType,
                                                  SecurityType.Equity,
                                                  Symbols.SPY,
                                                  -1,
                                                  (decimal)stopPrice,
                                                  (decimal)limitPrice,
                                                  new DateTime(2019, 1, 4, 5, 0, 5),
                                                  string.Empty
                                                  ));

            if (!hasNullLastFillTime)
            {
                entryOrder.LastFillTime = new DateTime(2019, 1, 3, 5, 0, 5);
                exitOrder.LastFillTime  = new DateTime(2019, 1, 4, 5, 0, 5);
            }

            entryOrder.GetType().GetProperty("Id").SetValue(entryOrder, 1);
            entryOrder.GetType().GetProperty("Price").SetValue(entryOrder, 100000m);
            Order marketOnFillOrder = null;

            if (hasNullLastFillTime)
            {
                marketOnFillOrder = entryOrder.Clone();
                marketOnFillOrder.GetType().GetProperty("Status").SetValue(marketOnFillOrder, OrderStatus.Filled);
                marketOnFillOrder.GetType().GetProperty("Time").SetValue(marketOnFillOrder, new DateTime(2019, 1, 3, 6, 0, 5));
            }
            exitOrder.GetType().GetProperty("Id").SetValue(exitOrder, 2);
            exitOrder.GetType().GetProperty("Price").SetValue(exitOrder, 80000m);
            exitOrder.GetType().GetProperty("Status").SetValue(exitOrder, OrderStatus.Filled);

            var orders = new[] { entryOrder, marketOnFillOrder, exitOrder }.Where(x => x != null);

            var looper = PortfolioLooper.FromOrders(series, orders);
            var pointInTimePortfolio = looper.ToList();

            Assert.AreEqual(3, pointInTimePortfolio.Count);
            Assert.AreEqual(100000, pointInTimePortfolio[0].TotalPortfolioValue);
            Assert.AreEqual(80000, pointInTimePortfolio[1].TotalPortfolioValue);
            Assert.AreEqual(80000, pointInTimePortfolio[2].TotalPortfolioValue);
        }
Esempio n. 2
0
        public void EmptyEquitySeriesDoesNotCrash()
        {
            var equityPoints = new SortedList <DateTime, double>
            {
                { new DateTime(2019, 1, 3, 5, 0, 5), 100000 }
            };
            var series = new Series <DateTime, double>(equityPoints);
            var order  = new MarketOrder(Symbols.SPY, 1m, new DateTime(2019, 1, 3, 5, 0, 0));

            // Force an order ID >= 1 on the order, otherwise the test will fail
            // because the order will be filtered out.
            order.GetType().GetProperty("Id").SetValue(order, 1);

            var orders = new List <Order>
            {
                order
            };

            Assert.DoesNotThrow(() => PortfolioLooper.FromOrders(series, orders).ToList());
        }
Esempio n. 3
0
        public void OptionOrderDoesNotThrow()
        {
            var equityPoints = new SortedList <DateTime, double>
            {
                { new DateTime(2019, 1, 3, 5, 0, 5), 100000 },
                { new DateTime(2019, 1, 4, 5, 0, 5), 90000 },
            };

            var series    = new Series <DateTime, double>(equityPoints);
            var equity    = Symbol.Create("SPY", SecurityType.Equity, Market.USA);
            var optionSid = SecurityIdentifier.GenerateOption(
                equity.ID.Date,
                equity.ID,
                equity.ID.Market,
                200m,
                OptionRight.Call,
                OptionStyle.American);
            var option = new Symbol(optionSid, optionSid.Symbol);

            var entryOrder = Order.CreateOrder(new SubmitOrderRequest(
                                                   OrderType.Market,
                                                   SecurityType.Option,
                                                   option,
                                                   1,
                                                   0m,
                                                   0m,
                                                   new DateTime(2019, 1, 3, 5, 0, 5),
                                                   string.Empty
                                                   ));
            var exitOrder = Order.CreateOrder(new SubmitOrderRequest(
                                                  OrderType.Market,
                                                  SecurityType.Option,
                                                  option,
                                                  -1,
                                                  0m,
                                                  0m,
                                                  new DateTime(2019, 1, 4, 5, 0, 5),
                                                  string.Empty
                                                  ));

            entryOrder.LastFillTime = new DateTime(2019, 1, 3, 5, 0, 5);
            exitOrder.LastFillTime  = new DateTime(2019, 1, 4, 5, 0, 5);

            entryOrder.GetType().GetProperty("Id").SetValue(entryOrder, 1);
            entryOrder.GetType().GetProperty("Price").SetValue(entryOrder, 100000m);

            Order marketOnFillOrder = null;

            exitOrder.GetType().GetProperty("Id").SetValue(exitOrder, 2);
            exitOrder.GetType().GetProperty("Price").SetValue(exitOrder, 80000m);
            exitOrder.GetType().GetProperty("Status").SetValue(exitOrder, OrderStatus.Filled);

            var orders = new[] { entryOrder, marketOnFillOrder, exitOrder }.Where(x => x != null);

            var looper = PortfolioLooper.FromOrders(series, orders);

            Assert.DoesNotThrow(() =>
            {
                foreach (var pointInTimePortfolio in looper)
                {
                    Assert.AreEqual(option, pointInTimePortfolio.Order.Symbol);
                    Assert.AreEqual(option.Underlying, pointInTimePortfolio.Order.Symbol.Underlying);
                }
            });
        }