From 8ed8cd26be7a703b8463da81ec4f4df9f476a382 Mon Sep 17 00:00:00 2001 From: Rudy Osuna Date: Thu, 18 Jun 2026 10:30:11 -0700 Subject: [PATCH 1/7] Add manual indicator alternative for intraday-greeks-based-options-selection --- .../python/intraday-greeks-based-options-selection/main.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/project-templates/python/intraday-greeks-based-options-selection/main.py b/project-templates/python/intraday-greeks-based-options-selection/main.py index 6d40632e32..d3f30394d8 100644 --- a/project-templates/python/intraday-greeks-based-options-selection/main.py +++ b/project-templates/python/intraday-greeks-based-options-selection/main.py @@ -19,6 +19,11 @@ def initialize(self) -> None: # The EMA/price cross will determine we trade ATM contracts self._index = self.add_index("RUT") self.ema(self._index, 60).updated += self._trade_target_delta_contract + # Alternatively, use a manual indicator. + # self._ema = ExponentialMovingAverage(60) + # self.warm_up_indicator(self._index.symbol, self._ema) + # self.register_indicator(self._index.symbol, self._ema) + # self._ema.updated += self._trade_target_delta_contract self._option_chain_symbol = Symbol.create_canonical_option(self._index, "RUTW", Market.USA, "?RUTW") self._dividend_yield_model = DividendYieldProvider(self._index) From 275c5e91cafb8299999d331f0cceedd5c9701332 Mon Sep 17 00:00:00 2001 From: Rudy Osuna Date: Thu, 18 Jun 2026 10:37:29 -0700 Subject: [PATCH 2/7] Use securities in manual indicator comments --- .../python/intraday-greeks-based-options-selection/main.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/project-templates/python/intraday-greeks-based-options-selection/main.py b/project-templates/python/intraday-greeks-based-options-selection/main.py index d3f30394d8..302229a9b7 100644 --- a/project-templates/python/intraday-greeks-based-options-selection/main.py +++ b/project-templates/python/intraday-greeks-based-options-selection/main.py @@ -21,8 +21,8 @@ def initialize(self) -> None: self.ema(self._index, 60).updated += self._trade_target_delta_contract # Alternatively, use a manual indicator. # self._ema = ExponentialMovingAverage(60) - # self.warm_up_indicator(self._index.symbol, self._ema) - # self.register_indicator(self._index.symbol, self._ema) + # self.warm_up_indicator(self._index, self._ema) + # self.register_indicator(self._index, self._ema) # self._ema.updated += self._trade_target_delta_contract self._option_chain_symbol = Symbol.create_canonical_option(self._index, "RUTW", Market.USA, "?RUTW") From 3330ad57c11ab994f97b76c77d0cfa3d1bf16527 Mon Sep 17 00:00:00 2001 From: Rudy Osuna Date: Thu, 18 Jun 2026 10:49:35 -0700 Subject: [PATCH 3/7] Add C# manual indicator alternative --- .../csharp/intraday-greeks-based-options-selection/Main.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/project-templates/csharp/intraday-greeks-based-options-selection/Main.cs b/project-templates/csharp/intraday-greeks-based-options-selection/Main.cs index aacc08464b..ee2068e2ec 100644 --- a/project-templates/csharp/intraday-greeks-based-options-selection/Main.cs +++ b/project-templates/csharp/intraday-greeks-based-options-selection/Main.cs @@ -84,6 +84,11 @@ public override void Initialize() // The EMA/price cross will determine we trade ATM contracts _index = AddIndex("RUT"); EMA(_index, 60).Updated += TradeTargetDeltaContract; + // Alternatively, use a manual indicator. + // var ema = new ExponentialMovingAverage(60); + // WarmUpIndicator(_index, ema); + // RegisterIndicator(_index, ema); + // ema.Updated += TradeTargetDeltaContract; _optionChainSymbol = QuantConnect.Symbol.CreateCanonicalOption(_index, "RUTW", Market.USA, "?RUTW"); _dividendYieldModel = new DividendYieldProvider(_index); From 2634c9a8dbe637f2c1cf681fd32fa394ae4f0f0e Mon Sep 17 00:00:00 2001 From: Rudy Osuna Date: Thu, 18 Jun 2026 11:22:16 -0700 Subject: [PATCH 4/7] Clarify manual indicator warm-up comments --- .../intraday-greeks-based-options-selection/Main.cs | 9 +++++---- .../intraday-greeks-based-options-selection/main.py | 7 ++++--- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/project-templates/csharp/intraday-greeks-based-options-selection/Main.cs b/project-templates/csharp/intraday-greeks-based-options-selection/Main.cs index ee2068e2ec..ed00b5fecf 100644 --- a/project-templates/csharp/intraday-greeks-based-options-selection/Main.cs +++ b/project-templates/csharp/intraday-greeks-based-options-selection/Main.cs @@ -75,18 +75,19 @@ public override void Initialize() SetStartDate(2024, 9, 1); SetEndDate(2024, 9, 5); SetCash(500000); + // AutomaticIndicatorWarmUp only supports automatic indicators, not manual indicators. Settings.AutomaticIndicatorWarmUp = true; UniverseSettings.MinimumTimeInUniverse = TimeSpan.Zero; // Warm-up the option contracts as soon as it is added to the algorithm Settings.SeedInitialPrices = true; - // The EMA/price cross will determine we trade ATM contracts + // The EMA/price cross will determine we trade ATM contracts _index = AddIndex("RUT"); EMA(_index, 60).Updated += TradeTargetDeltaContract; // Alternatively, use a manual indicator. // var ema = new ExponentialMovingAverage(60); - // WarmUpIndicator(_index, ema); + // WarmUpIndicator(_index, ema); // RegisterIndicator(_index, ema); // ema.Updated += TradeTargetDeltaContract; @@ -104,7 +105,7 @@ public void TradeTargetDeltaContract(object sender, IndicatorDataPoint current) if (!ema.IsReady) return; var spot = _index.Price; - + if (spot > current && spot > ema[-1]) { var atmCall = GetTargetDeltaContract(OptionRight.Call, spot); @@ -149,7 +150,7 @@ private Option GetTargetDeltaContract(OptionRight right, decimal spot, decimal t { return null; } - + return AddOptionContract(targetDeltaContract.Symbol); } } diff --git a/project-templates/python/intraday-greeks-based-options-selection/main.py b/project-templates/python/intraday-greeks-based-options-selection/main.py index 302229a9b7..72c0473265 100644 --- a/project-templates/python/intraday-greeks-based-options-selection/main.py +++ b/project-templates/python/intraday-greeks-based-options-selection/main.py @@ -10,13 +10,14 @@ def initialize(self) -> None: self.set_start_date(2024, 9, 1) self.set_end_date(2024, 9, 5) self.set_cash(500000) + # automatic_indicator_warm_up only supports automatic indicators, not manual indicators. self.settings.automatic_indicator_warm_up = True self.universe_settings.minimum_time_in_universe = timedelta(0) # Warm-up the option contracts as soon as it is added to the algorithm self.settings.seed_initial_prices = True - # The EMA/price cross will determine we trade ATM contracts + # The EMA/price cross will determine we trade ATM contracts self._index = self.add_index("RUT") self.ema(self._index, 60).updated += self._trade_target_delta_contract # Alternatively, use a manual indicator. @@ -36,7 +37,7 @@ def _trade_target_delta_contract(self, ema: ExponentialMovingAverage, current: I if not ema.is_ready: return spot = self._index.price - + if spot > current.value and spot > ema[-1].value: atm_call = self._get_target_delta_contract(OptionRight.CALL, spot) if atm_call and not self.portfolio[atm_call].invested: @@ -53,7 +54,7 @@ def _get_target_delta_contract(self, right: OptionRight, spot: float, target_del if not chain: return None expiry = min([x.expiry for x in chain]) - + def get_delta(x: OptionContract) -> tuple[OptionContract, float]: mirror_option = Symbol.create_option(x.symbol.underlying, "RUT", Market.USA, OptionStyle.EUROPEAN, mirror_option_right, x.strike, x.expiry) delta = Delta(x, self._interest_rate_model, self._dividend_yield_model, mirror_option) From b219b550a3bf1747bae87b90103951e4b8560550 Mon Sep 17 00:00:00 2001 From: Rudy Osuna Date: Thu, 18 Jun 2026 12:29:51 -0700 Subject: [PATCH 5/7] Fix alternative template review issues --- .../Main.cs | 14 ++++++-------- .../main.py | 10 ++++------ 2 files changed, 10 insertions(+), 14 deletions(-) diff --git a/project-templates/csharp/intraday-greeks-based-options-selection/Main.cs b/project-templates/csharp/intraday-greeks-based-options-selection/Main.cs index ed00b5fecf..1500fe2732 100644 --- a/project-templates/csharp/intraday-greeks-based-options-selection/Main.cs +++ b/project-templates/csharp/intraday-greeks-based-options-selection/Main.cs @@ -84,12 +84,10 @@ public override void Initialize() // The EMA/price cross will determine we trade ATM contracts _index = AddIndex("RUT"); - EMA(_index, 60).Updated += TradeTargetDeltaContract; - // Alternatively, use a manual indicator. - // var ema = new ExponentialMovingAverage(60); - // WarmUpIndicator(_index, ema); - // RegisterIndicator(_index, ema); - // ema.Updated += TradeTargetDeltaContract; + var ema = new ExponentialMovingAverage(60); + WarmUpIndicator(_index, ema); + RegisterIndicator(_index, ema); + ema.Updated += TradeTargetDeltaContract; _optionChainSymbol = QuantConnect.Symbol.CreateCanonicalOption(_index, "RUTW", Market.USA, "?RUTW"); _dividendYieldModel = new DividendYieldProvider(_index); @@ -98,8 +96,8 @@ public override void Initialize() public void TradeTargetDeltaContract(object sender, IndicatorDataPoint current) { // Pace trades every 10 minutes - var lastTrateTime = _lastTicket?.Time ?? DateTime.MinValue; - if ((UtcTime-lastTrateTime).TotalMinutes < 10) return; + var lastTradeTime = _lastTicket?.Time ?? DateTime.MinValue; + if ((UtcTime-lastTradeTime).TotalMinutes < 10) return; var ema = sender as ExponentialMovingAverage; if (!ema.IsReady) return; diff --git a/project-templates/python/intraday-greeks-based-options-selection/main.py b/project-templates/python/intraday-greeks-based-options-selection/main.py index 72c0473265..30ccd3914c 100644 --- a/project-templates/python/intraday-greeks-based-options-selection/main.py +++ b/project-templates/python/intraday-greeks-based-options-selection/main.py @@ -19,12 +19,10 @@ def initialize(self) -> None: # The EMA/price cross will determine we trade ATM contracts self._index = self.add_index("RUT") - self.ema(self._index, 60).updated += self._trade_target_delta_contract - # Alternatively, use a manual indicator. - # self._ema = ExponentialMovingAverage(60) - # self.warm_up_indicator(self._index, self._ema) - # self.register_indicator(self._index, self._ema) - # self._ema.updated += self._trade_target_delta_contract + self._ema = ExponentialMovingAverage(60) + self.warm_up_indicator(self._index, self._ema) + self.register_indicator(self._index, self._ema) + self._ema.updated += self._trade_target_delta_contract self._option_chain_symbol = Symbol.create_canonical_option(self._index, "RUTW", Market.USA, "?RUTW") self._dividend_yield_model = DividendYieldProvider(self._index) From ecef967216012aedd984600ec3f797edd2d1ff8e Mon Sep 17 00:00:00 2001 From: Rudy Osuna Date: Thu, 18 Jun 2026 13:40:20 -0700 Subject: [PATCH 6/7] Restore automatic EMA example --- .../intraday-greeks-based-options-selection/Main.cs | 11 ++++++----- .../intraday-greeks-based-options-selection/main.py | 11 ++++++----- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/project-templates/csharp/intraday-greeks-based-options-selection/Main.cs b/project-templates/csharp/intraday-greeks-based-options-selection/Main.cs index 1500fe2732..8c9c30e374 100644 --- a/project-templates/csharp/intraday-greeks-based-options-selection/Main.cs +++ b/project-templates/csharp/intraday-greeks-based-options-selection/Main.cs @@ -75,7 +75,6 @@ public override void Initialize() SetStartDate(2024, 9, 1); SetEndDate(2024, 9, 5); SetCash(500000); - // AutomaticIndicatorWarmUp only supports automatic indicators, not manual indicators. Settings.AutomaticIndicatorWarmUp = true; UniverseSettings.MinimumTimeInUniverse = TimeSpan.Zero; @@ -84,10 +83,12 @@ public override void Initialize() // The EMA/price cross will determine we trade ATM contracts _index = AddIndex("RUT"); - var ema = new ExponentialMovingAverage(60); - WarmUpIndicator(_index, ema); - RegisterIndicator(_index, ema); - ema.Updated += TradeTargetDeltaContract; + EMA(_index, 60).Updated += TradeTargetDeltaContract; + // To use a manual EMA instead, replace the automatic indicator above with: + // var ema = new ExponentialMovingAverage(60); + // WarmUpIndicator(_index, ema); + // RegisterIndicator(_index, ema); + // ema.Updated += TradeTargetDeltaContract; _optionChainSymbol = QuantConnect.Symbol.CreateCanonicalOption(_index, "RUTW", Market.USA, "?RUTW"); _dividendYieldModel = new DividendYieldProvider(_index); diff --git a/project-templates/python/intraday-greeks-based-options-selection/main.py b/project-templates/python/intraday-greeks-based-options-selection/main.py index 30ccd3914c..aca3e0b934 100644 --- a/project-templates/python/intraday-greeks-based-options-selection/main.py +++ b/project-templates/python/intraday-greeks-based-options-selection/main.py @@ -10,7 +10,6 @@ def initialize(self) -> None: self.set_start_date(2024, 9, 1) self.set_end_date(2024, 9, 5) self.set_cash(500000) - # automatic_indicator_warm_up only supports automatic indicators, not manual indicators. self.settings.automatic_indicator_warm_up = True self.universe_settings.minimum_time_in_universe = timedelta(0) @@ -19,10 +18,12 @@ def initialize(self) -> None: # The EMA/price cross will determine we trade ATM contracts self._index = self.add_index("RUT") - self._ema = ExponentialMovingAverage(60) - self.warm_up_indicator(self._index, self._ema) - self.register_indicator(self._index, self._ema) - self._ema.updated += self._trade_target_delta_contract + self.ema(self._index, 60).updated += self._trade_target_delta_contract + # To use a manual EMA instead, replace the automatic indicator above with: + # ema = ExponentialMovingAverage(60) + # self.warm_up_indicator(self._index, ema) + # self.register_indicator(self._index, ema) + # ema.updated += self._trade_target_delta_contract self._option_chain_symbol = Symbol.create_canonical_option(self._index, "RUTW", Market.USA, "?RUTW") self._dividend_yield_model = DividendYieldProvider(self._index) From edbd4e04ba6e6501a1ec5ac70352e5448d5e0c07 Mon Sep 17 00:00:00 2001 From: Rudy Osuna Date: Thu, 18 Jun 2026 13:41:53 -0700 Subject: [PATCH 7/7] Keep EMA subscription active --- .../csharp/intraday-greeks-based-options-selection/Main.cs | 4 ++-- .../python/intraday-greeks-based-options-selection/main.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/project-templates/csharp/intraday-greeks-based-options-selection/Main.cs b/project-templates/csharp/intraday-greeks-based-options-selection/Main.cs index 8c9c30e374..a2f6c91624 100644 --- a/project-templates/csharp/intraday-greeks-based-options-selection/Main.cs +++ b/project-templates/csharp/intraday-greeks-based-options-selection/Main.cs @@ -83,12 +83,12 @@ public override void Initialize() // The EMA/price cross will determine we trade ATM contracts _index = AddIndex("RUT"); - EMA(_index, 60).Updated += TradeTargetDeltaContract; + var ema = EMA(_index, 60); // To use a manual EMA instead, replace the automatic indicator above with: // var ema = new ExponentialMovingAverage(60); // WarmUpIndicator(_index, ema); // RegisterIndicator(_index, ema); - // ema.Updated += TradeTargetDeltaContract; + ema.Updated += TradeTargetDeltaContract; _optionChainSymbol = QuantConnect.Symbol.CreateCanonicalOption(_index, "RUTW", Market.USA, "?RUTW"); _dividendYieldModel = new DividendYieldProvider(_index); diff --git a/project-templates/python/intraday-greeks-based-options-selection/main.py b/project-templates/python/intraday-greeks-based-options-selection/main.py index aca3e0b934..c47840298e 100644 --- a/project-templates/python/intraday-greeks-based-options-selection/main.py +++ b/project-templates/python/intraday-greeks-based-options-selection/main.py @@ -18,12 +18,12 @@ def initialize(self) -> None: # The EMA/price cross will determine we trade ATM contracts self._index = self.add_index("RUT") - self.ema(self._index, 60).updated += self._trade_target_delta_contract + ema = self.ema(self._index, 60) # To use a manual EMA instead, replace the automatic indicator above with: # ema = ExponentialMovingAverage(60) # self.warm_up_indicator(self._index, ema) # self.register_indicator(self._index, ema) - # ema.updated += self._trade_target_delta_contract + ema.updated += self._trade_target_delta_contract self._option_chain_symbol = Symbol.create_canonical_option(self._index, "RUTW", Market.USA, "?RUTW") self._dividend_yield_model = DividendYieldProvider(self._index)