/// <summary>
        /// OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here.
        /// </summary>
        /// <param name="slice">Slice object keyed by symbol containing the stock data</param>
        public override void OnData(Slice slice)
        {
            if (!Portfolio.Invested)
            {
                OptionChain chain;
                if (IsMarketOpen(_optionSymbol) && slice.OptionChains.TryGetValue(_optionSymbol, out chain))
                {
                    var callContracts = chain.Where(contract => contract.Right == OptionRight.Call)
                                        .GroupBy(x => x.Expiry)
                                        .OrderBy(grouping => grouping.Key)
                                        .First()
                                        .OrderBy(x => x.Strike)
                                        .ToList();

                    var expiry       = callContracts[0].Expiry;
                    var lowerStrike  = callContracts[0].Strike;
                    var middleStrike = callContracts[1].Strike;
                    var higherStrike = callContracts[2].Strike;

                    var optionStrategy = OptionStrategies.CallButterfly(_optionSymbol, higherStrike, middleStrike, lowerStrike, expiry);

                    Order(optionStrategy, 10);
                }
            }
        }