History Data API
Note
⚠ Test Environment Limitation: The test environment does not include historical market data.
Fetch Historical Tick Data
The following example fetches historical tick data:
import asyncio
from datetime import datetime
from async_rithmic import RithmicClient
async def main():
client = RithmicClient(
user="",
password="",
system_name="Rithmic Test",
app_name="my_test_app",
app_version="1.0",
url="rituz00100.rithmic.com:443"
)
await client.connect()
# Fetch historical tick data
try:
ticks = await client.get_historical_tick_data(
"ESM5",
"CME",
datetime(2025, 5, 15, 15, 30),
datetime(2025, 5, 15, 15, 31),
)
except Exception as e:
print("An exception occurred", e)
await client.disconnect()
return
print(f"Received {len(ticks)} ticks")
print(f"Last tick timestamp: {ticks[-1]['datetime']}")
await client.disconnect()
asyncio.run(main())
By default, get_historical_tick_data() waits until the historical replay is
complete and returns the collected ticks as a list.
Rithmic may truncate historical replay responses. In practice, a single replay request can return at most about 10,000 ticks, even if the requested time range contains many more ticks.
To handle this, async_rithmic automatically paginates historical tick
requests. After each page, it uses the last received tick timestamp as the starting
point for the next request and continues until one of the following happens:
the requested
end_timeis reached;Rithmic returns no more data;
max_pagesis reached.
The max_pages argument controls how many replay pages can be requested.
The idle_timeout argument controls how long the client waits without seeing
progress while waiting for a historical replay to complete.
ticks = await client.get_historical_tick_data(
...,
max_pages=100,
idle_timeout=10.0,
)
This is an idle timeout, not a total request timeout. The timer resets whenever a tick or completion message is received.
If wait=False is passed, the method sends the replay request and returns
immediately. Historical ticks are still emitted through the
on_historical_tick callback.
async def callback(data):
print(f"Received data: {data}")
client.on_historical_tick += callback
Fetch Historical Time Bars
Fetch historical time bars for a symbol over a time range.
import asyncio
from datetime import datetime
from async_rithmic import RithmicClient, TimeBarType
async def main():
client = RithmicClient(
user="",
password="",
system_name="Rithmic Test",
app_name="my_test_app",
app_version="1.0",
url="rituz00100.rithmic.com:443"
)
await client.connect()
# Fetch historical time bar data
try:
bars = await client.get_historical_time_bars(
"ESM5",
"CME",
datetime(2025, 5, 15, 15, 30),
datetime(2025, 5, 15, 15, 31),
TimeBarType.SECOND_BAR,
6
)
except Exception as e:
print("An exception occurred", e)
await client.disconnect()
return
print(f"Received {len(bars)} bars")
print(f"Last bar timestamp: {bars[-1]['bar_end_datetime']}")
await client.disconnect()
asyncio.run(main())
By default, get_historical_time_bars() waits until the historical replay is
complete and returns the collected bars as a list.
Rithmic may truncate historical replay responses. In practice, a single replay request can return at most about 10,000 bars, even if the requested time range contains many more bars. For example, requesting several months of 1-minute bars may cover hundreds of thousands of bars, but Rithmic may only return the first page of results.
To handle this, async_rithmic automatically paginates historical time bar
requests. After each page, it uses the last received bar marker as the starting
point for the next request and continues until one of the following happens:
the requested
end_timeis reached;Rithmic returns no more data;
max_pagesis reached.
The max_pages argument controls how many replay pages can be requested.
The idle_timeout argument controls how long the client waits without seeing
progress while waiting for a historical replay to complete.
bars = await client.get_historical_time_bars(
...,
max_pages=100,
idle_timeout=10.0,
)
This is an idle timeout, not a total request timeout. The timer resets whenever a bar or completion message is received.
If wait=False is passed, the method sends the replay request and returns
immediately. Historical bars are still emitted through the
on_historical_time_bar callback.
async def callback(data):
print(f"Received data: {data}")
client.on_historical_time_bar += callback