All notable changes to flashalpha-quantconnect are documented in this file.
The format follows Keep a Changelog and the project adheres to Semantic Versioning.
No changes yet.
FlashAlphaSource.Forshifts midnight-UTC dates to 20:00 UTC (16:00 ET, NYSE close) before calling the API. v0.1.5 still passed LEAN's daily-resolution timestamp (midnight UTC) straight through to FlashAlpha. The API only has market-hours data, so every daily-res request returned NoDataError → empty file → LEAN skipped the bar. Algorithms got 0 trades despite the bridge working. Now midnight-UTC dates are silently shifted to the session close; non-midnight times pass through unchanged so intraday subscriptions still get exactly what they asked for. Same fix in C# and Python.
FlashAlphaSource.Fornow writes the JSON payload to a temp file and returns aLocalFiletransport, instead of a customflashalpha://sentinel URL. v0.1.4'sResttransport with a custom-scheme URL fell over inside LEAN — itsRestSubscriptionStreamReaderactually HTTP-fetches the URL it's handed and rejected the unknown scheme withSystem.NotSupportedException: The 'flashalpha' scheme is not supported. LEAN'sReaderwas never called. The source now writes a single-line JSON file under the OS tempdir per(endpoint, ticker, date)and returnsSubscriptionTransportMedium.LocalFile; LEAN's standard line-by-line reader hands the full JSON toReaderas thelineargument in one call. Same fix in C# and Python. Caught by V8 Tier 2 smoke against bridge v0.1.4.
0.1.4 — 2026-06-02
FlashAlphaSource.Fornow catches sparse-data exceptions and returns null bars instead of erroring out. Sparse data is the expected case for LEAN custom-data subscriptions — weekends, holidays, pre-RTH midnight ticks on Daily resolution, dates without coverage, etc. v0.1.3 propagatedNoDataError/NoCoverageError/InvalidAtErrorstraight from the SDK, which caused LEAN's data feed worker to abort the entire subscription (manifesting asSequence contains no elementson backtest completion). The source now catches those three exception types and caches an empty payload, soParsereturns null and LEAN skips the bar cleanly. The algorithm waits for the next session, no error surfaces. Caught by V8 Tier 2 smoke after v0.1.3 — LEAN's daily-resolution subscription callsForwithdate=midnight UTC, but the FlashAlpha API only has data at market-hours timestamps. Same fix shipped to C# (FlashAlphaSource.cs) and Python (data.source.source_for).
0.1.3 — 2026-06-02
SubscriptionTransportMediumimport path corrected. v0.1.2 fixed half the original bug — movedSubscriptionDataSourceto its correct namespaceQuantConnect.Data. ButSubscriptionTransportMediumis inQuantConnect(the parent), notQuantConnect.Data. Same silent-no-trades failure mode as v0.1.1. Fix splits the import:from QuantConnect import SubscriptionTransportMedium+from QuantConnect.Data import SubscriptionDataSource, FileFormat. Caught by re-running the gamma-scalping Tier 2 smoke after the v0.1.2 bump inflashalpha-historical-examples.
0.1.2 — 2026-06-01
data.source.source_forimport path corrected. v0.1.1 importedSubscriptionDataSourcefromQuantConnectdirectly — but in LEAN's runtime Python it lives atQuantConnect.Data.SubscriptionDataSource. Every Python consumer hitcannot import name 'SubscriptionDataSource' from 'QuantConnect' (unknown location)on the first bar subscription, which caused LEAN's data feed worker to silently drop the subscription. Algorithms would run to completion with 0 trades + flat equity, leaving the failure undetectable without inspecting LEAN's TRACE logs. Caught by Tier 2 smoke validation of the gamma-scalping essay inflashalpha-historical-examples; the fix is a one-liner consolidating the imports underQuantConnect.Data.
0.1.1 — 2026-05-30
FlashAlphaJsonMapper(C#) anddata.source.parse(Python) no longer overwrite inherited LEAN properties from the JSON. Previously the snake-case auto-mapper would walk every public property on the bar — including inheritedBaseData.Symbol/PythonData.Symbol— and try to set them from JSON keys like"symbol":"SPY". In C# this threwJsonException("could not convert toQuantConnect.Symbol") at the very first parse; in Python it silently clobbered the QC Symbol object with the raw ticker string. The mapper now walks only attributes declared on the bar subclass (and any non-QuantConnect.*ancestors), so LEAN-owned surface is left alone. Caught by running v0.1.0 as a real NuGet consumer — surfaces on the firstFlashAlphaSource.Parseagainst the live API.
0.1.0 — 2026-05-30
Initial public release. The bridge ships with full coverage of the FlashAlpha historical API surface as native QuantConnect LEAN custom-data bars, for both C# and Python.
- C# package
FlashAlpha.QuantConnect(NuGet). Targetsnetstandard2.0for LEAN compatibility. Pulls typed response models fromFlashAlpha.Historical >= 0.4.0so any upstream schema drift breaks at compile time. - Python package
flashalpha-quantconnect(PyPI). Requires Python 3.10+. Depends onflashalpha-historical >= 0.4.0rc1. - Seventeen custom-data bars, one per FlashAlpha historical endpoint family — GEX, DEX, VEX, CHEX, exposure summary, exposure levels, vol surface, zero-DTE, max pain, volatility, advanced volatility (SVI/variance-swap/greeks surfaces), VRP, narrative, stock summary, stock quote, option quote, and tickers (coverage). Each bar mirrors its SDK response model one-for-one — same field names, same nullability, same shape.
- Sugar extensions. C#
QCAlgorithmExtensions.AddFlashAlpha*methods onQCAlgorithm; Python module-leveladd_flashalpha_*helpers. One line per subscription,Resolution.Dailybaked in as the default. - Universe-selection helper
FlashAlphaTickersUniversein both languages. Backed by thetickersendpoint; takes a row-by-row predicate overTickersRow/dictso callers gate the universe on coverage span, healthy-day count, or any field the SDK exposes. Available without LEAN at construction time so unit tests can introspect the selected universe. FlashAlphaConfigstatic (C#) /flashalpha_quantconnect.configmodule (Python). API key resolution order: explicit override → QCGetParameter("flashalpha-api-key")→FLASHALPHA_API_KEYenv var → throwFlashAlphaAuthMissingException(error codeFA-AUTH-001).- Structured exceptions —
FlashAlphaAuthMissingException/FlashAlphaUnauthorizedException/FlashAlphaRateLimitedException/FlashAlphaNetworkException. Every exception carries a stableErrorCode(FA-AUTH-001/FA-AUTH-002/FA-RATE-001/FA-NET-001) that doubles as the anchor in docs/troubleshooting.md. Unauthorized exceptions log the last four characters of the key, never the full value. - Integration tests. Pytest + xUnit suites hitting live
historical.flashalpha.combehind aFLASHALPHA_API_KEYenv-var guard. - SDK drift guard. A CI job that pulls every typed-response field from the upstream
flashalpha-historicalSDK and asserts the corresponding bar declares the same property — so a silent SDK schema bump surfaces as a red CI run, not a silently corrupt bar at runtime. - Documentation corpus. Repo-root
README.mdwith side-by-side C# + Python examples,docs/getting-started.md,docs/data-types.md(per-bar field reference for all 17 endpoints),docs/auth.md,docs/troubleshooting.md, and fivedocs/recipes/*.mdcookbooks. llms.txtsite map per llmstxt.org.