* Seed runtime-added currency conversion rates immediately
Fixes the spurious 'The conversion rate for <currency> is not available'
runtime error caused by a two-path seeding asymmetry.
The setup path (BaseSetupHandler.SetupCurrencyConversions) wires up a
currency's conversion feed AND seeds its rate via history/last-known-price
so the rate is non-zero right away. The runtime path
(UniverseSelection.EnsureCurrencyDataFeeds, invoked during universe
selection / SetCash mid-run) only created the conversion subscription and
left the rate at 0 until the first bar of the pair arrived. Any conversion
in that gap (classically a midnight scheduled SetHoldings firing before the
day's first conversion-pair bar) threw.
EnsureCurrencyDataFeeds now seeds newly introduced, still-zero-rate
conversion securities and calls cash.Update(), mirroring the setup path.
Seeding is gated behind a seedNewCurrencies flag (default true) so the
setup caller, which performs its own optionally white-listed seeding, can
opt out and not regress white-list semantics. SeedSecurities degrades
gracefully when no history/data is available, leaving the rate at 0 as
before, so live mode and no-history scenarios are safe.
Adds a regression test exercising the runtime path.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* Make runtime currency seeding robust and fix regression expectation
CI failures from the runtime currency-conversion seeding change:
1. AlgorithmWarmupTests.WarmUpInternalSubscriptions threw
ArgumentNullException because the new EnsureCurrencyDataFeeds seeding
path ran GetLastKnownPrices in a stub where the conversion security
lacked SymbolProperties. Pre-seeding is best-effort and must never
break the algorithm, so wrap it in try/catch and degrade gracefully
(leave the rate at 0, the pre-fix behavior) - matching the documented
intent. The first conversion-pair bar still updates the rate.
2. ScheduledUniverseSelectionModelRegressionAlgorithm (C# + Python)
asserted AlgorithmHistoryDataPoints == 0. The algorithm runtime-adds
Forex pairs (EURGBP -> GBP cash) via scheduled universe selection;
the fix now correctly seeds that runtime currency's conversion rate
with a last-known-price history request (deterministically 50 points).
The old 0 reflected the buggy unseeded behavior, so update the
expectation to 50. No other statistics changed.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* Seed runtime added currency conversion rates
* Seed currencies with no new conversion feed and dedup the seeding helper
---------
Co-authored-by: Martin-Molinero <Martin-Molinero@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Build & Test Lean / build (push) Has been cancelled
Regression Tests / build (push) Has been cancelled
API Tests / build (push) Has been cancelled
Benchmarks / build (push) Has been cancelled
Report Generator Tests / build (push) Has been cancelled
Research Regression Tests / build (push) Has been cancelled
Syntax Tests / build (push) Has been cancelled
Python Virtual Environments / build (push) Has been cancelled
* Add SeedInitialPrices algorithm setting
This is true by default and indicates that the engine will seed initial prices right after the security is added or selected
* Update regression algorithms
* Update regression algorithms
* Update regression algorithms
* Refactor default securities seeding
* Minor fix
* Minro fixes
* Cleanup
* Updated and add regression algorithms
* Address peer review
* Centralize logic to get last known data for multiple securities
* Some cleanup
* Minor build fix
* Minor fixes
* More logic centralization
* Some more cleanup
* Cleanup
* Update regression algorithms and minor fixes
* Update regression algorithms
* Minor fix
* More minor fixes
* Update regression algorithms
* Cleanup
* Minor test fix
* Address peer review
* Minor fix and performance improvement
* Fix to seed open interest data
* Minor test fixes
* Address peer review
* Minor change
* Minor revert
* Minor fixes and improvements
* Disable initial seeding by default
* Minor fixes
* Cleanup
* Cleanup
* Minor fix