Python ctypes binding for the Orderflow C API
Project description
Orderflow Python Binding (orderflow-gregorian09)
Production-focused Python API for the Orderflow runtime.
This package wraps the stable of_ffi_c ABI via ctypes and provides a typed,
high-level interface for lifecycle management, subscriptions, snapshots, and
external feed ingestion.
The README is intentionally API-complete so the PyPI page can be used as a single reference, similar to high-signal package pages such as TA-Lib and FastAPI.
Architecture
Installation
pip install orderflow-gregorian09
Python support
- Python 3.10+
Native runtime requirement
The Python package is a wrapper. A compatible libof_ffi_c shared library must
be available at runtime.
Library resolution order:
library_path=passed toEngine(...)ORDERFLOW_LIBRARY_PATHenvironment variable- default local debug path (
target/debug/libof_ffi_c.*)
export ORDERFLOW_LIBRARY_PATH=/absolute/path/to/libof_ffi_c.so
Quick Start
from orderflow import DataQualityFlags, Engine, EngineConfig, Symbol, StreamKind
with Engine(EngineConfig(instance_id="py-client")) as eng:
sym = Symbol("CME", "ESM6", depth_levels=10)
eng.subscribe(sym, StreamKind.ANALYTICS)
eng.poll_once(DataQualityFlags.NONE)
print("api_version", eng.api_version)
print("build_info", eng.build_info)
print("analytics", eng.analytics_snapshot(sym))
print("derived", eng.derived_analytics_snapshot(sym))
print("signal", eng.signal_snapshot(sym))
print("metrics", eng.metrics())
Public API Reference
Constants
StreamKind
| Name | Value | Meaning |
|---|---|---|
BOOK |
1 | Level-2 book update stream |
TRADES |
2 | Trade print stream |
ANALYTICS |
3 | Analytics snapshot stream |
SIGNALS |
4 | Signal snapshot stream |
HEALTH |
5 | Health transition stream |
BOOK_SNAPSHOT |
6 | Materialized book snapshot stream after book changes |
DERIVED_ANALYTICS |
7 | Derived analytics stream after trade-driven analytics changes |
Side
| Name | Value | Meaning |
|---|---|---|
BID |
0 | Bid / buy side |
ASK |
1 | Ask / sell side |
BookAction
| Name | Value | Meaning |
|---|---|---|
UPSERT |
0 | Insert or update price level |
DELETE |
1 | Delete price level |
DataQualityFlags
| Name | Value | Meaning |
|---|---|---|
NONE |
0 |
No quality issues |
STALE_FEED |
1 << 0 |
Feed became stale |
SEQUENCE_GAP |
1 << 1 |
Sequence gap detected |
CLOCK_SKEW |
1 << 2 |
Clock skew detected |
DEPTH_TRUNCATED |
1 << 3 |
Depth truncation occurred |
OUT_OF_ORDER |
1 << 4 |
Out-of-order sequence detected |
ADAPTER_DEGRADED |
1 << 5 |
Adapter/feed degraded |
Exceptions
| Exception | Purpose |
|---|---|
OrderflowError |
Base binding/runtime failure |
OrderflowStateError |
Invalid lifecycle/state transition |
OrderflowArgError |
Invalid argument passed to native API |
Data Classes
Symbol(venue: str, symbol: str, depth_levels: int = 10)
- venue/instrument descriptor used by subscribe/snapshot/ingest APIs.
EngineConfig(...)
EngineConfig fields:
| Field | Type | Default | Notes |
|---|---|---|---|
instance_id |
str |
"python" |
Runtime instance id |
config_path |
str |
"" |
Optional runtime config file path |
log_level |
int |
0 |
Reserved log-level field |
enable_persistence |
bool |
False |
Enable local persistence |
audit_max_bytes |
int |
10*1024*1024 |
Per-file audit size before rotation |
audit_max_files |
int |
5 |
Number of rotated audit files |
audit_redact_tokens_csv |
str |
"secret,password,token,api_key" |
Redaction tokens |
data_retention_max_bytes |
int |
10*1024*1024 |
Persistence retention limit |
data_retention_max_age_secs |
int |
7*24*60*60 |
Max retention age |
ExternalFeedPolicy(stale_after_ms: int = 15000, enforce_sequence: bool = True)
- external ingest supervision policy for stale and sequence validation.
Engine API
Constructor and properties
| Signature | Description |
|---|---|
Engine(config: EngineConfig, library_path: Optional[str] = None) |
Creates native engine handle |
engine.api_version -> int |
Returns native ABI version |
engine.build_info -> str |
Returns native build descriptor |
Lifecycle and session
| Signature | Description |
|---|---|
start() -> None |
Starts runtime |
stop() -> None |
Stops runtime |
close() -> None |
Unsubscribes and destroys native handle |
context-manager (with Engine(...)) |
Calls start() / close() automatically |
Subscription and polling
| Signature | Description |
|---|---|
subscribe(symbol, stream_kind=StreamKind.ANALYTICS, callback=None) |
Registers stream subscription with optional callback |
unsubscribe(symbol) |
Unsubscribes all streams for symbol |
poll_once(quality_flags=DataQualityFlags.NONE) |
Drains adapter/runtime once |
reset_symbol_session(symbol) |
Resets per-symbol session/profile state |
External feed supervision
| Signature | Description |
|---|---|
configure_external_feed(policy) |
Sets stale/sequence policy |
set_external_reconnecting(reconnecting) |
Marks reconnect/degraded state |
external_health_tick() |
Re-evaluates stale status without ingest |
External ingest
| Signature | Description |
|---|---|
ingest_trade(symbol, price, size, aggressor_side, sequence=0, ts_exchange_ns=0, ts_recv_ns=0, quality_flags=DataQualityFlags.NONE) |
Injects one external trade |
ingest_book(symbol, side, level, price, size, action=BookAction.UPSERT, sequence=0, ts_exchange_ns=0, ts_recv_ns=0, quality_flags=DataQualityFlags.NONE) |
Injects one external book update |
Snapshots and metrics
| Signature | Description | Return |
|---|---|---|
book_snapshot(symbol) |
Current book snapshot | dict[str, Any] |
analytics_snapshot(symbol) |
Current analytics snapshot | dict[str, Any] |
derived_analytics_snapshot(symbol) |
Current derived analytics snapshot | dict[str, Any] |
session_candle_snapshot(symbol) |
Current session candle snapshot | dict[str, Any] |
interval_candle_snapshot(symbol, window_ns) |
Current rolling interval candle snapshot | dict[str, Any] |
signal_snapshot(symbol) |
Current signal snapshot | dict[str, Any] |
metrics() |
Runtime metrics | dict[str, Any] |
book_snapshot(symbol) returns a dictionary with:
venuesymbolbidsaskslast_sequencets_exchange_nsts_recv_ns
The Python wrapper retries automatically if the native snapshot payload is larger than the initial buffer.
session_candle_snapshot(symbol) returns a dictionary with:
openhighlowclosetrade_countfirst_ts_exchange_nslast_ts_exchange_ns
interval_candle_snapshot(symbol, window_ns) returns a dictionary with:
window_nsopenhighlowclosetrade_counttotal_volumevwapfirst_ts_exchange_nslast_ts_exchange_ns
Usage Patterns
Poll-only flow (no callback)
from orderflow import DataQualityFlags, Engine, EngineConfig, Symbol, StreamKind
with Engine(EngineConfig(instance_id="poll-only")) as eng:
sym = Symbol("CME", "ESM6", 10)
eng.subscribe(sym, StreamKind.ANALYTICS, callback=None)
eng.poll_once(DataQualityFlags.NONE)
snap = eng.analytics_snapshot(sym)
print("delta", snap.get("delta"))
Callback flow
from orderflow import Engine, EngineConfig, Symbol, StreamKind
def on_analytics(ev: dict) -> None:
print("analytics event:", ev)
with Engine(EngineConfig(instance_id="cb-flow")) as eng:
sym = Symbol("CME", "ESM6", 10)
eng.subscribe(sym, StreamKind.ANALYTICS, callback=on_analytics)
eng.poll_once()
External ingest + quality gating
from orderflow import (
BookAction,
DataQualityFlags,
Engine,
EngineConfig,
ExternalFeedPolicy,
Side,
Symbol,
StreamKind,
)
sym = Symbol("BINANCE", "BTCUSDT", depth_levels=20)
with Engine(EngineConfig(instance_id="external-ingest")) as eng:
eng.configure_external_feed(
ExternalFeedPolicy(stale_after_ms=2_000, enforce_sequence=True)
)
eng.subscribe(sym, StreamKind.HEALTH, callback=lambda ev: print("health:", ev))
eng.ingest_book(sym, Side.BID, 0, 62500000, 1000, BookAction.UPSERT, sequence=1)
eng.ingest_trade(sym, 62510000, 200, Side.ASK, sequence=2)
eng.poll_once(DataQualityFlags.NONE)
Operational Notes
- callbacks fire during
poll_once(...)andingest_*calls. - callback handlers should remain non-blocking.
- snapshot APIs decode runtime JSON and return Python
dict. OrderflowStateError("engine is closed")meansclose()was already called.
Troubleshooting
FileNotFoundError: Orderflow shared library not found
- build native runtime (
cargo build -p of_ffi_c) or provide explicit path. - verify
ORDERFLOW_LIBRARY_PATHpoints to the correct platform library.
OrderflowArgError from subscribe/ingest
- validate symbol fields (
venue,symbolnot empty). - validate enum-like integer constants (
Side,BookAction,StreamKind).
No callback events
- ensure subscription callback is not
None. - call
poll_once(...)regularly if using adapter-driven mode.
Documentation and Links
- Project docs: https://github.com/gregorian-09/orderflow/tree/main/docs
- Binding guide: https://github.com/gregorian-09/orderflow/tree/main/docs/bindings/python.md
- Handbook: https://github.com/gregorian-09/orderflow/tree/main/docs/handbook
- Changelog: https://github.com/gregorian-09/orderflow/blob/main/CHANGELOG.md
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file orderflow_gregorian09-0.2.0.tar.gz.
File metadata
- Download URL: orderflow_gregorian09-0.2.0.tar.gz
- Upload date:
- Size: 14.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0c32caa53814b6d54ce02b541ce3bf50c297d12add42510bd58079ee7a78960a
|
|
| MD5 |
3687ef852399645d05730d1d2cb50595
|
|
| BLAKE2b-256 |
728c9725e6f1a76ed58358029b8e89186e03e1e5f6597f8c7238a27726b7fd29
|
File details
Details for the file orderflow_gregorian09-0.2.0-py3-none-any.whl.
File metadata
- Download URL: orderflow_gregorian09-0.2.0-py3-none-any.whl
- Upload date:
- Size: 12.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5bb4cd9ff8405791dba429c132581c0e36934a0f3f94d1f91319d0a02e362338
|
|
| MD5 |
cd12e6e172e4607b57ec949a43891a41
|
|
| BLAKE2b-256 |
47688801ba9ff5d6c6d10b3e7f42cf4f51a0d706c26f73f678cf124e7534e752
|