Webull Integration, Backtest Analysis, New Algorithm Statuses

These are the LEAN release notes for versions 17674 to 17685. We improved our CI and stub-generation pipeline by switching discovery to the GitHub REST API, parallelizing discovery, running it in-container, auto-detecting datasource repos, and tightening when full stubs discovery runs and how it authenticates. We also made object store API tests self-contained, reduced flaky failures by removing regex timeout validation, and ensured schedule universes consistently run at 8am New York time.

We shipped several platform enhancements, including richer backtest reporting by adding structured Analysis data to the backtest packet and a backtest-only ResultsAnalyzer that appends human-readable summaries. We expanded algorithm state modeling with new PendingInput and Idle statuses, enhanced SwissArmyKnife by exposing all tools as sub-indicators, and added Webull core brokerage integration.

We broadened market and data correctness with improved primary exchange detection for additional equity tape letters, new NASDAQ_SC/NASDAQ_INT mappings, safer options Greeks theta annualization, better OSI option parsing, cleaner daily QuoteBar subscriptions, improved downloader no-data warnings, Binance futures collateral aggregation for EU buying power, and a configurable CFD contract multiplier at runtime.

Thank you 0xpinara and aiSynergy37 for refactoring SwissArmyKnife into sub-indicators and adding Python dict header support to SubscriptionDataSource with validation and tests—exciting progress!

Features

  • Shipped (#9422): feature: recognise equity tape letters S/V/H/U and add NASDAQ_SC: We updated 'GetPrimaryExchange' to recognize S/V/H/U tape letters, added 'NASDAQ_SC'/'NASDAQ_INT', fixed MEMX description, and expanded tests.
  • Shipped (#9375): Add Analysis to Backtest packet: We added analysis data to the backtest packet, enabling richer, structured backtest result reporting.
  • Shipped (#9374): Add new "Idle" AlgorithmStatus: We added a new “Idle” value to the AlgorithmStatus enum to represent inactive algorithm states more precisely.
  • Shipped (#9370): Add all tools as sub-indicators to SwissArmyKnife: We refactored SwissArmyKnife to compute all tools simultaneously, exposing each as sub-indicators while keeping Current.Value compatible.
  • Shipped (#9367): Add PendingInput algorithm status: We added a 'PendingInput' algorithm status to represent algorithms waiting for external input.
  • Shipped (#9363): Add Python dict headers overload to SubscriptionDataSource: We added SubscriptionDataSource overload for Python dict headers, validating types, converting to managed key-value pairs, and testing inputs.
  • Shipped (#9356): feature: add webull brokerage core integration: We added Webull core integration: brokerage enum, model/fee implementations, factory/config wiring, and comprehensive order/fee tests.
  • Shipped (#9336): Results analyzer: We implemented a backtest-only ResultsAnalyzer to summarize key results into human-readable messages appended to the results file.
  • Shipped (#9328): Add ContractMultiplier setter to Cfd via CfdSymbolProperties: We added a runtime setter for CFD ContractMultiplier via CfdSymbolProperties, enabling user corrections; validated with unit tests.

Bug Fixes

  • Fixed issue (#9434): We switched to GitHub REST API, parallelized discovery, ran in-container.
  • Fixed issue (#9433): We run stubs repo discovery only on tag-of-master builds.
  • Fixed issue (#9432): We use QC_GIT_TOKEN for full stubs repo discovery.
  • Fixed issue (#9427): We ensured schedule universes always run 8am NY, tested.
  • Fixed issue (#9420): We made object store API tests self-contained via CI uploads.
  • Fixed issue (#9399): We removed regex timeout validation to prevent race-condition failures.
  • Fixed issue (#9379): We prevent invalid daily QuoteBar subscriptions, eliminating log spam.
  • Fixed issue (#9373): We add Binance futures BNFCR collateral aggregation for EU buying power.
  • Fixed issue (#9368): We improved Python dictionary null-key behavior to match CPython.
  • Fixed issue (#9348): We added Greeks.GetSafeTheta to annualize theta without overflow errors.
  • Fixed issue (#9343): We fixed OSI option parsing for tickers with dots.

Updates

  • Fixed issue (#9430): We auto-detect datasource repos for CI stub generation.
  • Fixed issue (#9344): We warn when downloader returns no data for date range.
  • Fixed issue (#9337): We removed deprecated OAuth base classes, standardizing on concrete handlers.