Exchange Quirks Reference
One page with every exchange-specific gotcha you need before sending your first trade: symbol formats, demo/testnet availability, feature support, leverage caps.
- Symbol format varies wildly:
BTCUSDT(Binance, Bitget),BTC-USDT-SWAP(OKX),XBTUSDTM(KuCoin Futures),BTC-USD-PERP(Coinbase Futures),BTC/HYPE/USDC(Hyperliquid). - Demo Account checkbox works for Binance Spot, Binance Futures USD-M, Bybit (Spot + Futures), OKX, Hyperliquid (Perps + Spot) and Bitget (Futures + Spot). Binance Coin-M uses a separate testnet identifier instead.
- Hedge Mode is supported on Binance Futures (USD-M + Coin-M) via
hedgeMode, Bitget viahedgeMode, OKX viapositionSide, and Bybit at the account level (set the position mode on Bybit; no payload param —buy/sellopen each side). Everywhere else it's n/a. - Leverage cap is exchange-defined per pair. TVH applies no hard-coded internal cap; KuCoin reads its leverage limit from the contract metadata at runtime.
Symbol format reference
Use these formats in the TradeCommand pair field. Wrong suffix or wrong separator → the order is rejected with no useful error. See also: TradeCommand gotchas — symbol format.
| Exchange identifier | Symbol example | Notes |
|---|---|---|
binance | BTCUSDT | Spot. No separator. |
binance-futures | BTCUSDT | USD-M perpetuals. Same string as Spot. |
binance-futures-coin | BTCUSD_PERP | Coin-margined. Underscore before PERP. Quarterly contracts use BTCUSD_251226. |
bybit | BTCUSDT | Linear (USDT-margined) perpetuals. |
bybit-spot | BTCUSDT | Same string as Bybit Futures. |
okx | BTC-USDT (spot) · BTC-USDT-SWAP (perp) · BTC-USDT-251226 (dated future) · BTC-USD-251226-50000-C (option) | Dashes. Suffix must match the instrumentType field. |
kucoin | XBTUSDTM | Futures. XBT (not BTC). M suffix = perpetual. |
kucoin-spot | BTC-USDT | Dash separator. BTC (not XBT). |
coinbase-spot | BTC-USD | Dash separator. Auto-transforms BTCUSD → BTC-USD and BTCUSDT → BTC-USDC. |
coinbase | BTC-USD-PERP (perpetual) · BTC-26DEC26-CDE (expiring) | Triple segment. Perpetuals accept -PERP or TradingView's .P (e.g. BTCUSD.P); expiring contracts are strict. |
hyperliquid | BTC | Perps. Bare coin name, no quote asset. Auto-maps TradingView tickers: BTCUSDC.P, BTC.P, BTC-USDC and BTCUSD all resolve to BTC. |
hyperliquid-spot | HYPE/USDC | Spot. Slash separator. Auto-maps HYPEUSDC and HYPE-USDC; a bare HYPE gets /USDC appended. |
bitget | BTCUSDT | USDT-margined perpetuals. No separator, quote asset attached. Auto-maps BTCUSDT.P, BTC-USDT and BTC/USDT; a bare BTC matches nothing. |
bitget-spot | BTCUSDT | Spot. Same string and the same auto-mapping as Bitget Futures. |
Paste HYPEUSDC.P from a TradingView chart into a hyperliquid signal and it trades the HYPE perp. The .P suffix, a / or - separator, and a trailing USDC / USDT / USD are all stripped until something matches the exchange's universe. The market is still chosen by the exchange field, never by the symbol — HYPE/USDC sent to hyperliquid is the perp, not spot. Details: Hyperliquid — symbol format.
On a Coinbase chart in TradingView, the symbol displays as BTCUSD. For Coinbase Futures perpetuals, send BTC-USD-PERP or TradingView's BTCUSD.P — the adapter resolves the perpetual by base asset. Expiring contracts must be the exact BTC-26DEC26-CDE form. A bare BTCUSD or a wrong suffix returns a 400 from Coinbase with no actionable hint. Coinbase Spot is more forgiving: the adapter auto-transforms BTCUSD → BTC-USD and BTCUSDT → BTC-USDC.
Demo / testnet support
TVH offers two parallel paths to risk-free trading. The right one depends on the exchange.
| Exchange | Demo Account checkbox | Separate testnet identifier |
|---|---|---|
| Binance Spot | ✅ | ❌ |
| Binance Futures USD-M | ✅ | binance-futures-testnet |
| Binance Futures Coin-M | ❌ (no demo path) | binance-futures-coin-testnet |
| Bybit Futures | ✅ | bybit-testnet |
| Bybit Spot | ✅ | bybit-spot-testnet |
| OKX | ✅ | ❌ (demo via checkbox covers everything) |
| KuCoin Futures | ❌ | ❌ |
| KuCoin Spot | ❌ | ❌ |
| Coinbase Spot | ❌ | ❌ |
| Coinbase Futures | ❌ | ❌ |
| Hyperliquid Perps | ✅ | ❌ (the checkbox routes to the Hyperliquid testnet) |
| Hyperliquid Spot | ✅ | ❌ (same) |
| Bitget Futures | ✅ | ❌ (the checkbox routes to Bitget's demo environment) |
| Bitget Spot | ✅ | ❌ (same) |
Demo Account checkbox means: keep the same exchange identifier in your TradeCommand payload, tick the box on the API key in TVH, and TVH routes your orders to the exchange's paper-trading endpoint instead of live.
Separate testnet identifier means: you change the exchange field in your payload (e.g. "exchange": "binance-futures-testnet"), create a fresh API key on the exchange's separate testnet domain (e.g. testnet.binancefuture.com), and add it to TVH like a normal live key — without ticking the Demo checkbox.
See also: Account & API Keys — Demo Account.
Feature support matrix
Legend: ✅ supported · ⚠️ supported with caveats · ❌ not supported · n/a doesn't apply
| Feature | Binance Spot | Binance Fut USD-M | Binance Fut Coin-M | Bybit Fut | Bybit Spot | OKX | KuCoin Fut | KuCoin Spot | Coinbase Spot | Coinbase Fut | HL Perps | HL Spot | Bitget Fut | Bitget Spot |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Market orders | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Limit orders | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Multiple TPs | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Trailing stop loss | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ⚠️ via reduce-only | ✅ | ✅ | ❌ | ✅ | ❌ |
| Hedge Mode | n/a | ✅ hedgeMode | ✅ hedgeMode | ✅ account-level | n/a | ✅ via positionSide | ⚠️ | n/a | n/a | ❌ | ❌ one-way only | n/a | ✅ hedgeMode | n/a |
Sub-accounts (via named apiKey) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ✅ own key per address | ✅ own key per address | ✅ | ✅ |
| DCA / Order-Mesh | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Scaled orders | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
postOnly | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
reduceOnly | n/a | ✅ | ✅ | ✅ | n/a | ✅ | ✅ | n/a | n/a | ✅ | ✅ | n/a | ✅ | n/a |
useFixedSize (quote sizing) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
useEntireAccountBalance | ❌ | ❌ | ❌ | ✅ UTA only | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
setTpToPosition (limit-entry TP attach, Bybit-only) | n/a | n/a | n/a | ✅ Bybit-only | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a |
targetAssignedToPosition (market-entry TP attach, Bybit-only) | n/a | n/a | n/a | ✅ Bybit-only | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a |
| Math expressions (SL/TP) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Limit-order chasing | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ⚠️ | ⚠️ | ✅ | ✅ | ✅ | ✅ |
Hyperliquid has not enabled trigger orders on its spot market. A signal carrying a stop loss still opens the position, the stop-loss part is refused, and the refusal lands in your Activity Log — so the position is open and unprotected. Nothing is emulated client-side. See Hyperliquid.
Bitget listed around 770 USDT futures contracts on 2026-08-31, and around 300 of them are RWA: stocks, indices, ETFs, metals and energy. They sit in the same symbol list as BTCUSDT and carry the label (RWA) in the Trade Command Builder. They trade on their underlying market's session, not around the clock, allow only 2% away from the market against 5% on BTCUSDT in the majority of cases, and cap leverage per contract, 20× on most of them against 150× on BTCUSDT. See Bitget — RWA contracts.
Cross-refs:
- Trade Command — Sizing options for
useFixedSize,unitsType,useEntireAccountBalance - Trade Command — Futures options for
leverage,marginType,hedgeMode,positionSide - Trade Command — DCA & Scaling for
useDca,useScaledOrders
unitsType & scaledOrderStyle quick reference
For sizing-mode and scaled-order distribution, every exchange accepts the same six unitsType values and three scaledOrderStyle values:
unitsType:absolute·percentBalance·percentPosition·percentWallet·riskscaledOrderStyle:even·bigSmall·smallBiglimitPriceType:fixedPrice·bestPrice(scaled orders only)
These are validated by the TVH dispatcher before reaching the exchange adapter, so support is identical everywhere. The semantics of e.g. percentBalance differ per exchange (futures wallet vs. spot wallet), but the string value is the same.
See Sizing options for full semantics.
instrumentType reference (OKX only)
OKX has one exchange identifier (okx) but several markets. Use the instrumentType field to switch:
instrumentType | Market | Symbol example |
|---|---|---|
spot | Spot pairs | BTC-USDT |
margin | Cross/isolated margin spot | BTC-USDT |
swap | Perpetual swaps (default if omitted) | BTC-USDT-SWAP |
futures | Expiring futures | BTC-USDT-251226 |
option | Options (limited TVH support) | BTC-USD-251226-50000-C |
The string is singular — use option, not options. Symbol suffix must match the type.
Leverage caps per exchange
The cap is the lower of (exchange max, TVH-internal cap). Most exchanges enforce per-pair tiers; the table shows the headline max.
| Exchange | Cap | Notes |
|---|---|---|
| Binance Futures USD-M | 125× | Per-pair tier; lower for new/illiquid pairs |
| Binance Futures Coin-M | 125× | Same tiering as USD-M |
| Bybit Futures (UTA) | 100× | Cumulative across the Unified Account |
| OKX Swap | 125× | Varies for dated futures |
| KuCoin Futures | exchange-set | Read from KuCoin's contract metadata at runtime. No hard-coded TVH-internal cap. |
| Coinbase Futures | exchange-set | Per-product tier |
| Hyperliquid Perps | exchange-set | Per symbol, roughly 3× to 40×. Some markets are isolated-only |
| Bitget Futures | exchange-set | Read from Bitget's contract metadata at runtime. 150× on BTCUSDT, 20× on most RWA contracts and 100× at the top |
Spot trading has no leverage unless you explicitly opt into margin mode (Binance Margin, OKX instrumentType: "margin").
Keeping this page accurate
These matrices reflect live TVH behaviour across all 18 exchange identifiers: symbol formats, demo support, feature flags, and leverage caps.
If this page ever drifts from what you see in production (a new symbol format, a new identifier), please file an issue. See the LLM schema for an auto-generated source of truth.