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),XBTUSD(BitMex). - Demo Account checkbox works for Binance Spot, Binance Futures USD-M, Bybit (Spot + Futures), OKX, Hyperliquid (Perps + Spot) and Bitget. Binance Coin-M + BitMex use separate testnet identifiers 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. |
bitmex | XBTUSD | XBT = BTC (legacy naming). Quarterly: XBTM26. |
bitmex-testnet | XBTUSD | Same format as live. |
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) |
| BitMex | ❌ | bitmex-testnet |
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 | BitMex |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 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 | ✅ | ✅ |
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 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ⚠️ | ⚠️ |