自动交易陷阱 · 永续合约

为什么你的 TradingView
自动下单开仓大小不对

qty_type=usdt vs margin_usdt — 语意陷阱完整解说

2026-06-05·8 分钟阅读·所有 TradingView 自动交易桥接用户必看

你的 TradingView Alert 写了 qty: 20leverage: 3。 理论上应该开 $60 仓位。实际打进交易所只开 $20。**这不是 bug**, 是永续合约 qty_type 一个会吃掉很多自动交易用户的语意陷阱。 本文用真实 Binance fill 对照、五种计算方式拆解、Pine alert 范本, 一次讲清楚怎么避开。

TL;DRqty_type=usdt 表示qty 就是仓位名义价值(leverage 只影响保证金需求、不放大仓位)。 想要「20 USDT × 3x 杠杆 = $60 仓位」这种散户直觉,应该用qty_type=margin_usdt。三秒解法:把 payload 的"qty_type": "usdt" 改成"qty_type": "margin_usdt"

真实案例:NEAR 永续测试开单

一个 TVSBot 用户设了 TradingView Alert 跑 1 小时短线策略,payload 如下:

{
  "secret": "...",
  "strategy": "NEAR测试",
  "side": "buy",
  "symbol": "NEARUSDT",
  "exchange": "binance",
  "market_type": "futures",
  "order_type": "market",
  "qty_type": "usdt",
  "qty": 20,
  "leverage": 3
}

他预期:20 USDT × 3 倍杠杆 = 60 USDT 仓位。实际 Binance fill 出来:

数量 / 成交数量 (USDT):  19.592 / 19.592
均价 / 价格:             2.449 / 市价
手续费:                  0.00001478 BNB

仓位只有 $19.6 名义价值(成交 NEAR ≈ 8 颗 × $2.449)。 杠杆 3x 并没有让仓位变成 $60。看起来「leverage 没生效」, 但其实 leverage 完全有生效 — 只是它影响的是保证金需求而不是仓位大小

为什么这跟你的直觉相反

散户大脑的模型通常是:「我有 20 USDT 想开仓,用 3 倍杠杆放大成 $60 仓位」。 这个直觉对应的是保证金视角 — 你出 X 元保证金、交易所给你 Y 倍曝险。

但交易所 API 视角不同。永续合约下单时,你直接告诉交易所 「我要开 N USDT 名义价值的仓位」,leverage 是另一个独立参数 (只决定这笔名义要扣多少保证金)。所以:

# 交易所 API 语意(多数桥接套用 qty_type=usdt 的解读)
notional  = qty                      # 你说 20 就是 20 USDT 名义
margin    = notional / leverage      # 自动算保证金 = 20/3 ≈ $6.67

结果:你被扣 ~$6.67 保证金、开了 $20 仓位、杠杆 3x。**对交易所而言完全正确。** 但跟你脑中「我用 20 元 × 3 倍 = 60 元曝险」完全不一样。

五种 qty_type 完整对照

TVSBot 支援 5 种 qty_type,每种对应一种计算方式。以下用 相同情境(qty=20、leverage=3、symbol=BTCUSDT 假设 $50,000)展示差异:

qty_typeqty 的意思实际仓位保证金
⭐ margin_usdt保证金 USDT$60$20
margin_pct用余额的 X% 当保证金依余额算余额 × X%
fixed写死数量(颗数)20 × $50,000 = $1M ⚠️$333,333
percentUSDT 余额 %余额 × 20%余额 × 20% / lev
⚠️ usdt仓位 notional$20$6.67

重点不是哪个「对」 —5 种都对,差别是你想用哪个心智模型计算

为什么这个 trap 不只是 TVSBot 的事

几乎所有 TradingView 自动交易桥接都有这个语意陷阱。差别只是「谁会帮你挡」:

3Commas

DCA bot 预设用「保证金 USDT」逻辑(自己乘 leverage),但 SmartTrade API 的 units 字段是 base currency 颗数, 换 USDT 又是另一种解读。同一平台不同产品内语意不一致是常见坑。

TradingConnector / Pine 内建 strategy.order

Pine 的 strategy.order(qty=X) 在 backtest 是 base 颗数、 串自动下单 webhook 后常需手动换算成 notional/margin — 很多人 backtest 报酬曲线跟实盘不一样,第一个嫌疑犯就是这个。

CCXT 直接写 bot

create_order(amount=X) 的 amount 各所定义不一: Binance Futures USDT-M 是 base 颗数、COIN-M 是合约张数、 OKX swap 又有自己的 contract size。**没一个自动桥接能逃过这个翻译层**。

这就是为什么 TradingView 自动交易桥接这品类存在 — 把交易所 API 那层丑陋的「合约规格 × qty 语意 × 杠杆关系」抽象掉,给 trader 直觉的选项。 但抽象做得不好就会变成新陷阱

TVSBot 怎么挡

本月(2026 年 6 月)我们做了 3 个改动避免新用户踩坑:

1. 策略编辑页 dropdown 把 margin_usdt 设为 futures 推荐预设,标 ⭐ 并写成「保证金 USDT(推荐:你用 X USDT × 杠杆开单)」。 usdt 改成「仓位 USDT(进阶:直接指定名义价值)」。

2. 选 usdt 即时跳黄色警示: 「仓位固定 $X、leverage 只影响保证金需求(不会放大仓位)」。 选 margin_usdt 跳绿色算式:「用 20 USDT × 3x → 仓位 $60」。 进场前先看清楚数字。

3. 市集策略发布页同步:策略作者设信号预设参数时 也是 margin_usdt 排第一 + 范例 placeholder 写「20(保证金,× 杠杆 = 仓位)」。 订阅者照 KOL 设定跑时,自然落在直觉对的那条轨道。

三秒解法:你现在能改的

# 把 TradingView Alert payload 改成:
{
  "secret": "...",
  "strategy": "NEAR测试",
  "side": "buy",
  "symbol": "NEARUSDT",
  "exchange": "binance",
  "market_type": "futures",
  "qty_type": "margin_usdt",  // ← 改这行
  "qty": 20,
  "leverage": 3
}
# 结果:保证金 $20、仓位 $60、杠杆 3x ✓

下次 Alert 触发、Binance 那边就会看到正确的 $60 名义仓位。 不用改 Pine、不用改任何 backtest — 只改这一个字串。

常被一起踩的两个变形

变形一:margin_pct 的 100 是「100」还是「100%」?

答:TVSBot 的 margin_pct: 10 表示「用余额 10%」,不是 10 元。 如果你写 margin_pct: 100,那是用整个余额当保证金、 搭配 leverage 开超大仓。容易爆。

变形二:fixed 在 perpetual 上的单位

Binance USDT-M futures 的 fixed qty 是「BTC 颗数」。 所以 qty_type=fixed, qty=20 在 BTC 上意思是「20 颗 BTC」、 $50k 一颗就是 $1M 名义仓位。误踩会直接被交易所挡 (超过杠杆上限),但偶尔会在小币(如 NEAR)成功送进去然后当天就爆。fixed 永远先在 testnet 验一次

如何验证你的设定是对的

三招都用,最保险:

  1. TVSBot Dry-run 模式:策略开 dry-run,TV alert 触发后看 dashboard 信号详情页的「resolved qty」字段 — 那是真实会送出去的数字。
  2. 交易所小资金:实盘先用最小单位试一次,看交易所成交视窗的 「名义价值」字段跟你预期是否一致。
  3. 看 TVSBot 信号通知:成功下单后 TG / app 通知会写名义 $X / 保证金 $Y,跟你心中的数对得起来就 OK。

Get started

想把今天学到的东西自动化跑起来?

TVSBot 非托管 TradingView → 交易所自动下单,支援 Binance / OKX / Bitget / Bybit / Gate / BingX / Hyperliquid 共 7 家。本月刚把 qty_type UX 改到位 — 预设挑直觉对的、不直觉的选项加即时警示。

免费试用 3 天