Overall Statistics
Total Trades
4
Average Win
0.56%
Average Loss
-1.51%
Compounding Annual Return
-23.510%
Drawdown
1.100%
Expectancy
-0.312
Net Profit
-0.950%
Sharpe Ratio
-8.472
Loss Rate
50%
Win Rate
50%
Profit-Loss Ratio
0.38
Alpha
-0.123
Beta
-0.132
Annual Standard Deviation
0.024
Annual Variance
0.001
Information Ratio
-8.083
Tracking Error
0.097
Treynor Ratio
1.519
Total Fees
$1.00
using QuantConnect.Securities.Option;
using System.Net;
namespace QuantConnect
{
    public class StraddleFundamentalAlgorithm : QCAlgorithm
    {			
    	public class ListTuple: List<Tuple<DateTime, string>>
{
    public DateTime date {get;set;}
    public string ticker {get; set;}
    public ListTuple(DateTime _date, string _ticker)
    {
         date = _date;
         ticker = _ticker;
    }
}




    	
    	public List<ListTuple> ReadEarningData(){
    		Debug("lala");
    WebClient webClient = new WebClient();
string theText = webClient.DownloadString("http://tradeitforweed.ca/earnings_sql3.csv");
string[] lines = theText.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.None);

List<ListTuple> splitted = new List<ListTuple>();

foreach (var line in lines){
	if(line.Split(',')[0].Length != 0){
	ListTuple example = new ListTuple(DateTime.ParseExact(line.Split(',')[0], "M/d/yyyy", CultureInfo.InvariantCulture), line.Split(',')[1]);
	splitted.Add(example);
	}

}
    return splitted;
    	}
    	private List<Symbol> _symbols = new List<Symbol>();
        private SecurityChanges _changes = SecurityChanges.None;
        private decimal TP = 0.125M;
        private List<ListTuple> earnings = new List<ListTuple>();
        private double Held = 0;
        private decimal SL = -0.095M;
        public override void Initialize()
        {
        	earnings = ReadEarningData();
            UniverseSettings.Resolution = Resolution.Daily;

            SetStartDate(2012, 01, 01);
            SetEndDate(2012, 1, 15); //2012,5,5
            SetCash(10000);
			
		
            //AddUniverse(CoarseSelectionFunction, FineSelectionFunction);
        }

        public IEnumerable<Symbol> CoarseSelectionFunction(IEnumerable<CoarseFundamental> coarse) {
            return coarse
                .Where(x => x.HasFundamentalData)
                .OrderByDescending(x => x.DollarVolume)
                .Select(x => x.Symbol).Take(10);
        }

        public IEnumerable<Symbol> FineSelectionFunction(IEnumerable<FineFundamental> fine) {
            

		List<ListTuple> list = new List<ListTuple>();
		IEnumerable<Symbol> second = list.Cast<Symbol>();
		return second;
            
        }

        public override void OnData(Slice data) {
				// Check the next earnings.
				var nextEarnings = earnings.Where(x => x.date == Time.Date.AddDays(-14)).ToArray();
				foreach (var nextEarning in nextEarnings)
				{
					Log(nextEarning.ticker);
					if (Held <= 2){
					// Just an example, implement your logic here.
					AddSecurity(SecurityType.Equity, nextEarning.ticker, Resolution.Daily);
					}
				}
				var todayEarnings = earnings.Where(x => x.date == Time.Date.AddDays(1)).ToArray();
				foreach (var nextEarning in todayEarnings)
				{
					Log(nextEarning.ticker);
					// Just an example, implement your logic here.
					RemoveSecurity(nextEarning.ticker);
				}
            List<Symbol> hSymbols = new List<Symbol>();
			List<SecurityHolding> hHoldings = new List<SecurityHolding>();
			
                    int i = 0;
        	 foreach (var kvp in Portfolio)
                {
                    var holdingSymbol = kvp.Key;
                    var holdings = kvp.Value;
                    if (holdings.AbsoluteQuantity > 0)
                    {
						hSymbols.Add(holdingSymbol);
						hHoldings.Add(holdings);
                        
                    }
                }
            foreach (var kvp in data.OptionChains) {
            	var chain = kvp.Value;
            	var symbol = kvp.Key;
            	
            	if (_symbols.Contains(symbol.Underlying)){
            		
            		return;
            	}
            	var atmStraddle = chain
                    .OrderBy(x => Math.Abs(chain.Underlying.Price - x.Strike))
                    .ThenByDescending(x => x.Expiry)
                    .FirstOrDefault();

                if (atmStraddle != null && Held <= 2)
                {
               Debug("Bought: " + symbol + " &Held: " + (Held.ToString()));
                
                	Held++;
                	_symbols.Add(symbol.Underlying);
                	Buy(OptionStrategies.Straddle(symbol, atmStraddle.Strike, atmStraddle.Expiry), 1);
                    Debug(string.Format("{0} straddle orders submitted", symbol.Underlying));
                }
            }
            _changes = SecurityChanges.None;
		}
        public override void OnSecuritiesChanged(SecurityChanges changes)
        {
        	_changes = changes;
			if (Held <= 2){
            if (changes.AddedSecurities.Count > 0)
            {
                Log("Securities added: " + string.Join(",", changes.AddedSecurities.Select(x => x.Symbol.Value)));
            }
            if (changes.RemovedSecurities.Count > 0)
            {	
                Debug("Securities removed: " + string.Join(",", changes.RemovedSecurities.Select(x => x.Symbol.Value)));
            }
			}
            foreach (var security in changes.RemovedSecurities)
            {
            	if (security.Invested)
                {
                	Held = Held - 0.5;
                    Liquidate(security.Symbol);
                    Debug("Sold back: " + security.Symbol + " &Held: " + Held.ToString());
                }
            	
            }
            
            // Add option for every added security
            foreach (var security in changes.AddedSecurities)
            {
                if (security is Option) continue;
            	//if (security.Symbol.Equals("SPY")) continue;
            	
               if (security.Symbol.Value.IndexOf(' ') != 0){
            	var option = AddOption(security.Symbol.Value);
            	option.SetFilter(-2, 2, TimeSpan.FromDays(30), TimeSpan.FromDays(45));
               }
               else {
               	var theSymbol = security.Symbol.Value.Split(' ')[0];
            	var option = AddOption(theSymbol);
            	option.SetFilter(-2, 2, TimeSpan.FromDays(30), TimeSpan.FromDays(45));
               }
            }
        }
    }
}