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),BTC-USDT-SWAP(OKX),XBTUSDTM(KuCoin Futures),BTC-USD-PERP(Coinbase Futures),XBTUSD(BitMex). - Demo Account checkbox works for Binance Spot, Binance Futures USD-M, Bybit (Spot + Futures), and OKX. Binance Coin-M + BitMex use separate testnet identifiers instead.
- Hedge Mode is supported on Binance Futures (USD-M + Coin-M) via
hedgeMode, 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. |
bitmex | XBTUSD | XBT = BTC (legacy naming). Quarterly: XBTM26. |
bitmex-testnet | XBTUSD | Same format as live. |
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 | ❌ | ❌ |
| 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 | 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 | ❌ | n/a |
Sub-accounts (via named apiKey) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ |
| DCA / Order-Mesh | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Scaled orders | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
postOnly | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
reduceOnly | 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 |
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 |
| Math expressions (SL/TP) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Limit-order chasing | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ⚠️ | ⚠️ | ✅ |
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·percent·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 |
| BitMex | 100× | XBT pairs; lower on alts |
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 16 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.