Architecture¶
Public architecture of OpenPit and its integration model.
Design Goals¶
Embeddable: no separate service, no network hop, no runtime requirementDeterministic: the same order, policy state, and policy set produce the same decisionFail-safe by default: unfinalized reservations roll back automaticallyFinancially precise: domain values use exact decimal semantics throughparamtypes
Public API Areas¶
Domain values: prices, quantities, pnl, cash flow, volume, side, leverage Go:openpit/paramPython:openpit.paramC++:openpit::paramRust:openpit::paramC:OpenPitParam*value handles and structsCore entities: order, execution report, account adjustment, instrument, engine Go: package rootopenpitPython: package root andopenpit.coreC++:openpit::modelandopenpit::EngineRust: crate root andopenpit::coreC:OpenPitOrder,OpenPitExecutionReport, andOpenPitEnginePre-trade pipeline: policies, rejects, requests, reservations, reports Go:openpit/pretradePython:openpit.pretradeC++:openpit::pretradeRust:openpit::pretradeC:OpenPitPretrade*handles and functions
Engine¶
Engine coordinates the public pre-trade lifecycle:
- Build an engine.
- Run the
start stage. - Execute the deferred request.
- Finalize the reservation.
- Apply post-trade feedback.
- Optionally validate non-trade operation (NTO) batches through
apply account adjustments.
Current engine behavior:
- Policy names must be unique across both stages.
- Threading capability of the engine handle follows from the chosen sync policy. See Threading Contract.
- A deferred request or reservation depends on the engine instance that created it.
- Account-adjustment batch validation is atomic: the first reject aborts the whole batch.
Order, Execution Report and Account Adjustment Contracts¶
OpenPit currently exposes public integration models for orders, execution reports, and non-trading account adjustments:
- C++ exposes fixed model value types and client-payload adapter templates:
openpit::model::Order,openpit::model::ExecutionReport, andopenpit::pretrade::StartPolicyAdapter/openpit::pretrade::PolicyAdapter. Adapter policies choose an explicit cast mode so dynamic-boundary checks are visible at the call site. - Go exposes fixed public model records plus generic policy interfaces for caller-defined payloads.
- Python exposes fixed public record models:
openpit.Order,openpit.ExecutionReport, andopenpit.AccountAdjustment. - Rust can evaluate caller-defined order and execution-report types directly
when they implement the required capability traits. Order traits include
HasTradeAmount,HasOrderPrice,HasInstrument, andHasSide. Report traits includeHasPnl,HasFee, andHasInstrument. Policies declare only the traits they actually use, so a policy that only inspects trade amount and price requiresO: HasTradeAmount + HasOrderPriceand is compatible with any order type that provides those two capabilities. - C exposes POD views and opaque handles for ABI-stable embedders.
All SDKs use the same staged flow and the same standard reject shape.
Language-specific custom-payload guidance is documented in the corresponding custom-type pages, for example Custom Cpp Types and Custom Rust Types.
Two-Stage Pipeline¶
OpenPit separates early admission checks from main-stage checks that may reserve state. The start stage stops at the first reject; the main stage evaluates every registered policy, aggregates rejects, and rolls back collected mutations if any reject is produced.
See Pre-trade Pipeline for the full lifecycle, return types, and code examples.
Account Adjustment Pipeline¶
Account adjustment validation runs as an atomic batch: deterministic
traversal by batch and policy registration order, first reject aborts,
all-or-nothing outcome.
See Account Adjustments for the data model and rollback rules.
State Changes¶
Main-stage policies do not finalize state directly. They emit Pre-trade mutation
pairs that the engine applies later.
Current public mutation kinds are:
- Reserve notional for a settlement asset
- Set a kill-switch state
Current Boundaries¶
OpenPit is intentionally narrow:
- It is a pre-trade engine, not an OMS or EMS.
- It does not provide persistence or external data sources.
- It does not provide venue connectivity.
- The current built-in policies are all
start stagepolicies.
Related Pages¶
- Getting Started: First engine construction
- Custom Rust Types: Capability traits and wrapper authoring
- Pre-trade Pipeline: Request and reservation lifecycle
- Account Adjustments: Non-trade operation (NTO) batch model and semantics
- Policies: Built-in controls and custom policy hooks
- Domain Types: Typed financial values used by the engine