发布

  • 17849 27de93f78f

    Market orders wait for fresh data instead of filling on stale prices (#9535)

    frostbyte_neo 发布于 2026-06-18 14:59:19 +00:00 | 75 次提交 在此版本后已推送到 master

    • Market orders wait for fresh data instead of filling on stale prices

    A market order would previously fill immediately on the most recent
    available data even when that data was older than StalePriceTimeSpan
    (default one hour), only attaching a warning. This is unrealistic for a
    coarse resolution asset (hour/daily) where the latest bar is the stale
    previous close when the order is placed mid-bar or via an intraday
    scheduled event.

    The default fill models (FillModel, EquityFillModel, FutureFillModel) now
    wait for fresh data instead of filling on a stale price, but only for hour
    and daily resolutions; the order fills when the next bar closes. For
    minute/second/tick subscriptions the previous behavior is kept (fill on
    the stale price with a warning), since stale data there is a genuine gap
    rather than a bar still forming.

    Adds HourResolutionMarketOrderStalePriceRegressionAlgorithm, updates the
    FillOutsideHours daily expectation, and regenerates statistics for the
    hour/daily algorithms whose fills change. FutureOptionDaily buys and
    liquidates a day apart now (a same-day buy + liquidate cannot fill on
    daily data once stale fills are disabled).

    Co-Authored-By: Claude Opus 4.8 (1M context) noreply@anthropic.com

    • Normalize and correct StalePriceTimeSpan XML docs

    The interface and class docs now match and reflect the actual behavior:
    the wait-for-fresh-data only applies to hour/daily resolutions, while
    minute/second/tick subscriptions still fill on stale data with a warning.

    Co-Authored-By: Claude Opus 4.8 (1M context) noreply@anthropic.com

    • Fill resting market orders at the bar open instead of the close

    A hour/daily market order that was resting before the current bar opened
    (it predates the bar - placed after the previous close or while waiting
    for fresh data) now fills at the bar open, the price when trading resumed
    (like a MarketOnOpen), instead of the bar close. Orders placed during the
    bar still fill at the current/close price, so intraday mid-bar fills are
    unchanged. Equity fills are unchanged (resting equity orders are already
    converted to MarketOnOpen by QCAlgorithm.MarketOrder).

    Adds the shared FillModel.GetMarketFillPrice helper used by the base
    FillModel and FutureFillModel, a unit test, and regenerates statistics for
    the affected daily/hour futures, index and crypto regression algorithms
    (order counts unchanged, only fill prices).

    Co-Authored-By: Claude Opus 4.8 (1M context) noreply@anthropic.com

    • Add regression algorithm asserting resting market orders fill at the bar open

    RestingMarketOrderFillsAtBarOpenRegressionAlgorithm buys a daily future on the
    bar that delivers it (fills at that bar's close) and submits a liquidation while
    the market is closed (overnight pulse, no fresh bar). The liquidation rests and
    fills on a later bar at the bar open, not its close - asserting the new
    GetMarketFillPrice behavior. The in-bar buy is asserted to fill at the close, for
    contrast.

    Co-Authored-By: Claude Opus 4.8 (1M context) noreply@anthropic.com

    • Carry the bar start time on Prices instead of re-reading the cache

    Add Prices.Time (the bar start, mirroring BaseData.Time/EndTime), populated from
    the source bar/tick in every GetPrices path. GetMarketFillPrice now uses
    prices.Time directly instead of a second asset.Cache.GetData() lookup. Behavior
    is unchanged (prices.Time equals the previously read cache time).

    Co-Authored-By: Claude Opus 4.8 (1M context) noreply@anthropic.com

    • Add regression algorithm asserting in-session hour orders fill at the latest close

    HourMarketOrderFillsAtBarCloseRegressionAlgorithm submits an hour resolution
    market order mid-bar (via an intraday scheduled event) while the market is open,
    using the default one hour StalePriceTimeSpan. It asserts the order fills
    immediately at the latest available bar's close - not waiting and not at the bar
    open - since the latest bar is within the stale window. Guards the resting-order
    open-fill behavior against affecting ordinary in-session fills.

    Co-Authored-By: Claude Opus 4.8 (1M context) noreply@anthropic.com

    • Regenerate custom fill model algorithm statistics for the open-fill change

    CustomModelsAlgorithm and CustomPartialFillModelAlgorithm subscribe SPY at hour
    resolution and their custom fill models delegate to base.MarketFill, so resting
    orders now fill at the bar open. Regenerate their statistics (C#/Python) and the
    inline expected statistics of the PEP8StyleCustomModelsWork test.

    Co-Authored-By: Claude Opus 4.8 (1M context) noreply@anthropic.com


    Co-authored-by: Claude Opus 4.8 (1M context) noreply@anthropic.com

    下载附件