These files bypassed the i18n table entirely, so a user running LANG=en still got Chinese order logs. Migrating them surfaced structural duplication too: the five order paths each spelled out their own 'quantity invalid' string, now one key parameterised by an order-kind label. Also fixes a type that carried display text as its domain: TrendLabel was '做多' | '做空' | '无信号', so the engine's snapshot value *was* the Chinese string and English rendering depended on matching it. Now 'long' | 'short' | 'none', translated at the edge. Order-coordinator tests asserted the Chinese literals, which is exactly what made the gap invisible; they now assert the resolved key so they hold in either language. 39 new translation keys. 271 pass; tsc and oxlint clean.
ritmex-bot
Language Setting: Set LANG=en in your .env file to display the CLI interface in English.
A Bun-powered multi-exchange perpetuals workstation that ships an SMA30 trend engine, a Guardian stop sentinel, and two market-making modes. It offers instant restarts, realtime market data, structured logging, and an Ink-based CLI dashboard.
If you'd like to support this project and get fee discounts, please consider using these referral links:
- Lighter referral link
- Hyperliquid referral link
- Ondo Perps referral link
- Aster referral link
- StandX referral link
- Binance referral link
- Nado referral link
- Backpack referral link
- edgex referral link
- Paradex referral link
- Apex referral link
- GRVT referral link
CLI Command Mode (ritmex-bot)
ritmex-bot provides an agent-friendly command interface for exchange capability checks, market data, account/position queries, order operations, and strategy execution.
- It keeps the current environment-variable system intact: no renaming and no new required keys.
--symbolis passed through exactly as provided (no symbol normalization).- It supports
--dry-runsimulation and--jsonstructured output for automation.
Install This Project Skill (skills add)
bunx skills add https://github.com/discountry/ritmex-bot --skill use-ritmex-bot
If you need a specific branch/tag, append --ref <branch-or-tag>.
Full guide: ritmex-bot CLI User Guide (English)
Documentation Map
- ritmex-bot CLI User Guide (English)
- ritmex-bot CLI 使用手册(中文)
- Beginner-friendly Quick Start
- Grid Trading Strategy Guide
- Bilingual Exchange Configuration Guides
- Ondo Perps Integration Guide
Highlights
- Live data & risk sync via websockets with REST fallbacks and full reconciliation on restart.
- Trend strategy featuring SMA30 entries, fixed stop loss, trailing stop, Bollinger bandwidth gate, and profit-lock stepping.
- Guardian strategy that never opens trades but mirrors your live exposure, ensuring every position has a synced stop loss and trailing stop.
- Market-making loop with dual-sided quote chasing, loss caps, and automatic order healing.
- Modular architecture decoupling engines, exchange adapters, and the Ink CLI for easy venue or strategy extensions.
Supported Exchanges
| Exchange | Market Type | Standard Required Settings | Notes |
|---|---|---|---|
| Aster | USDT perpetuals | ASTER_API_KEY, ASTER_API_SECRET |
Production; default exchange |
| Binance | Spot + USDⓈ-M perpetuals | BINANCE_API_KEY, BINANCE_API_SECRET |
BINANCE_MARKET_TYPE selects the market |
| StandX | USD perpetuals | STANDX_TOKEN, STANDX_REQUEST_PRIVATE_KEY |
JWT authentication + Ed25519 trade signing |
| GRVT | USDT perpetuals | GRVT_API_KEY, GRVT_API_SECRET, GRVT_SUB_ACCOUNT_ID, GRVT_INSTRUMENT |
GRVT_ENV supports prod/testnet |
| Lighter | Perpetuals + selected Spot markets | LIGHTER_ACCOUNT_INDEX, LIGHTER_API_KEY_INDEX, LIGHTER_API_PRIVATE_KEY |
Defaults to LIGHTER_ENV=testnet |
| Backpack | Spot + USDC perpetuals | BACKPACK_API_KEY, BACKPACK_API_SECRET |
Use an explicit *_PERP symbol for perpetuals |
| Paradex | USD perpetuals | PARADEX_PRIVATE_KEY, PARADEX_WALLET_ADDRESS |
PARADEX_SANDBOX=true selects testnet |
| Nado | USDC perpetuals | NADO_SIGNER_PRIVATE_KEY, NADO_SUBACCOUNT_OWNER |
NADO_ENV supports inkMainnet/inkTestnet |
| Ondo Perps | Crypto/equity/commodity perpetuals | ONDOPERPS_API_KEY_ID, ONDOPERPS_API_SECRET |
HMAC authentication with production and sandbox endpoints |
Requirements
- Bun >= 1.2 (both
bunandbunxon PATH) - macOS, Linux, or Windows via WSL (native Windows works but WSL is recommended)
- Node.js is optional unless your tooling requires it
Quick Start
One-line bootstrap (macOS / Linux / WSL)
curl -fsSL https://github.com/discountry/ritmex-bot/raw/refs/heads/main/setup.sh | bash
The script installs Bun, project dependencies, collects Aster API credentials, generates .env, and launches the CLI. Prepare the relevant exchange API keys before running it.
Manual installation
- Clone the repository
Alternatively, download the ZIP from GitHub and extract it manually.
git clone https://github.com/discountry/ritmex-bot.git cd ritmex-bot - Install Bun
- macOS / Linux:
curl -fsSL https://bun.sh/install | bash - Windows PowerShell:
powershell -c "irm bun.sh/install.ps1 | iex"Re-open the terminal and verifybun -vprints a version.
- macOS / Linux:
- Install dependencies
bun install - Create your environment file
Edit
cp .env.example .env.envwith the exchange credentials and overrides you plan to use. - Launch the CLI
Use the arrow keys to pick a strategy,
bun run index.tsEnterto start,Escto go back, andCtrl+Cto exit.
Shared Configuration
.env.example captures all defaults; the most common settings are summarised below.
| Variable | Purpose |
|---|---|
EXCHANGE |
Choose the venue (aster / binance / standx / grvt / lighter / backpack / paradex / nado / ondoperps) |
TRADE_SYMBOL |
Contract symbol (defaults to BTCUSDT) |
TRADE_AMOUNT |
Order size in base asset units |
LOSS_LIMIT |
Max per-trade loss in USDT before forced close |
TRAILING_PROFIT / TRAILING_CALLBACK_RATE |
Trailing stop trigger (USDT) and pullback percentage |
PROFIT_LOCK_TRIGGER_USD / PROFIT_LOCK_OFFSET_USD |
Profit lock trigger and offset thresholds |
BOLLINGER_* |
Bollinger bandwidth filters for the trend engine |
PRICE_TICK / QTY_STEP |
Exchange precision filters for price and quantity |
POLL_INTERVAL_MS |
Trend engine polling cadence in milliseconds |
MAX_CLOSE_SLIPPAGE_PCT |
Allowed deviation vs mark price when closing |
MAKER_* |
Maker-specific knobs (quote offsets, refresh cadence, slippage guard, etc.) |
CLI flags override environment variables at runtime:
bun run index.ts --exchange grvt --strategy maker bun run index.ts -e lighter -s offset-maker --silent
Exchange Setup Guides
Each supported exchange has a standalone Chinese and English configuration guide covering credential creation, required variables, environment selection, symbol formats, read-only verification, and security controls.
| Exchange | English Guide | 中文教程 |
|---|---|---|
| Aster | Configuration Guide | 配置教程 |
| Binance | Configuration Guide | 配置教程 |
| StandX | Configuration Guide | 配置教程 |
| GRVT | Configuration Guide | 配置教程 |
| Lighter | Configuration Guide | 配置教程 |
| Backpack | Configuration Guide | 配置教程 |
| Paradex | Configuration Guide | 配置教程 |
| Nado | Configuration Guide | 配置教程 |
| Ondo Perps | Configuration Guide | 配置教程 |
Command Cheatsheet
bun run index.ts # Launch the CLI (default entrypoint)
bun run start # Alias for bun run index.ts
bun run dev # Development entrypoint
bun run lint # Run Oxlint checks
bun run lint:fix # Apply safe Oxlint fixes
bun x vitest run # Execute the full Vitest suite
ritmex-bot Command Mode (Agent-friendly)
The project now supports a standalone command mode with the command name ritmex-bot:
ritmex-bot doctor
ritmex-bot exchange list
ritmex-bot market ticker --exchange binance --symbol BTCUSDT
ritmex-bot order create --exchange binance --symbol BTCUSDT --side buy --type limit --quantity 0.01 --price 90000 --dry-run
ritmex-bot strategy run --strategy maker --exchange standx --silent --dry-run
Run Modes
# Global install
bun add -g ritmex-bot
ritmex-bot doctor
# No install
bunx ritmex-bot doctor
Global Flags
--exchange: picks exchange using the existing env/config logic--symbol: passed through as-is (no symbol normalization)--dry-run: simulation mode (no real create/cancel side effects)--json: structured JSON output for AI agents--timeout: command timeout in milliseconds
Silent & Background Execution
Direct silent launch
Skip the Ink menu and start a strategy directly:
bun run index.ts --strategy trend --silent
bun run index.ts --strategy maker --silent
bun run index.ts --strategy offset-maker --silent
Combine with --exchange/-e to pin the venue for that run.
Package scripts
Convenience aliases exposed via package.json:
bun run start:trend:silent
bun run start:maker:silent
bun run start:offset:silent
Daemonising with pm2
Install pm2 locally (e.g. bun add -d pm2) and launch the process:
bunx pm2 start bun --name ritmex-trend --cwd . --restart-delay 5000 -- run index.ts --strategy trend --silent
You can also call the bundled scripts:
bun run pm2:start:trend
bun run pm2:start:maker
bun run pm2:start:offset
Run pm2 save afterwards if you want the process list to survive reboots.
Testing
Powered by Vitest:
bun run lint
bun run lint:fix
bun run test
bun x vitest --watch
Troubleshooting
- Keep at least 50-100 USDT in the account before deploying a live strategy.
- Configure leverage on the exchange manually (~50x is recommended); the bot will not change it.
- Ensure your server or workstation clock is in sync to avoid signature errors.
- Accounts must run in one-way position mode.
- Env not loading: make sure
.envlives in the repo root and variable names are spelled correctly. - Permission rejected: confirm the API key has perpetual trading scopes enabled.
- Precision errors: align
PRICE_TICK,QTY_STEP, andTRADE_SYMBOLwith the exchange filters. See simple-readme.md for more detailed walkthroughs.
Community & Support
- Telegram: https://t.me/+4fdo0quY87o4Mjhh
- Issues and PRs are welcome for bug reports and feature requests
Disclaimer
Algorithmic trading carries risk. Validate strategies with paper trading or small capital first, safeguard your API keys, and only grant the minimum required permissions.