public void BatchAlphaResultPacketDuplicateOrder()
        {
            var btcusd = Symbol.Create("BTCUSD", SecurityType.Crypto, Market.GDAX);
            var orders = new List <Order>
            {
                new MarketOrder(btcusd, 1000, DateTime.UtcNow, "ExpensiveOrder")
                {
                    Id = 1
                },
                new MarketOrder(btcusd, 100, DateTime.UtcNow, "ExpensiveOrder")
                {
                    Id = 2
                },
                new MarketOrder(btcusd, 2000, DateTime.UtcNow, "ExpensiveOrder")
                {
                    Id = 1
                },
                new MarketOrder(btcusd, 10, DateTime.UtcNow, "ExpensiveOrder")
                {
                    Id = 3
                },
                new MarketOrder(btcusd, 3000, DateTime.UtcNow, "ExpensiveOrder")
                {
                    Id = 1
                }
            };
            var orders2 = new List <Order>
            {
                new MarketOrder(btcusd, 200, DateTime.UtcNow, "ExpensiveOrder")
                {
                    Id = 2
                },
                new MarketOrder(btcusd, 20, DateTime.UtcNow, "ExpensiveOrder")
                {
                    Id = 3
                }
            };

            var packet1 = new AlphaResultPacket("1", 1, orders: orders);
            var packet2 = new AlphaResultPacket("1", 1, orders: orders2);

            var result = new List <AlphaResultPacket> {
                packet1, packet2
            }.Batch();

            // we expect just 1 order instance per order id
            Assert.AreEqual(3, result.Orders.Count);
            Assert.IsTrue(result.Orders.Any(order => order.Id == 1 && order.Quantity == 3000));
            Assert.IsTrue(result.Orders.Any(order => order.Id == 2 && order.Quantity == 200));
            Assert.IsTrue(result.Orders.Any(order => order.Id == 3 && order.Quantity == 20));

            var expected = new List <Order> {
                orders[4], orders2[0], orders2[1]
            };

            Assert.IsTrue(result.Orders.SequenceEqual(expected));
        }
示例#2
0
        /// <summary>
        /// Handles the algorithm's <see cref="IAlgorithm.AlphasGenerated"/> event
        /// and broadcasts the new alpha using the messaging handler
        /// </summary>
        protected void OnAlphasGenerated(AlphaCollection collection)
        {
            // send message for newly created alphas
            Packet packet = new AlphaResultPacket(AlgorithmId, Job.UserId, collection.Alphas);

            _messages.Enqueue(packet);

            AlphaManager.AddAlphas(collection);

            // aggregate alpha counts per symbol
            foreach (var grouping in collection.Alphas.GroupBy(alpha => alpha.Symbol))
            {
                // predictions for this time step
                var count = grouping.Count();

                // track daily assets
                _dailyAlphaCountPerSymbol.AddOrUpdate(grouping.Key, sym => count, (sym, cnt) => cnt + count);

                // track total assets for life of backtest
                _alphaCountPerSymbol.AddOrUpdate(grouping.Key, sym => count, (sym, cnt) => cnt + count);
            }
        }
        public void BatchAlphaResultPacket()
        {
            var btcusd   = Symbol.Create("BTCUSD", SecurityType.Crypto, Market.GDAX);
            var insights = new List <Insight>
            {
                new Insight(DateTime.UtcNow, btcusd, Time.OneMillisecond, InsightType.Price, InsightDirection.Up, 1, 2, "sourceModel1"),
                new Insight(DateTime.UtcNow, btcusd, Time.OneSecond, InsightType.Price, InsightDirection.Down, 1, 2, "sourceModel1")
            };
            var orderEvents = new List <OrderEvent>
            {
                new OrderEvent(1, btcusd, DateTime.UtcNow, OrderStatus.Submitted, OrderDirection.Buy, 0, 0, OrderFee.Zero, message: "OrderEvent1"),
                new OrderEvent(1, btcusd, DateTime.UtcNow, OrderStatus.Filled, OrderDirection.Buy, 1, 1000, OrderFee.Zero, message: "OrderEvent2")
            };
            var orders = new List <Order> {
                new MarketOrder(btcusd, 1000, DateTime.UtcNow, "ExpensiveOrder")
                {
                    Id = 1
                }
            };

            var packet1 = new AlphaResultPacket("1", 1, insights: insights);
            var packet2 = new AlphaResultPacket("1", 1, orders: orders);
            var packet3 = new AlphaResultPacket("1", 1, orderEvents: orderEvents);

            var result = new List <AlphaResultPacket> {
                packet1, packet2, packet3
            }.Batch();

            Assert.AreEqual(2, result.Insights.Count);
            Assert.AreEqual(2, result.OrderEvents.Count);
            Assert.AreEqual(1, result.Orders.Count);

            Assert.IsTrue(result.Insights.SequenceEqual(insights));
            Assert.IsTrue(result.OrderEvents.SequenceEqual(orderEvents));
            Assert.IsTrue(result.Orders.SequenceEqual(orders));

            Assert.IsNull(new List <AlphaResultPacket>().Batch());
        }