Passivbot

A contrarian perp market maker you configure in JSON and leave running for months.

Last updated

From
Free
Latency
Realtime
Licence
Unlicense
Self-hosted
Yes

What it is

A perpetual-futures bot that opens a position and works it rather than predicting anything. The README calls it a contrarian market maker: it places limit orders on both sides using price bands and an EMA context, adds to a position as price moves against it within configured exposure limits, and closes at a configured profit margin or on a trailing retrace. The default strategy is trailing_martingale; ema_anchor is the alternative and trailing_grid_v7 is a deprecated compatibility mode for people migrating v7 configs.

It is Python around a Rust core, and the same Rust orchestrator computes order placement for both live trading and backtesting — which is the property that makes an optimiser worth having. The optimiser runs thousands of backtests under an evolutionary algorithm and converges on parameter sets, so the workflow here is tuning numbers, not writing strategy code. There is no strategy class to subclass; there is a JSON config with defaults that live in src/config/schema.py.

Two mechanisms are worth knowing before you read the config reference. Forager picks which markets are allowed to open positions at all, pruning low relative-volume candidates and then ranking the rest by quote volume, EMA readiness and one-minute log-range volatility. Unstucking handles positions that have gone the wrong way and stayed there, realising small losses on the position with the smallest gap between entry and market price, bounded so the balance cannot fall more than a set percentage below its past peak.

Liveness, in dates. The last commit on master was 19 September 2026 at 13:15 UTC, and 601 commits landed on that branch in the preceding 30 days — 3,276 in 90. The latest tagged release is v8.1.0 from 10 August 2026, with v8.0.0 on 14 July; v8 is a breaking config release and the migration helper writes the deprecated compatibility strategy rather than translating a v7 config into the new one. The licence is the Unlicense — public domain, not MIT — taken from the LICENSE file.

There is no company. One maintainer, a Discord and a Telegram, and no hosted version of any kind.

Pricing

Free, public domain, nothing to buy, no hosted tier to upsell — and the interesting part is how that is funded, because the category is full of free bots with a revenue model attached.

Referral and broker rebates, documented in the repository rather than only on a page. broker_codes.hjson ships broker codes for Binance, Bybit, Bitget, OKX, KuCoin (separate spot and futures codes), GateIO and WEEX. Hyperliquid, Bitunix, defx and paradex are listed with null, which is the file being explicit that those venues carry no broker payload. The README adds a condition most projects would leave vague — Passivbot earns Binance commissions only from accounts created after 21 September 2024 that were opened either without a referral link or under its own referral ID.

The README also carries referral links for Binance, Bybit, Bitget, OKX, Hyperliquid, KuCoin and WEEX, a BuyMeACoffee link, donation addresses and a link to the maintainer's Hyperliquid reference vault. None of it is hidden and none of it changes what the software does. It does explain why a particular set of venues is the supported set.

Data & coverage

Perpetual swaps only, and the code is stricter about it than the README. The CCXT client is pinned to swaps in src/exchanges/ccxt_bot.pyoptions["defaultType"] = "swap" and fetchMarkets restricted to types: ["swap"]. There is no spot mode to switch into.

The README's title names nine venues: Bybit, OKX, Bitget, Bitunix, GateIO, Binance, KuCoin, Hyperliquid and WEEX. The source tree carries eleven live adapter modules, adding defx and paradex to that list, beside the shared CCXT base class and the fake test harness. Reaching those venues is CCXT's job: requirements-live.txt pins ccxt==4.5.66, so the venue list and its maintenance are inherited rather than the project's own.

Backtests replay one-minute OHLCV candles from a local cache that the bot fills from exchange endpoints, or from a directory of .npz/.npy files you supply. Costs are modelled better than most: per-coin maker and taker fees are read from the exchange and can be overridden with maker_fee_override and taker_fee_override, and simulated market execution applies market_order_slippage_pct, defaulting to 5 basis points. History depth is whatever the venue serves — GateIO's public one-minute endpoint returns roughly the last 10,000 candles, and the documentation says Passivbot marks older GateIO spans unavailable rather than retrying them.

Integrations

A local monitor relay, read-only. passivbot tool monitor-relay fans in artifacts from any number of bots on the machine and exposes them over HTTP and WebSocket, binding to 127.0.0.1:8765 by default, with GET /dashboard serving a static browser dashboard and a terminal UI consuming the same surface. It is monitoring, not control — there is no endpoint that places or changes an order — and the documentation states plainly that the relay does not authenticate clients.

Backtest output is files. Runs write fills.csv, stats.csv and a gzipped balance_and_equity.csv, plus a dataset.json naming the exact cache files used, and a loader for pulling the whole bundle into a notebook.

Nothing else. No MCP server, no Telegram or Discord notifier, no webhooks — the only mention of a Telegram integration in the tree is a v7.9.0 release note. The graphical interface people use with it, pbgui, is a third-party project the README links to.

Limitations

Funding is not modelled at all. Grepping the entire tree — src/, the Rust crate, the tests — for "funding" returns exactly one file, and there it is a note that TradFi stock prices do not include funding rates. Nothing in the shared Rust engine charges or credits a funding payment, in backtest or in live accounting. For a bot whose whole job is holding perpetual positions across many funding intervals, that is the single most consequential gap on this card. A backtest of a long-biased grid through a period of positive funding will show money the account would not have had, and the sign of the error depends on which side the strategy was on.

There is no paper-trading mode. The fake exchange harness is a deterministic regression fixture for reproducing live-bot bugs offline, and its documentation explicitly tells you not to describe it as paper, demo, sandbox or testnet trading. No exchange adapter carries a sandbox switch. The rehearsal step other bots offer between backtest and live does not exist here.

Development pace is a hazard as well as a strength. 601 commits on master in a month means venue breakages get fixed quickly and that master is a different program every week. The documentation says so directly: a clone of master includes unreleased changes, and the project publishes a page on release status and version meanings specifically so you choose a revision deliberately.

Python 3.13 is not supported — 3.12 and 3.14 only, pinned by the dependency set. It is the kind of detail that decides an afternoon on a fresh VPS image.

The documentation site is not deployed. mkdocs.yml declares site_url: https://www.passivbot.com, and that host answers 301 straight to the GitHub repository. The docs are good and they are in the repository's docs/ tree; there is no rendered site to read them on.

No notifications, no authentication, no company. A bot you leave running for months has no way to tell you it stopped, its monitoring surface trusts anything that can reach the port, and if something goes wrong there is a Discord, not a support address.

KYC is the venue's question, not the bot's. Passivbot itself asks for nothing, but seven of the nine venues in its README are centralised exchanges that will ask before they issue a key.

Alternatives

Freqtrade is the comparison for anyone whose objection to the above is the config file: a Python strategy class instead of a JSON parameter set, a dry-run mode that is a genuine rehearsal rather than a test fixture, and funding and mark candles downloaded per venue in futures mode. It is a worse fit if what you want is an optimiser pointed at a market-making grid.

Hummingbot is the other market-making answer, with far more machinery around quoting and DEX access and an engine that is also thin on funding. OctoBot is the same automation job behind a graphical interface for people who would rather click than edit JSON.

Underneath all of them, including this one, is CCXT — the connector library that actually talks to the exchanges, and the thing whose maintenance decides whether your venue keeps working. The rest of the trading bots and execution SDKs listing is the same choice at different heights.

Specs

Interfaces
API
Export
CSV, JSON
Asset classes
Perpetuals
Chains
Venues
CEX, DEX, Derivatives
KYC required
No
Platforms
CLI, Web
AI features
None
Capabilities
Backtesting, Automation, Live trading
Pricing verified
Capabilities verified
Coverage verified

Head to head

  • OctoBot vs PassivbotTwo free perp bots funded by exchange rebates — and on the one number that decides a perpetual position, one charges a constant and the other charges nothing at all.

Also worth comparing

  • GoCryptoTraderA Go trading engine for 22 exchanges that has never cut a release or a tag.
  • OctoBotGPL-3.0 Python bot with a web interface for grid, DCA, basket and TradingView strategies.
  • 3CommasHosted DCA, grid and signal bots over nine exchanges, with your keys on their servers.
  • BitsgapHosted grid, DCA and futures bots on seventeen venues, with no API and no webhooks.
  • CryptohopperHosted spot bots built in forms, one bot per subscription, with a marketplace attached.
  • GunbotA closed-source bot you install once, licensed against an ERC-20 wallet you control.

On these shelves

Background

How this part of the industry works, rather than which product to pick.

  • Who pays for your free trading botFree crypto bots and terminals are usually paid for by the venue. The five mechanisms, what each does to your order, and how to find them in ten minutes.

FAQ

Does Passivbot charge perpetual funding in its backtests?

No, and it does not charge it in the live accounting either. Searching the whole source tree for "funding" returns one file — a note in the TradFi data module that stock prices do not include funding rates. Nothing in the Rust order engine that both live trading and backtesting share computes a funding payment.

Can I paper trade Passivbot before risking money?

Not in the usual sense. The repository ships a deterministic fake exchange for replaying scripted scenarios, and its own documentation says not to call that paper trading. No exchange adapter has a testnet or sandbox switch, so the two states are backtest and live.

Do I write the strategy in Python?

No. The strategies are built into the Rust engine and you choose and tune one through a JSON config — entry and close distances, exposure limits, trailing thresholds. If you want to write strategy code rather than configure one, this is the wrong shape of tool.

How does a free bot with no company behind it make money?

Referral and broker rebates. broker_codes.hjson in the repository carries broker codes for Binance, Bybit, Bitget, OKX, KuCoin, GateIO and WEEX, and the README asks that Binance accounts be created after 21 September 2024 under its referral ID, because only those earn it commission.