Overall Statistics
namespace QuantConnect.Algorithm.CSharp
{
    public class ConsolidatorTest : QCAlgorithm
    {
        private Symbol _symbol = QuantConnect.Symbol.Create("EURUSD", SecurityType.Forex, Market.Oanda);

        public override void Initialize()
        {
            SetStartDate(2019, 01, 01);  //Set Start Date
            SetEndDate(2019, 02, 03);    //Set End Date
            SetCash(100000);             //Set Strategy Cash
            
            AddForex(_symbol, Resolution.Minute);
            
            // var nyCloseConsolidator = new QuoteBarConsolidator(TimeSpan.FromDays(1));	//this builds but isn't what I want
            var nyCloseConsolidator = new QuoteBarConsolidator(TimeSpan.FromHours(1));	//this builds but isn't what I want
            // var nyCloseConsolidator = new NYCloseQuoteBarConsolidator();					// doesn't build with the custom consolidator below
            nyCloseConsolidator.DataConsolidated += OnNYClose;
            SubscriptionManager.AddConsolidator(_symbol, nyCloseConsolidator);
        }

        public override void OnData(Slice data)
        {
        }
        
        public void OnNYClose(object sender, QuoteBar bar)
        {
        	Log(bar.Bid.Close.ToString("0.00000"));
        }
    }
    
    class NYCloseQuoteBarConsolidator : DataConsolidator<QuoteBar>
    {
    	private QuoteBar _consolidatedBar;
    	
    	public override Type OutputType
    	{
    		get { return typeof (QuoteBar);}
    	}
    	
    	public override IBaseData WorkingData
    	{
    		get { return (_consolidatedBar);}		// ??? Is this right?
    	}
    	
    	public override void Update(QuoteBar bar)
    	{
    		if (bar.Time.TimeOfDay.TotalHours == 17)		// NY close
    		{
    			OnDataConsolidated(_consolidatedBar);
    			_consolidatedBar = new QuoteBar()
    			{
    				Time = bar.Time
    			};
    		}
    		else
    		{
    			_consolidatedBar.Update(bar.Close, bar.Bid.Close, bar.Ask.Close, 0.0m, bar.LastBidSize, bar.LastAskSize);
    		}
    	}
    	
    	public override void Scan(DateTime time)
    	{
    		// ??? what should I do here?
    	}
    }
}