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)); }
/// <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()); }