public override void OnData(Slice slice) { if (!Portfolio.Invested) { OptionChain chain; if (slice.OptionChains.TryGetValue(_optionSymbol, out chain)) { var atmStraddle = chain .OrderBy(x => Math.Abs(chain.Underlying.Price - x.Strike)) .ThenByDescending(x => x.Expiry) .FirstOrDefault(); if (atmStraddle != null) { Sell(OptionStrategies.Straddle(_optionSymbol, atmStraddle.Strike, atmStraddle.Expiry), 2); } } } else { Liquidate(); } foreach (var kpv in slice.Bars) { Log($"---> OnData: {Time}, {kpv.Key.Value}, {kpv.Value.Close:0.00}"); } }
/// <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); } } }