Skip to content

openpitkit/pit

Repository files navigation

OpenPit: Pre-trade Integrity Toolkit

Pit

Verify Release License Go version Module Python versions PyPI Rust crates.io C API

OpenPit is a workspace for embeddable pre-trade risk components. Before an order reaches a venue, it passes through a deterministic risk pipeline that can reject the request, reserve state, and later absorb post-trade outcomes back into the same control system.

How The Flow Works

  1. The engine is configured once during platform initialization.
  2. Each order first goes through lightweight start-stage checks. This stage makes fast decisions and runs controls that must observe every request, including rejected ones.
  3. If the order passes the start stage, the caller receives a deferred request object. The heavier pre-trade stage has not run yet.
  4. When the deferred request is executed, the engine runs the main-stage risk policies and collects all registered mutations. If any policy rejects, the collected state is rolled back. If the stage succeeds, the caller receives a reservation. The shortcut engine.execute_pre_trade(order) composes the two stages into one call when manual request handling is not needed.
  5. The reservation must be finalized explicitly: commit keeps the reserved state, rollback cancels it. Dropping the reservation without finalization rolls it back automatically.
  6. Post-trade reports are fed back into the engine so policies that depend on realized outcomes can update their state.

Current Scope

The current implementation focuses on the pre-trade pipeline, a small set of built-in controls, and an API for building project-specific strategy and risk policies. Built-ins:

  • P&L kill switch
  • sliding-window rate limit
  • per-settlement order size limits

Custom policies that maintain state across calls can use the built-in Storage abstraction. Synchronization is selected once at engine construction and applied transparently, with no overhead in single-threaded embeddings.

The engine is intentionally in-memory and deterministic, designed to be embedded into a larger trading system rather than replace one. For custom policy APIs:

Versioning Policy (Pre‑1.0)

Before the 1.0 release OpenPit follows a relaxed Semantic Versioning:

  • PATCH releases carry bug fixes and small internal corrections.
  • MINOR releases may introduce new features and may also change the public interface.

Breaking API changes can appear in minor releases before 1.0. Pick version constraints that tolerate API evolution during the pre-stable phase.

Where To Start

Local Build And Test

Prerequisites

  • Rust toolchain
  • Python >=3.10 if you build or test Python bindings
  • maturin and pytest if you build or test Python bindings
  • Go 1.22 if you build or test Go bindings
python3 -m venv .venv
source .venv/bin/activate
pip install -r ./requirements.txt

Build

SDK

With Just:

just build

Manual:

cargo build --workspace

Python

With Just:

just python-develop
just python-develop-release

Manual:

maturin develop --manifest-path bindings/python/Cargo.toml
maturin develop --release --manifest-path bindings/python/Cargo.toml

The recommended Python test flow is to run maturin develop before pytest. This runs against the current checkout (including a dirty worktree).

Go

The Go SDK consumes the native runtime through CGo. Build the FFI library first:

cargo build -p openpit-ffi --release --locked

Go tests then expect the path to that library through OPENPIT_RUNTIME_LIBRARY_PATH. The variable is needed only for local development inside the pit repository - consumers installing the SDK with go get do not need to set it.

Tests

With Just:

# All tests:
just test-all

# Rust:
just test-rust

# Python:
just test-python
just test-python-unit
just test-python-integration

# Go:
just test-go
just test-go-race

Manual:

# All tests:
cargo test --workspace
maturin develop --manifest-path bindings/python/Cargo.toml
python -m pytest bindings/python/tests

# Rust:
cargo test --workspace

# Python
maturin develop --manifest-path bindings/python/Cargo.toml
python -m pytest bindings/python/tests
python -m pytest bindings/python/tests/unit
python -m pytest bindings/python/tests/integration

# Go:
cargo build -p openpit-ffi --release --locked
cd bindings/go
# Linux:
export OPENPIT_RUNTIME_LIBRARY_PATH="$(pwd)/../../target/release/libopenpit_ffi.so"
# macOS: use libopenpit_ffi.dylib instead.
go test ./...
go test -race ./...