Overall Statistics
Total Trades
6
Average Win
0.89%
Average Loss
-0.84%
Compounding Annual Return
225.345%
Drawdown
1.500%
Expectancy
0.375
Net Profit
0.934%
Sharpe Ratio
4.566
Loss Rate
33%
Win Rate
67%
Profit-Loss Ratio
1.06
Alpha
-0.493
Beta
-1.231
Annual Standard Deviation
0.173
Annual Variance
0.03
Information Ratio
6.704
Tracking Error
0.274
Treynor Ratio
-0.643
Total Fees
$6.00
namespace QuantConnect 
{
    public class MarketOnCloseAlgorithm : QCAlgorithm
    {
        //Initialize the data and resolution you require for your strategy:
        public override void Initialize() 
        {
            SetStartDate(2016, 02, 22);         
            SetEndDate(2016, 02, 24);
            SetCash(25000);
            AddSecurity(SecurityType.Equity, "SPY", Resolution.Second);
            
            // schedule event every day at 3:44pm to submit market on close orders
            // for any open positions
            Schedule.Event().EveryDay().At(15, 44).Run(() =>
            {
            	foreach (var holding in Portfolio.Values)
            	{
            		if (holding.HoldStock)
            		{
            			MarketOnCloseOrder(holding.Symbol, -holding.Quantity, tag: "ScheduledEvent EOD Liquidate");
            		}
            	}
            });
        }

        //Data Event Handler: New data arrives here. "TradeBars" type is a dictionary of strings so you can access it by symbol.
        public void OnData(TradeBars data) 
        {
            if (!Portfolio.HoldStock) 
            {
            	// the first day this will fire in the morning at 9:30:01am
            	// every following day it will fire at 4:00pm at market close
            	// after the MOC order fills and will be converted into a
            	// MarketOnOpen order and will fill at 9:30:00am the following
            	// trading day
            	SetHoldings("SPY", 1, tag: "SetHoldings SPY 1");
            }
        }
        
        public override void OnEndOfDay(Symbol symbol)
        {
        	var holdings = Portfolio[symbol];
        	if (holdings.HoldStock)
        	{
        		// this won't actually work because most exchanges require MarketOnClose
        		// orders to be submitted at least 15 minutes before the market closes,
        		// so the engine will flag this order as invalid
        		MarketOnCloseOrder(symbol, -holdings.Quantity, "MarketOnClose");
        	}
        }
        
        public override void OnOrderEvent(OrderEvent fill)
        {
        	Log(Time + ":" + fill.ToString());
        }
    }
}