Skip to main content

Python bindings for the Flox indicator library

Project description

flox-py

Python bindings for FLOX, a modular framework for building trading systems with polyglot strategy bindings and AI-friendly developer tools. Same strategy code goes from backtest to live without a rewrite step.

Install

pip install flox-py

Scaffold a new project

flox new my-strategy                                   # research scaffold (default)
flox new my-bot --template=live                        # live trading via CcxtBroker
flox new my-indicators --template=indicator-library    # publishable indicator package
flox templates                                         # list templates

flox new ships with the wheel; see docs/how-to/flox-new.md for what each template lays down.

Quick start

import flox_py as flox

registry = flox.SymbolRegistry()
btc = registry.add_symbol("binance", "BTCUSDT", tick_size=0.01)

class SMACross(flox.Strategy):
    def __init__(self, symbols):
        super().__init__(symbols)
        self.fast = flox.SMA(10)
        self.slow = flox.SMA(30)

    def on_trade(self, ctx, trade):
        f = self.fast.update(trade.price)
        s = self.slow.update(trade.price)
        if f is None or s is None:
            return
        if f > s and ctx.is_flat():
            self.market_buy(0.01)
        elif f < s and ctx.is_long():
            self.close_position()

def on_signal(sig):
    print(sig.side, sig.order_type, sig.quantity, sig.price)

runner = flox.Runner(registry, on_signal)
runner.add_strategy(SMACross([btc]))
runner.start()
# feed market data:
# runner.on_trade(btc, price, qty, is_buy, ts_ns)
# runner.on_book_snapshot(btc, bid_prices, bid_qtys, ask_prices, ask_qtys, ts_ns)
runner.stop()

Run a paper engine in one command

For tier-5/6 control (live order placement, position queries, kill switch over HTTP), flox engine sim boots a Runner + SimulatedExecutor + ControlServer + state-snapshot writer:

flox engine sim --strategy strategy.py --tape ./tape

Prints the engine URL and a copy-pasteable flox-mcp init --engine-url URL --token T command for wiring into AI tools.

AI companion

flox-mcp is a Model Context Protocol server that gives coding agents (Claude Code, Cursor, Cline) grounded access to indicators, error codes, the C-API surface, and full-text doc search:

pip install flox-mcp
flox-mcp init           # writes ./.mcp.json for the current project

See the flox-mcp README for the tool list.

Symbol and SymbolRegistry

registry = flox.SymbolRegistry()
btc = registry.add_symbol("binance", "BTCUSDT", tick_size=0.01)

btc.id        # int, e.g. 1
btc.name      # "BTCUSDT"
btc.exchange  # "binance"
btc.tick_size # 0.01

int(btc)   # 1
print(btc) # Symbol(binance:BTCUSDT, id=1)
# Symbol objects work transparently as int anywhere an ID is expected

Strategy

Subclass flox.Strategy and override the callbacks you need.

class MyStrategy(flox.Strategy):
    def __init__(self, symbols):
        super().__init__(symbols)   # symbols: list[Symbol | int]

    def on_start(self): ...
    def on_stop(self): ...

    def on_trade(self, ctx, trade): ...      # ctx: SymbolContext, trade: TradeData
    def on_book_update(self, ctx): ...
    def on_bar(self, ctx, bar): ...

    # Order-event hooks (fires on the strategy's own emitted orders).
    def on_fill(self, ctx, ev): ...           # status PARTIALLY_FILLED or FILLED
    def on_order_update(self, ctx, ev): ...   # every status change including fills

Order emission (shorthand, uses first symbol by default)

Method Description
market_buy(qty, symbol=None) Market buy
market_sell(qty, symbol=None) Market sell
limit_buy(price, qty, symbol=None) Limit buy
limit_sell(price, qty, symbol=None) Limit sell
stop_market(side, trigger, qty, symbol=None) Stop market
close_position(symbol=None) Close position (reduce-only)

SymbolContext

Property Type Description
position float Current position quantity
last_trade_price float Last trade price
best_bid float Best bid
best_ask float Best ask
mid_price float Mid price
is_flat() bool No position
is_long() bool Long position
is_short() bool Short position

TradeData

Property Type Description
symbol int Symbol ID
price float Trade price
quantity float Trade quantity
is_buy bool Buy-side aggressor
timestamp_ns int Timestamp (nanoseconds)

OrderEvent (passed to on_fill / on_order_update)

Property Type Description
order_id int Engine order ID
status str "FILLED" / "PARTIALLY_FILLED" / "REJECTED" / "CANCELED" / ...
side str "buy" or "sell"
fill_qty float Last-fill quantity
fill_price float Last-fill price
reject_reason str | None Set when status == REJECTED

Runner

runner = flox.Runner(registry, on_signal)                  # synchronous
runner = flox.Runner(registry, on_signal, threaded=True)   # Disruptor background thread

runner.add_strategy(strategy)
runner.start()
runner.on_trade(btc, price, qty, is_buy, ts_ns)
runner.on_book_snapshot(btc, bid_prices, bid_qtys, ask_prices, ask_qtys, ts_ns)
runner.stop()

The on_signal callback receives Signal objects:

Property Type Description
side str "buy" or "sell"
quantity float Order quantity
price float Limit price (0 for market)
order_type str "market", "limit", etc.
order_id int Internal order ID

BacktestRunner

bt = flox.BacktestRunner(registry, fee_rate=0.0004, initial_capital=10_000)
bt.set_strategy(MyStrategy([btc]))

stats = bt.run_csv("data.csv")             # auto-detects symbol from registry
stats = bt.run_csv("data.csv", "BTCUSDT")  # explicit symbol name
stats = bt.run_tape("./tape")              # replay a recorded `.floxlog` directory

equity = bt.equity_curve()   # numpy arrays: timestamp_ns, equity, drawdown_pct
trades = bt.trades()         # numpy arrays: per-trade detail

from flox_py.report import write_html
write_html("report.html", stats=stats, equity_curve=equity, trades=trades)

The same risk-gate stack as the live Runner plugs into the backtest. Reduce-only / flatten orders bypass the gate by design (so a tightening cap cannot strand a position):

bt.set_risk_manager(my_risk_manager)        # IRiskManager: .allow(order)
bt.set_kill_switch(my_kill_switch)          # IKillSwitch: .check(order), .is_triggered()
bt.set_order_validator(my_validator)        # IOrderValidator: .validate(order, reason)
bt.set_pnl_tracker(my_pnl_tracker)          # IPnLTracker: .on_order_filled(order)

Stats dict

Key Description
return_pct Net return percentage
net_pnl Net P&L after fees
total_trades Round-trip trade count
win_rate Winning trade fraction
sharpe Annualized Sharpe ratio
max_drawdown_pct Peak-to-trough drawdown (%)

Walk-forward and grid search

wf = flox.WalkForwardRunner(
    registry, fee_rate=0.0004, initial_capital=10_000,
    mode="anchored", train_size=180, test_size=30,
)
wf.set_strategy_factory(lambda fold_idx: MyStrategy([btc]))
folds = wf.run_csv("data.csv", "BTCUSDT")

grid = flox.GridSearch()
grid.add_axis([5, 10, 20])    # fast period
grid.add_axis([30, 50, 100])  # slow period
def factory(params):
    fast, slow = params
    bt = flox.BacktestRunner(registry, fee_rate=0.0004, initial_capital=10_000)
    bt.set_strategy(MyStrategy([btc]))  # configure with fast / slow as needed
    return bt.run_csv("data.csv", "BTCUSDT")
grid.set_factory(factory)
results = grid.run()    # list of {index, params, stats}

Render a heatmap with flox_py.report.heatmap_html(...) / write_heatmap(...). Run a multiple-comparison-aware significance test with flox.whites_reality_check(returns, num_bootstrap=10_000).

MLflow

from flox_py import mlflow as flox_mlflow

flox_mlflow.log_backtest(
    stats, equity_curve=equity, trades=trades,
    params={"fast": 10, "slow": 30},
    run_name="sma-2025-01",
)

mlflow is optional — install with pip install mlflow.

Modules

Module Description
Strategy / Runner Event-driven live and backtest strategies
Engine Batch backtest engine (signal arrays, parallel runs)
Indicators EMA, SMA, RSI, MACD, ATR, Bollinger, ADX, Stochastic, CCI, VWAP, CVD, Correlation, AutoCorrelation, and more
Aggregators Time, tick, volume, range, renko, Heikin-Ashi bars
Order Books N-level, L3, cross-exchange CompositeBookMatrix
Profiles Footprint bars, volume profile, market profile
Positions Position tracking with FIFO/LIFO/average cost basis
Replay Binary log reader/writer, market data recorder

All compute-heavy operations release the GIL for true parallelism.

Full API reference at flox-foundation.github.io/flox/reference/python.

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

flox_py-0.6.0.tar.gz (242.7 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

flox_py-0.6.0-cp313-cp313-win_amd64.whl (963.8 kB view details)

Uploaded CPython 3.13Windows x86-64

flox_py-0.6.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (1.9 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

flox_py-0.6.0-cp313-cp313-macosx_14_0_arm64.whl (1.2 MB view details)

Uploaded CPython 3.13macOS 14.0+ ARM64

flox_py-0.6.0-cp312-cp312-win_amd64.whl (963.8 kB view details)

Uploaded CPython 3.12Windows x86-64

flox_py-0.6.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (1.8 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

flox_py-0.6.0-cp312-cp312-macosx_14_0_arm64.whl (1.2 MB view details)

Uploaded CPython 3.12macOS 14.0+ ARM64

flox_py-0.6.0-cp311-cp311-win_amd64.whl (964.4 kB view details)

Uploaded CPython 3.11Windows x86-64

flox_py-0.6.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (1.8 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

flox_py-0.6.0-cp311-cp311-macosx_14_0_arm64.whl (1.2 MB view details)

Uploaded CPython 3.11macOS 14.0+ ARM64

flox_py-0.6.0-cp310-cp310-win_amd64.whl (962.8 kB view details)

Uploaded CPython 3.10Windows x86-64

flox_py-0.6.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (1.8 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

flox_py-0.6.0-cp310-cp310-macosx_14_0_arm64.whl (1.2 MB view details)

Uploaded CPython 3.10macOS 14.0+ ARM64

File details

Details for the file flox_py-0.6.0.tar.gz.

File metadata

  • Download URL: flox_py-0.6.0.tar.gz
  • Upload date:
  • Size: 242.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for flox_py-0.6.0.tar.gz
Algorithm Hash digest
SHA256 32b59b6812e251aadd63ddb901466a18197d7227063d2e95fd921be4240b90c8
MD5 54dbcd287aa0f26d0651d8a7baade91a
BLAKE2b-256 8fb7c5cc71310eaa3e9f96d46bb1455ce7f9afb1bfbad22b849adbefe7779750

See more details on using hashes here.

Provenance

The following attestation bundles were made for flox_py-0.6.0.tar.gz:

Publisher: python-wheels.yml on FLOX-Foundation/flox

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file flox_py-0.6.0-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: flox_py-0.6.0-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 963.8 kB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for flox_py-0.6.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 ee9aa095ac31f4235b04716281fd138b618f4a74a06f98ba5ac578a88d801549
MD5 4d2a9e80520f4e546c35cc17ee8cc7a2
BLAKE2b-256 8b5daf3b7ec5a0dfc04ae9c3810ef86f3bc92535051e5d6a477be88ce9cc020d

See more details on using hashes here.

Provenance

The following attestation bundles were made for flox_py-0.6.0-cp313-cp313-win_amd64.whl:

Publisher: python-wheels.yml on FLOX-Foundation/flox

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file flox_py-0.6.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for flox_py-0.6.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 656b45c0eeac9712f4170a49849f301c6c40d57e4cfb3e6989dabd83c76bb784
MD5 5d3b725100d63823ff323a96937c0f62
BLAKE2b-256 cd90785cc611021a284b8781642e6a1527fed68e048d8e5345526b5265397d91

See more details on using hashes here.

Provenance

The following attestation bundles were made for flox_py-0.6.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: python-wheels.yml on FLOX-Foundation/flox

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file flox_py-0.6.0-cp313-cp313-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for flox_py-0.6.0-cp313-cp313-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 6d80a0ab58f2717fd3581d7d1abcd4f8a44f94503dfabc6ce68bd1805f7e6152
MD5 ecf0cd5109f7a5421e879c0ae3d9dae9
BLAKE2b-256 fcb49ab848dd186bc5276a2f89b410d6abd5acde6814bedacccb042f974e1296

See more details on using hashes here.

Provenance

The following attestation bundles were made for flox_py-0.6.0-cp313-cp313-macosx_14_0_arm64.whl:

Publisher: python-wheels.yml on FLOX-Foundation/flox

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file flox_py-0.6.0-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: flox_py-0.6.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 963.8 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for flox_py-0.6.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 a36e622efe0a354f74b41323d64d5e7249349a6bbbd7172a45afa539683d9437
MD5 67aeabf78c756d9b5e2846c7c0effee5
BLAKE2b-256 31aa88dcb7abb4840a702ae5ebdcda7d81c1b31b9e22db7718b45b4b30837e0d

See more details on using hashes here.

Provenance

The following attestation bundles were made for flox_py-0.6.0-cp312-cp312-win_amd64.whl:

Publisher: python-wheels.yml on FLOX-Foundation/flox

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file flox_py-0.6.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for flox_py-0.6.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 8a2fa7302309c7f7497a78d2a140550d9ca12a69d409026ccc4aa358aafd3127
MD5 aa755b9546eaeaaa07dfeed94c85d7a4
BLAKE2b-256 28e07c5f7dd0c6f5f04804530f724f97ce19e64f970093ecbea264161edcbc53

See more details on using hashes here.

Provenance

The following attestation bundles were made for flox_py-0.6.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: python-wheels.yml on FLOX-Foundation/flox

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file flox_py-0.6.0-cp312-cp312-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for flox_py-0.6.0-cp312-cp312-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 ad2b64de8c0c0a2c055e072737f1220b90d4fa97fa45b7c8853b16b1cce14686
MD5 ae7e3a144197ed7b9630377d3b93501a
BLAKE2b-256 38bcf19e5c2dc624d6b37c7d253ebfcb3e792362910a397bbb59e6a91d5ea6ee

See more details on using hashes here.

Provenance

The following attestation bundles were made for flox_py-0.6.0-cp312-cp312-macosx_14_0_arm64.whl:

Publisher: python-wheels.yml on FLOX-Foundation/flox

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file flox_py-0.6.0-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: flox_py-0.6.0-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 964.4 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for flox_py-0.6.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 182682585ed4550e38c0bd975ee1e8c5885409841eb1f89968bcdfdbdb316a4b
MD5 86117ca4aaac93c512c994ad5038bb4e
BLAKE2b-256 03a174aef647de15865986a21cd09bdca99dd3afd660fe5f460641c44d5b0368

See more details on using hashes here.

Provenance

The following attestation bundles were made for flox_py-0.6.0-cp311-cp311-win_amd64.whl:

Publisher: python-wheels.yml on FLOX-Foundation/flox

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file flox_py-0.6.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for flox_py-0.6.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 af2ef502885d12de48ef89760a875b9fd700e5f82631aa576396a4dd53d3ea30
MD5 cd883365db89d58af5e55e60a7f4bdcf
BLAKE2b-256 96ee2bad6430214755896dd0b2dd7538313ed7e89ea09fbb6b91dd56b624cf0b

See more details on using hashes here.

Provenance

The following attestation bundles were made for flox_py-0.6.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: python-wheels.yml on FLOX-Foundation/flox

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file flox_py-0.6.0-cp311-cp311-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for flox_py-0.6.0-cp311-cp311-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 39fec8d2d80611539f8c5fd49f505141c4ca35bcfbcc1792ade543512a277a63
MD5 1c7a34149a0cf14144ad50713a0e5a5d
BLAKE2b-256 63891726afe70c741dee8e614b0cf53e4ddeb5b780b1c70d1747d92fff9e37ae

See more details on using hashes here.

Provenance

The following attestation bundles were made for flox_py-0.6.0-cp311-cp311-macosx_14_0_arm64.whl:

Publisher: python-wheels.yml on FLOX-Foundation/flox

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file flox_py-0.6.0-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: flox_py-0.6.0-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 962.8 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for flox_py-0.6.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 68948c1931b00392ed3253d3aa322c245766e498a60482e1f4d56baff05d98af
MD5 7bbc1f07716821f0cc0182e573694722
BLAKE2b-256 adf89a5fc4032b26f10464d3e29f470d19094e567452c124e0382bd954fe138f

See more details on using hashes here.

Provenance

The following attestation bundles were made for flox_py-0.6.0-cp310-cp310-win_amd64.whl:

Publisher: python-wheels.yml on FLOX-Foundation/flox

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file flox_py-0.6.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for flox_py-0.6.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 650572a37f21275005fb9ef9e65710238c64cbe6769ef237f430519f77b01127
MD5 f5606b182e2439ae737c3d38ae58a205
BLAKE2b-256 eac7ea9218257fb32f633088c6148b15e5fc73137e875b0300d4105d99e95adc

See more details on using hashes here.

Provenance

The following attestation bundles were made for flox_py-0.6.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: python-wheels.yml on FLOX-Foundation/flox

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file flox_py-0.6.0-cp310-cp310-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for flox_py-0.6.0-cp310-cp310-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 a308a00cb55b533fd94905b51f7277f4638a132f8e5fd80c0034a07685f5ae43
MD5 cf81e2f78493deb908d5434a53ff31c2
BLAKE2b-256 8b7d6b0c6e4ea656fcbc37da012ed2d8fdcd9dc3331b1ade3565dc2fc3bada84

See more details on using hashes here.

Provenance

The following attestation bundles were made for flox_py-0.6.0-cp310-cp310-macosx_14_0_arm64.whl:

Publisher: python-wheels.yml on FLOX-Foundation/flox

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page