01What's different about crypto
Crypto is not a stock. The differences look small on paper but matter enormously in practice:
- 24/7 markets. No open, no close, no weekend break. Liquidations happen at 3am Sunday; funding rates flip on holidays.
- No central authority. No SEC backstop, no SIPC insurance, no “the exchange will fix it” if a fork or hack goes sideways.
- Fork risk. A coin can split into two coins overnight (BTC/BCH, ETH/ETC). Your broker may or may not credit you with the new asset.
- Wider spreads + thinner books than major equities, especially outside business hours.
- Realized vol is 3–5× SPY. The same regime label (“Weak-Bear”) implies a totally different drawdown distribution than for stocks.
Crypto trades 24/7 — including weekends and holidays. Paper-trade first. Use small position sizes.
02Spot vs. perpetuals
There are two main flavors of crypto trade:
- Spot — you actually own the coin. Buy BTC, BTC sits in your account. No expiry, no leverage, no funding.
- Perpetuals (“perps”) — futures that never expire. Settled in cash, leveraged up to 100× on offshore venues. They use a funding rate (Section 5) to keep the perp price tethered to spot.
This bot trades spot only. Both Alpaca and IBKR (via Paxos) are spot venues — no perps, no margin, no shorting. If you want perps you need a third-party exchange and a different bot; that's outside scope.
03Broker support and setup
Same Signal/Order/Fill contract whether routed through Alpaca or IBKR — the pipeline is broker-agnostic. The setup differs:
| Aspect | Alpaca | IBKR (Paxos) |
|---|---|---|
| Routing | Internal book | Paxos via SMART → PAXOS |
| Quote currencies | USD, USDT, USDC | USD only |
| Bracket orders | ✓ supported | ✗ downgraded to LIMIT/MARKET |
| Min order | $1 notional | ~$10 (varies) |
| Trading hours | 24/7 | 24/7 |
| Setup | Default-on | Manual Paxos enrollment required |
Alpaca is the easy default. For IBKR you must explicitly enable cryptocurrency trading in IB Client Portal → Settings → Trading Permissions, then flip broker.ibkr.crypto_paxos_enrolled: true. Until that flag is true, the IBKR adapter auto-disables crypto signals — forgetting the step results in a no-op, not a mid-tick rejection.
04Symbol conventions
Different APIs format the same pair differently. The bot normalizes via broker.asset_utils.to_canonical_crypto_symbol:
BTC/USD— canonical form (slash separator).BTCUSD— slash-less form returned by some REST endpoints.BTC-USD— IBKR variant.- TradingView webhooks come in either format.
You'll see one canonical symbol per pair regardless of source. BTC/USDT and BTC/USD are the same coin but different fiat rails — never mix them in a single position-tracker key.
05The default 10-pair universe
Default crypto universe (chosen for liquidity, broker coverage on both Alpaca and IBKR, and regime trainability):
BTC/USD,ETH/USD— the two majors. Best liquidity.SOL/USD,AVAX/USD— large-cap L1s.MATIC/USD,LINK/USD— L2/oracle infrastructure.UNI/USD,AAVE/USD— DeFi blue chips.DOGE/USD,LTC/USD— long-tail liquid.
Custom universe: type any supported symbol in the wizard's step-3 textarea. Mixed stock + crypto lists are fine.
06Funding rates explained (perps only)
Perpetual futures don't expire — instead they pay or charge a small funding rate every 8 hours that tugs the perp price toward spot. Typical rates: ±0.01% per 8h (~±10% annualized).
- Positive funding — longs pay shorts. Signals euphoria; too many people are long the perp.
- Negative funding — shorts pay longs. Signals panic; too many people are short.
The bot doesn't trade perps but it can read funding as a signal source via the B7 evaluation gate (signals.evaluation.crypto_funding) to dampen leverage in extreme conditions.
07Perp basis and spot basis
Basis = (futures_price − spot_price) / spot_price. It's a market-stress thermometer.
- Healthy — ±0.1%. Boring, normal.
- Spikes > +0.5% — euphoria; perp is bid up versus spot.
- Dives < −0.5% — panic / liquidation cascade.
Spot basis is the same idea on calendar futures (CME BTC futures vs. spot BTC). Useful as a regime sanity check; if spot and basis disagree about which way stress is running, dial back size.
08Stablecoin de-peg risk
USDT and USDC are supposed to be worth exactly $1. Most days they are. Occasionally they aren't — USDC briefly fell to $0.87 during the Silicon Valley Bank weekend in March 2023; UST spiraled to zero in May 2022.
If you trade BTC/USDT instead of BTC/USD, you're running two bets at once: BTC and the stablecoin staying pegged. Default to USD pairs unless you specifically need a stablecoin venue. IBKR (Paxos) sidesteps this — USD only, no stablecoin pairs.
09Crypto-specific risk caps
Crypto sits in its own portfolio sleeve with hard caps that compensate for the higher volatility:
portfolio.target_mix.crypto— default 0.20 (20% of equity targeted at crypto).risk.max_crypto_exposure— hard sleeve cap, always ≥ target. Breach blocks new orders until positions roll off.risk.max_single_position— default 0.05 per pair, so you can't get blown up by one alt.
The HMM regime model is the same one used for stocks (4-state Top-Bull / Weak-Bull / Weak-Bear / Top-Bear). There's no separate crypto model — the bot compensates for crypto's 3–5× higher vol via vol- rank scaling in the position-sizer, so the bot won't let crypto eat your whole portfolio.
10Why crypto bots stay warm (Fly cost)
Stock-only bots scale-to-zero between bars to save Fly compute — when SPY is closed there's no work to do. Crypto bots stay warm 24/7 because the next bar is always less than a minute away; cold-starting on every tick would cost more than staying up.
Cost difference is small (~$2–5/mo per bot). Mixed stock + crypto bots stay warm by default. When the stock market is closed (5pm ET → 9:30am ET), the bot auto-switches to crypto-only mode if the connected broker has crypto enabled; otherwise it exits cleanly with a “no eligible asset class until reopen” message.
Not supported: margin/leverage on crypto, perpetual contracts, off-exchange / DEX trading, staking or yield, and tax tracking. The audit DB logs every fill but doesn't produce a tax form — use CoinTracker or Koinly on the exported CSV.