Overall Statistics
Total Trades
1
Average Win
0%
Average Loss
0%
Compounding Annual Return
7146.263%
Drawdown
0.000%
Expectancy
0
Net Profit
0.785%
Sharpe Ratio
0
Loss Rate
0%
Win Rate
0%
Profit-Loss Ratio
0
Alpha
0
Beta
0
Annual Standard Deviation
0
Annual Variance
0
Information Ratio
0
Tracking Error
0
Treynor Ratio
0
Total Fees
$1.00
using System.Threading;

namespace QuantConnect.Algorithm.CSharp
{
    /// <summary>
    /// Basic template algorithm simply initializes the date range and cash. This is a skeleton
    /// framework you can use for designing an algorithm.
    /// </summary>
    
    /* Things to do:
   	1.	Add two or more symbols to be looked at.
   	2.	Schedule events: -- Have a good idea
   			a.	Do something before Market Opens
   			b.	Do something when Market Opens
   			c.	Do something every 2 hours after market opens upto 3:30 PM
   			d.	Do something at 3:31 PM
   			d.	Do something at Market Close
   			e.	Do something after Market Close
   			f.  Do something every 5 minutes - create the list based on a function.
   	3.	Get the last 10 prices for each 2 hour period.
   			This could be over multiple days, ignore weekend and holidays.
   	4.	Figure out how to make this parametrized.
   	5.	Set the following:
   			a.	Benchmark
   			b.	Slippage
   			c.	Comission
   			d.	Half-Day no trade
    */
    /* Errors:
    1.	Removing AddEquity(_spy, Resolution.Hour); causes an error
    
    */
    public class BasicTemplateAlgorithm : QCAlgorithm
    {
    	private const int MINUTES_IN_HOUR = 60;
    	private const int CHECK_EVERY_N_MINUTES = 120;
    	
    	private static readonly DateTime TODAY = DateTime.Now;
    	private static readonly DateTime TRADING_START_TIME = new DateTime(TODAY.Year, TODAY.Month, TODAY.Day, 9, 30, 0);
		private static readonly DateTime TRADING_END_TIME = new DateTime(TODAY.Year, TODAY.Month, TODAY.Day, 16, 0, 0);
		private static readonly TimeSpan TRADING_TIME_SPAN = TRADING_END_TIME.Subtract ( TRADING_START_TIME );
    	private static readonly int TRADING_MINUTES = (int)TRADING_TIME_SPAN.TotalMinutes;
    	
    	private const string SPY = "SPY";
		

		private static readonly IReadOnlyList<int> HoursToCheck =  new List<int>{ 0, 2, 4, 6 };
		private static readonly IReadOnlyList<int> MinutesToCheck = Enumerable.Range(CHECK_EVERY_N_MINUTES, TRADING_MINUTES).Where(n => (n % CHECK_EVERY_N_MINUTES) == 0).ToList();
    	
    	
        private Symbol _spy = QuantConnect.Symbol.Create(SPY, SecurityType.Equity, Market.USA);


        /// <summary>
        /// Initialise the data and resolution required, as well as the cash and start-end dates for your algorithm. All algorithms must initialized.
        /// </summary>
        public override void Initialize()
        {
            SetStartDate(2013, 10, 10);  //Set Start Date
            SetEndDate(2013, 10, 10);    //Set End Date
            SetCash(10000);              //Set Strategy Cash

			AddEquity(_spy, Resolution.Hour);
			
			#region Schedule Functions
			Schedule.On(DateRules.EveryDay(SPY), TimeRules.At(9, 0), BeforeMarketOpen);
			
			foreach (var hour in HoursToCheck)
            {
            	Schedule.On(DateRules.EveryDay(SPY), TimeRules.AfterMarketOpen(SPY, (MINUTES_IN_HOUR * hour) + 1), TimelyCheck);
            }
           	
           	Schedule.On(DateRules.EveryDay(SPY), TimeRules.BeforeMarketClose(SPY, 25), BeforeMarketClose);

			Schedule.On(DateRules.EveryDay(SPY), TimeRules.At(17, 0), AfterMarketClose);
			#endregion Schedule Functions
            
        }

		
        /// <summary>
        /// OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here.
        /// </summary>
        /// <param name="data">Slice object keyed by symbol containing the stock data</param>
        public override void OnData(Slice data)
        {
            if (!Portfolio.Invested)
            {
                SetHoldings(_spy, 1);
                Debug("Purchased Stock");
            }
        }
        
        /// <summary>
        /// End of a trading day event handler. This method is called at the end of the algorithm day (or multiple times if trading multiple assets).
        /// </summary>
        /// <remarks>Method is called 10 minutes before closing to allow user to close out position.</remarks>
        public override void OnEndOfDay()
        {
        	LogMethodStart("OnEndOfDay");
        }
        
        #region Scheduled Functions 
        private void TimelyCheck()
        {
        	LogMethodStart("TimelyCheck");
        }
        
        private void BeforeMarketOpen()
        {
        	LogMethodStart("BeforeMarketOpen");
        	// Do Something
        	Thread.Sleep(10000);
        	LogMethodEnd("BeforeMarketOpen");
        }
        
        private void BeforeMarketClose()
        {
        	LogMethodStart("BeforeMarketClose");
        }
        
        private void AfterMarketClose()
        {
        	LogMethodStart("AfterMarketClose");
        }
        #endregion Scheduled Functions
        
        
        #region Log Method Start & End
        private void LogMethodStart(string pMethodName)
        {
        	LogMethod(pMethodName);
        }
        
        private void LogMethodEnd(string pMethodName)
        {
			LogMethod(pMethodName, false);       	
        }
        
        private void LogMethod(string pMethodName, bool pIsStart = true)
        {
        	var vState = pIsStart ? "Start" : "End";
        	var vMessage = String.Format("Method: {0} {1} - {2:MM/dd/yy H:mm:ss:fff}", pMethodName, vState, Time);
        	
        	LogIt(vMessage);
        }
        #endregion Log Method Start & End
        
        
        private void LogIt(string pMessage)
        {
        	Debug(pMessage);
        	Log(pMessage);
        }
    }
}