Overall Statistics
#region imports
    using System.Linq;
    using QuantConnect.Util;
    using QuantConnect.Data;
    using QuantConnect.Data.UniverseSelection;
    using QuantConnect.Data.Auxiliary;
    using QuantConnect.Securities;
using System;
#endregion
namespace QuantConnect.Algorithm.CSharp
{
    public class GeekyGreenRat : QCAlgorithm
    {
        private uint _openTradeTickFlags = (uint)(TradeConditionFlags.OfficialOpen | TradeConditionFlags.OpeningPrints);
        private uint _closeTradeTickFlags = (uint)(TradeConditionFlags.OfficialClose | TradeConditionFlags.ClosingPrints);

        public override void Initialize()
        {
            SetStartDate(DateTime.Now.AddDays(-10));
            UniverseSettings.FillForward = false;
            UniverseSettings.Resolution = Resolution.Tick;
            UniverseSettings.ExtendedMarketHours = true;
            UniverseSettings.DataNormalizationMode = DataNormalizationMode.Raw;
            AddUniverse(Universe.ETF("SPY", 
                f => {
                    var size = 30;
                    var g = f.Where(x => x.Weight != null).OrderByDescending(x => x.Weight).ToList();
                    Plot("Count", "All", f.Count());
                    Plot("Count", "Non-zero", g.Count);
                    g = [.. g.Take(size)];
                    var message = string.Join(" | ", g.Select(x => $"{x.Symbol.Value} ({x.Symbol.ID}): {x.Weight}"));
                    Log($"Top{size}: {message}");
                    return g.Select(x => x.Symbol);      
                }), 
                f => f.OrderByDescending(x => x.MarketCap).Take(10).Select(x => x.Symbol));
        }

        public override void OnData(Slice data)
        {
            foreach(var (symbol, ticks) in data.Ticks)
            {
                var tick = ticks
                    .Where(x => x.TickType == TickType.Trade)
                    .Where(x =>
                        (x.ParsedSaleCondition & _openTradeTickFlags) != 0 ||
                        (x.ParsedSaleCondition & _closeTradeTickFlags) != 0
                ).FirstOrDefault(); 
                
                if (tick != null) Log($"{tick.EndTime} :: {tick} {tick.Exchange}");
            }
        }
    }
}