为什么你的 TradingView
自动下单开仓大小不对
qty_type=usdt vs margin_usdt — 语意陷阱完整解说
你的 TradingView Alert 写了 qty: 20 加 leverage: 3。 理论上应该开 $60 仓位。实际打进交易所只开 $20。**这不是 bug**, 是永续合约 qty_type 一个会吃掉很多自动交易用户的语意陷阱。 本文用真实 Binance fill 对照、五种计算方式拆解、Pine alert 范本, 一次讲清楚怎么避开。
qty_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_type | qty 的意思 | 实际仓位 | 保证金 |
|---|---|---|---|
| ⭐ margin_usdt | 保证金 USDT | $60 | $20 |
| margin_pct | 用余额的 X% 当保证金 | 依余额算 | 余额 × X% |
| fixed | 写死数量(颗数) | 20 × $50,000 = $1M ⚠️ | $333,333 |
| percent | USDT 余额 % | 余额 × 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。**没一个自动桥接能逃过这个翻译层**。
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 验一次。
如何验证你的设定是对的
三招都用,最保险:
- TVSBot Dry-run 模式:策略开 dry-run,TV alert 触发后看 dashboard 信号详情页的「resolved qty」字段 — 那是真实会送出去的数字。
- 交易所小资金:实盘先用最小单位试一次,看交易所成交视窗的 「名义价值」字段跟你预期是否一致。
- 看 TVSBot 信号通知:成功下单后 TG / app 通知会写
名义 $X / 保证金 $Y,跟你心中的数对得起来就 OK。
Get started
TVSBot 非托管 TradingView → 交易所自动下单,支援 Binance / OKX / Bitget / Bybit / Gate / BingX / Hyperliquid 共 7 家。本月刚把 qty_type UX 改到位 — 预设挑直觉对的、不直觉的选项加即时警示。
免费试用 3 天