Live on Binance & Bitget USDT-M futures

Trade on the signal,
not the screen.

SpikeWatch is a desktop trading workbench for crypto futures. Backtest your strategies on real exchange data, then run them live with the same code path — TP, SL, trailing stops included.

87 tests passing Paper-trading only · no API keys Open architecture · bring your own strategy
LIVE REPLAY BTCUSDT · 1m · Mean Reversion
—
Bot status
ACTIVE
Open trades
0
Session P&L
+0.00%
BTCUSDT +1.42% ETHUSDT +0.88% SOLUSDT -2.10% XRPUSDT +0.42% DOGEUSDT -0.95% AVAXUSDT +3.21% LINKUSDT +0.55% MATICUSDT -1.04% DOTUSDT +1.78% BNBUSDT +0.21% ARBUSDT -0.66% OPUSDT +2.40% ATOMUSDT -0.31% NEARUSDT +1.05% FILUSDT -1.78% LTCUSDT +0.93%
The pain

Strategies look great on paper. Then you wire one up.

Different libraries for backtesting and live trading. TP/SL logic that drifts apart in production. Hand-rolled rate limiters that 429 your account at the worst possible moment. We've been there.

01
Backtest ≠ Live

Your backtest hits TP on the next bar; production fires SL first. Same idea, different code paths, different results.

02
Cobbled-together infra

REST loops, CSV logs, Streamlit on top, hope for the best. One bad weekend and the whole thing crashes silently.

03
Three Sharpe numbers

Daily, hourly, ad-hoc. Each gives a different ratio, none of them agree, and you have no idea which to trust.

What you get

One state machine. Live and backtest, byte-for-byte.

Every feature is built on a single shared core. If a backtest is profitable, the live run executes the exact same TP/SL/trailing logic — pinned by 15 golden tests.

⚙️

Unified trade engine

trade_state.step() is the single function that decides every exit — live ticks and backtest candles share it.

🧠

Pluggable strategies

One file per strategy. Subclass Strategy, list your params, write signal() — UI and engine pick it up automatically.

⚡️

~10× faster sweeps

Single aiohttp.ClientSession with a 20-wide semaphore. ~50 s monitoring cycles dropped to 3–5 s.

🚦

Header-driven rate limiting

Reads each exchange's quota header in real time. Pauses at 80%, backs off exponentially on 429. Resets on the next 2xx.

💾

SQLite trade history

Lifetime history in WAL-mode SQLite. Idempotent inserts keyed on (symbol, exchange, open_time). CSV mirror for safe rollback.

📐

One Sharpe, three metrics

Log returns of the resampled equity curve, crypto 24/7/365 calendar. Sortino & Calmar reported alongside, same denominator.

🪟

Native desktop UI

PyQt + pyqtgraph. Open trades, equity curve, color-coded sweep telemetry — and your last session restores on launch.

🔌

Multi-exchange

Binance USDT-M Futures and Bitget USDT Futures v2 today. Add a third exchange behind the same data-layer interface.

📡

Qt signal bus

Cross-thread updates over a single signal bus. Trade opens, closes, and telemetry flow into the UI without polling.

Backtest showcase

BTC · 1m · Mean Reversion

Loading representative backtest…

Price vs. equity
BTC price · strategy equity — same time axis
BTC price —
Equity —
—
Total return
—
Max drawdown
—
Annualized
—
Exit breakdown
Risk-adjusted
—
Sharpe
—
Sortino
—
Calmar
Crypto 24/7/365 annualization. One Sharpe method — log returns of the hourly-resampled equity curve.
Monthly
PnL sum % · trade count · win rate
Month Trades Win rate PnL (sum %) Bar

—

Built-ins (and your own)

Three strategies ship by default.

Each lives in strategies_pkg/ as ~50 lines of code. Add yours the same way — zero edits to the engine.

strategyspike_detection.py

Spike Detection

A ±N% candle close opens a trade in the move's direction. The original SpikeWatch signal — dead simple, very fast.

~ 33 LOC
strategyema_crossover.py

EMA Crossover

Short/long EMA cross opens; the reverse cross closes. Classic trend-follower with configurable periods.

~ 63 LOC
strategymean_reversion.py

Mean Reversion

Bollinger-style entry on a band breach; closes when price touches the moving-average mean. Showcased above.

~ 55 LOC
Write your own
strategies_pkg/my_strategy.py
from ..strategy_base import ParamSpec, Strategy, register

@register
class MyStrategy(Strategy):
    NAME = "My Custom Strategy"
    PARAMS = [
        ParamSpec(name="lookback", label="Lookback",
                  default=14, kind="int"),
    ]

    def signal(self, i, bars):
        # your logic here
        return "long"  # or "short" / None

That's it. The UI builds inputs from PARAMS, the engine picks it up at startup, and your strategy runs through the same trade_state.step() as every other signal.

Who it's for

Built for traders who code.

🧪

Quant tinkerers

You've got a Jupyter notebook full of ideas. Drop them into strategies_pkg/ and see how they hold up on six months of 1-minute data.

🤖

Automation seekers

You want to stop refreshing the chart. SpikeWatch monitors hundreds of symbols at once and acts when your conditions hit.

📊

Backtest skeptics

Burned once by a backtest that worked in Pandas but failed in production? Live and backtest share one function. No drift.

Pricing

Start free. Upgrade when you go live.

Launch pricing — locked for two years on annual plans.

Backtester
$0 / forever

For the spreadsheets-at-2am crowd.

  • ✓ 1 active strategy
  • ✓ Backtest up to 30 days, 1m candles
  • ✓ All 3 built-in strategies
  • ✓ Sharpe + Sortino + Calmar
  • — No live automation
MOST POPULAR
Pro
$29 / month

Full backtester + live automation.

  • ✓ Unlimited strategies
  • ✓ Live automation on Binance & Bitget
  • ✓ Backtest up to 2 years history
  • ✓ SQLite trade history + CSV export
  • ✓ Trailing stop & per-strategy params
  • ⊙ Email alerts on TP / SL (coming soon)
Quant
$99 / month

For research teams & multi-strategy desks.

  • ✓ Everything in Pro
  • ✓ Custom strategies + private repo sync
  • ✓ Backtest up to 5 years, parallel runs
  • ✓ Priority market-data feeds
  • ✓ REST API + webhook bridge
  • ✓ Dedicated Slack channel
Talk to us

Paper trading is always free. Live automation requires a Pro or Quant subscription and your own exchange API keys (read+trade scopes; no withdrawal).

FAQ

Answers, before you ask.

Does SpikeWatch hold my funds? ›

No. SpikeWatch is a desktop app that runs on your machine. Your exchange API keys stay local. Withdrawal permission is never required (and should never be granted to any trading bot).

How does live trading differ from the backtest? ›

It doesn't. Both call the same trade_state.step() function — backtest passes OHLC bars, live passes single-price ticks. Fifteen golden tests pin the contract so they can't diverge.

Which exchanges are supported? ›

Binance USDT-M Futures and Bitget USDT Futures v2 today. The data layer is exchange-agnostic at call sites, so adding a third is a one-file lift.

Can I write my own strategy? ›

Yes — see the code snippet in the Strategies section. Subclass Strategy, register it, drop the file in strategies_pkg/. Pro and Quant tiers run custom strategies in production.

Are the backtest numbers above real? ›

Yes. They come from running the actual Mean Reversion strategy in SpikeWatch against BTCUSDT 1-minute klines from Binance between 1 Jan and 22 May 2026 — roughly 204k candles producing 7,844 trades. The numbers shown were exported straight from the app's Export Backtest… button, no manual editing. As always, past performance doesn't guarantee future results — run your own parameters in the app to compare.

Is there a free tier forever? ›

Yes. The backtester tier is free, no credit card. We charge only when you turn on live automation.

Your next strategy is one backtest away.

Download the desktop app and run your first backtest in under five minutes.

View architecture →
v0.2.0 · ~3,126 LOC src · 87 tests passing