- Solve real problems with our hands-on interface
- Progress from basic puts and calls to advanced strategies

Posted October 21, 2025 at 11:15 am
The article “Market Halts, Volatility Interrupts, and Price Bands” was originally published on Databento.
Venues implement different types of market integrity controls to ensure a fair and efficient market. Some of these controls will limit how far price can move in one session, as well as how much price can move in a short period of time. When these events are triggered, it can result in a temporary halt in trading or quoting.
CME Globex has Velocity Logic, which prevents price from moving too far, too fast. During Velocity Logic, an instrument will transition to a “Pre-Open” state. While this state is normally seen before the full session open for CME Globex, it is also seen during these events. At the end of the event, the instrument will transition back to an “Open” state.
On 2025-04-09, a tariff pause announcement was made that led to significantly increased volatility on CME Globex. Multiple Velocity Logic events were triggered in Equity Index futures following the announcement.
In this example, we’ll take a look at just one of the Velocity Logic events after the announcement. We’ll use the status schema to show the changes in market state during this event. Next, we’ll plot the BBO and trades from the MBP-1 schema to show how quoting and trading were affected. Additionally, we’ll use the statistics schema to show some exchange generated statistics.
import databento as db
import matplotlib.pyplot as plt
# Create historical client
client = db.Historical("YOUR_API_KEY")
# Set parameters
dataset = "GLBX.MDP3"
product = "NQ"
start = "2025-04-09T17:18:40"
end = "2025-04-09T17:18:55"
# Request status data and convert to DataFrame
status_data = client.timeseries.get_range(
dataset=dataset,
schema="status",
start=start,
end=end,
symbols=f"{product}.v.0",
stype_in="continuous",
)
status_df = status_data.to_df()
status_df = status_df[status_df["action"].isin([db.StatusAction.PRE_OPEN, db.StatusAction.TRADING])]
status_df["action"] = status_df["action"].map({
db.StatusAction.PRE_OPEN: "Pre-Open",
db.StatusAction.TRADING: "Open",
})
def add_status_vlines(ax):
for status_change in status_df.iterrows():
ax.axvline(status_change[0], color="dimgray", linestyle=":", linewidth=1.5)
ax.text(
status_change[0],
ax.get_ylim()[1],
status_change[1]["action"],
color="dimgray",
ha="center",
)
# Request MBP-1 data and convert to DataFrame
mbp1_data = client.timeseries.get_range(
dataset=dataset,
schema="mbp-1",
start=start,
end=end,
symbols=f"{product}.v.0",
stype_in="continuous",
)
mbp1_df = mbp1_data.to_df()
mbp1_df = mbp1_df.rename(columns={"bid_px_00": "Bid", "ask_px_00": "Ask"})
# Request statistics data and convert to DataFrame
stats_data = client.timeseries.get_range(
dataset=dataset,
schema="statistics",
start=start,
end=end,
symbols=f"{product}.v.0",
stype_in="continuous",
)
stats_df = stats_data.to_df()
stats_df = stats_df[stats_df["stat_type"] == db.StatType.INDICATIVE_OPENING_PRICE]
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10.9, 10.9), sharey=True)
# Plot trades
trades_df = mbp1_df[mbp1_df["action"] == db.Action.TRADE]
trades_df["price"].plot(
ax=ax1,
style=".",
markersize=5,
color="C4",
xlabel="Time (UTC)",
ylabel="Price",
label="Trades",
title=f"{product} Trades",
)
add_status_vlines(ax1)
ax1.legend()
# Plot top of book data with Indicative Opening Price
mbp1_df[["Bid", "Ask"]].plot(ax=ax2, drawstyle="steps-post")
add_status_vlines(ax2)
stats_df["price"].plot(
ax=ax2,
style=".",
markersize=10,
color="C2",
xlabel="Time (UTC)",
ylabel="Price",
label="IOP",
title=f"{product} Top of Book",
)
ax2.legend()
plt.tight_layout()
plt.show()In this first plot, you’ll see how trading activity will temporarily halt when the market transitions to a Pre-Open state during Velocity Logic.
The second plot takes a look at the BBO. While quoting is still allowed during these events, the bid-ask spread can become crossed.
During these Pre-Open states, the exchange publishes a statistic called the Indicative Opening Price, also known as the “IOP”. This statistic, which can be updated multiple times during a Pre-Open state, provides the most probable price that trading will resume at when the market transitions back to an Open state.
When the market transitions back to an Open state, the bid-ask spread will uncross, and trading will resume.

Source: Databento
Information posted on IBKR Campus that is provided by third-parties does NOT constitute a recommendation that you should contract for the services of that third party. Third-party participants who contribute to IBKR Campus are independent of Interactive Brokers and Interactive Brokers does not make any representations or warranties concerning the services offered, their past or future performance, or the accuracy of the information provided by the third party. Past performance is no guarantee of future results.
This material is from Databento and is being posted with its permission. The views expressed in this material are solely those of the author and/or Databento and Interactive Brokers is not endorsing or recommending any investment or trading discussed in the material. This material is not and should not be construed as an offer to buy or sell any security. It should not be construed as research or investment advice or a recommendation to buy, sell or hold any security or commodity. This material does not and is not intended to take into account the particular financial conditions, investment objectives or requirements of individual customers. Before acting on this material, you should consider whether it is suitable for your particular circumstances and, as necessary, seek professional advice.
Futures are not suitable for all investors. The amount you may lose may be greater than your initial investment. Before trading futures, please read the CFTC Risk Disclosure. A copy and additional information are available at ibkr.com.
Please keep in mind that the examples discussed in this material are purely for technical demonstration purposes, and do not constitute trading advice. Also, it is important to remember that placing trades in a paper account is recommended before any live trading.
Join The Conversation
For specific platform feedback and suggestions, please submit it directly to our team using these instructions.
If you have an account-specific question or concern, please reach out to Client Services.
We encourage you to look through our FAQs before posting. Your question may already be covered!