Overall Statistics
Total Trades
2
Average Win
1.16%
Average Loss
0%
Compounding Annual Return
4.431%
Drawdown
0.100%
Expectancy
0
Net Profit
1.156%
Sharpe Ratio
4.054
Loss Rate
0%
Win Rate
100%
Profit-Loss Ratio
0
Alpha
0.043
Beta
0.015
Annual Standard Deviation
0.011
Annual Variance
0
Information Ratio
0.702
Tracking Error
0.108
Treynor Ratio
2.755
Total Fees
$1.00
namespace QuantConnect 
{
    public partial class CoveredCallAlgorithm : QCAlgorithm
    {
        
   
        string _symbol = "BMY";
        Symbol _equitySymbol;
        Symbol _optionSymbol;
        string phoneNumber = ""; // Fill this in ex 2125551212

    
    	private Slice lastSlice = null;
    	
    	private bool orderedOnce = false;
    	
    
        public override void Initialize() 
        {
            //Start and End Date range for the backtest:
            SetStartDate(2012, 8, 8);
            SetEndDate(2012,11, 12);
            //SetEndDate(2016,8, 26);  
            
            //Cash allocation
            SetCash(25000);
            
         
       
			
			var equity = AddEquity(_symbol, Resolution.Minute);
        	_equitySymbol = equity.Symbol;
        	
        	Securities[_symbol].SetDataNormalizationMode(DataNormalizationMode.TotalReturn);
        	
        	var option = AddOption(_symbol);
        	_optionSymbol = option.Symbol;
        	
   
            
            
            
            // Call Side
            /*option.SetFilter(universe => from symbol in universe
                                                         // default is monthly expirations only
                                                          .Expiration(TimeSpan.FromDays(10), TimeSpan.FromDays(55))
                                         where symbol.ID.OptionRight == OptionRight.Call  
                                              
                                          &&     (symbol.ID.StrikePrice - universe.Underlying.Price) / universe.Underlying.Price <= 0.10m  // within 10%
                                         select symbol);*/
			// Put Side
			option.SetFilter(universe => from symbol in universe
                                                         // default is monthly expirations only
                                                          .Expiration(TimeSpan.FromDays(10), TimeSpan.FromDays(55))
                                         where symbol.ID.OptionRight == OptionRight.Put  
                                              
                                          &&     (symbol.ID.StrikePrice - universe.Underlying.Price) / universe.Underlying.Price >= -0.15m  // within 15%
                                         select symbol);
			
			
            Notify.Sms(phoneNumber,"SimpleShortPutExpirationTest Started");
            Schedule.On(DateRules.EveryDay(_symbol), TimeRules.At(9, 35), () =>
            {
                ConsiderTrade();
            });
            
    	
            
          
        }
        
      

        //Data Event Handler: New data arrives here. "TradeBars" type is a dictionary of strings so you can access it by symbol.
        public void OnData(Slice data) 
        {   
            
            if (IsWarmingUp) { return;}
            
            lastSlice = data;
            
            
        }
        
        public override void OnEndOfDay() 
        {

        	//if (Time.Date == new DateTime(2012,09,22)) // Comment this out in live mode (for controlled backtest)
            {
            	if (lastSlice == null) { return; }
            	Log(String.Format("{0} closed at {1}",
            	_symbol,
            	lastSlice.Bars[_symbol].Close.ToString("#.####")
            	));
            	
            }
        }
        
        private void ConsiderTrade()
        {
        	if (orderedOnce) { return; }
        	if (Time.Date == new DateTime(2012,08,22)) // Comment this out in live mode (for controlled backtest)
        	{
	        	Debug("Consider Trade");
	        	if (lastSlice == null) { return; }
	        	if (lastSlice.Bars == null) { return;}
	        	if (!lastSlice.Bars.ContainsKey(_symbol)) { return; }
	        	
	        	OrderCallOption(lastSlice);
        	}

        }
        
        

        
        public void OrderCallOption(Slice slice)
        {
        	
    		OptionChain chain;
    		
            if (slice.OptionChains.TryGetValue(_optionSymbol, out chain))
            {

                // find the first call strike under market price expiring today
                var contracts = (
                    from optionContract in chain.OrderByDescending(x => x.Strike)
                    where optionContract.Right == OptionRight.Put
                    where optionContract.Expiry > Time.Date
                    where optionContract.Strike < chain.Underlying.Price
                    
                    select optionContract
                    ).Take(100);
                    
                    
                // Show Chain
                OptionContract contract = null;
                foreach (OptionContract _contract in contracts)
                {
                	Decimal pctOtm = ((_contract.Strike - _contract.UnderlyingLastPrice) / _contract.UnderlyingLastPrice) * 100;
                	Log(String.Format("Chain => Option Contract. Strike {0}, ULPrice={1}, Bid={2}, Ask={3}, Expiry={4} {5}, {6}%",
                	_contract.Strike,
                	_contract.UnderlyingLastPrice,
                	_contract.BidPrice,
                	_contract.AskPrice,
                	_contract.Expiry,
                	_contract.Expiry.DayOfWeek.ToString(),
                	pctOtm.ToString("#.####")
                	));
                	if (contract == null) { contract = _contract; }

                }
                
                
                if ((contract != null) && (!orderedOnce))
                {
                	orderedOnce = true;
                	int numContracts = -10;
                	
                	string message = String.Format("Order Option Contract. Strike {0} x {1}, ULPrice={2}, Bid={3}, Ask={4}, Expiry={5} {6}",numContracts,contract.Strike,contract.UnderlyingLastPrice,contract.BidPrice,contract.AskPrice,contract.Expiry,contract.Expiry.DayOfWeek.ToString());
                	Log(message);
                	Notify.Sms(phoneNumber,message);
                	
                    MarketOrder(contract.Symbol, numContracts,tag:"Sell Option");
                    
                }else{
                	Debug("No Option Contract Found");
                }
            }else{
            	Debug("No Option Contract Found [TryGetValue]");
            }
        }
        
        
        public override void OnOrderEvent(OrderEvent fill)
        {
        //	if (fill.Status.IsFill())
        	{
        		string message = String.Format("Order {0} {1} x {2} at {3} commission={4} OrderId={5}",
        		  fill.Status.ToString(),
        		  fill.FillQuantity,
        		  fill.Symbol,
        		  fill.FillPrice,
        		  fill.OrderFee,
        		  fill.OrderId);
        		  
        		  Log(message);
        		  Notify.Sms(phoneNumber,message);
        	}

        }
    }
    
    
    
}