Overall Statistics
Total Trades
0
Average Win
0%
Average Loss
0%
Compounding Annual Return
0%
Drawdown
0%
Expectancy
0
Net Profit
0%
Sharpe Ratio
0
Probabilistic Sharpe Ratio
0%
Loss Rate
0%
Win Rate
0%
Profit-Loss Ratio
0
Alpha
0
Beta
0
Annual Standard Deviation
0
Annual Variance
0
Information Ratio
0
Tracking Error
0
Treynor Ratio
0
Total Fees
$0.00
Estimated Strategy Capacity
$0
Lowest Capacity Asset
Portfolio Turnover
0%
#region imports

using System;
using System.Linq;
using QuantConnect.Brokerages;
using QuantConnect.Data;
using QuantConnect.Data.Market;
using QuantConnect.Orders;
using QuantConnect.Securities;
using QuantConnect.Securities.Future;
using QuantConnect.Securities.FutureOption;
using QuantConnect.Securities.Option;
using QCAlgorithmFramework = QuantConnect.Algorithm.QCAlgorithm;
using QCAlgorithmFrameworkBridge = QuantConnect.Algorithm.QCAlgorithm;

#endregion

namespace QuantConnect.Algorithm.CSharp
{
    public class LogFuturesOptionsAlgorithm : QCAlgorithm
    {
        Future future;

        public override void Initialize()
        {
            SetStartDate(2023, 6, 25);
            SetEndDate(2023, 6, 27);
            SetCash(500000);

            future = AddFuture(Futures.Indices.SP500EMini, Resolution.Minute, Market.CME, extendedMarketHours: true);
            future.SetFilter(0, 90);
            AddFutureOption(future.Symbol, universe => universe.Strikes(-1, 1));

            var _futureContractSymbol = 
                QuantConnect.Symbol.CreateFuture(Futures.Indices.SP500EMini, Market.CME, new DateTime(2023, 9, 15));

            var _optionContractSymbol = QuantConnect.Symbol.CreateOption(_futureContractSymbol,
                Market.CME, OptionStyle.American, OptionRight.Call, 4400, new DateTime(2023, 6, 28));

            var optionContractSymbols = OptionChainProvider.GetOptionContractList(_futureContractSymbol, Time).ToList();
            foreach (var symbol in optionContractSymbols.DistinctBy(s=>s.ID.Date)) Log(symbol.ID.Date.ToShortDateString());
            
            var expiry = optionContractSymbols.Select(symbol => symbol.ID.Date).Min();
            var filteredSymbols = optionContractSymbols.Where(symbol =>
                symbol.ID.Date == expiry && symbol.ID.OptionRight == OptionRight.Call);
            _optionContractSymbol = filteredSymbols.OrderByDescending(symbol => symbol.ID.StrikePrice).Last();

            var option = AddFutureOptionContract(_optionContractSymbol, Resolution.Minute, extendedMarketHours: true);
            option.PriceModel = OptionPriceModels.BjerksundStensland();
        }


        public override void OnData(Slice slice)
        {
            LogFuturesOptions(slice);
        }

        private void LogFuturesOptions(Slice slice)
        {
            LogOptionChains(slice);

            foreach (var kvp in slice.FuturesChains)
            {
                var continuousContractSymbol = kvp.Key;
                var futuresChain = kvp.Value;

                Log(continuousContractSymbol + " " + futuresChain.Contracts.First().Key);

                // Select a Future Contract and create its canonical FOP Symbol
                var futuresContract = futuresChain.First();
                var canonicalFOPSymbol = QuantConnect.Symbol.CreateCanonicalOption(futuresContract.Symbol);

                if (slice.OptionChains.TryGetValue(canonicalFOPSymbol, out var fopChain))
                {
                    foreach (var contract in fopChain)
                    {
                        Log(contract.Symbol);
                    }
                }
            }
        }

        void LogOptionChains(Slice slice)
        {
            if (!slice.OptionChains.Any()) Log("# Slice has no OptionChains");
            foreach (var chain in slice.OptionChains)
            {
                Log(chain.Key + " " + chain.Key.ID.Date);                
            }
        }

    }
}