推送带杠杆与保证金,名义额默认抬到 500

杠杆只影响占用保证金,**不改**名义敞口、手续费、滑点、盈亏绝对值——费与滑点
都按名义额收。所以「用杠杆所以可以很小额」这个方向要说清:杠杆省的是本金
占用,不是成本。

它真正的用处是让「抬名义额」几乎免费,而抬名义额正好压掉步长取整。实测
取整到步长偶数倍后最差币的名义偏差:100U → 6.7%(SOL)、500U → 1.8%、
1000U → 0.6%。所以默认名义改 500、杠杆 10x,每笔占 50 USDT 保证金。

止损在 2 ATR ≈ 0.2%,而 10x 的强平约需逆向 10% = 100 个 ATR,差 50 倍。
这个止损紧到杠杆几乎不引入强平风险,所以这里没有「杠杆换风险」的取舍。
仍建议逐仓,让每笔最大损失被保证金封住。

推送里加上占用保证金与「触止损亏多少 USDT / 占保证金百分之几」,手工执行时
不必自己换算。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
jack
2026-08-28 15:44:39 +08:00
co-authored by Cursor
parent c57adc8cb0
commit f716ddd149
3 changed files with 28 additions and 5 deletions
+2 -1
View File
@@ -116,7 +116,8 @@ docker run -d --name "$NAME" -w /home/hummingbot \
-e SHADOW_INCR="${SHADOW_INCR:-1}" \
-e TG_TOKEN="${TG_TOKEN:-}" \
-e TG_CHAT="${TG_CHAT:-}" \
-e TG_NOTIONAL="${TG_NOTIONAL:-200}" \
-e TG_NOTIONAL="${TG_NOTIONAL:-500}" \
-e TG_LEVERAGE="${TG_LEVERAGE:-10}" \
-e TG_STALE_S="${TG_STALE_S:-90}" \
-v "$REPO_ROOT:/repo:ro" \
-v "$OUT:/out" \
+9 -2
View File
@@ -6,8 +6,15 @@
# 返回的 result[0].message.chat.id 就是
export TG_TOKEN=""
export TG_CHAT=""
# 每笔名义额(USDT)。小额实盘先用小的,它只影响推送里的下单数量
export TG_NOTIONAL="200"
# 每笔名义额(USDT)。杠杆**不改**手续费与滑点(都按名义额收),所以抬名义额
# 是有真实成本的;抬它的唯一理由是压掉步长取整:实测最差币的偏差
# 100U → 6.7%(SOL)、500U → 1.8%、1000U → 0.6%。
export TG_NOTIONAL="500"
# 杠杆只影响占用保证金,不影响名义敞口/手续费/滑点/盈亏绝对值。
# 名义 500 在 10x 下占 50 USDT 保证金;止损在 2 ATR ≈ 0.2%,而 10x 强平约需
# 逆向 10% = 100 个 ATR,差 50 倍,所以这里的杠杆几乎不引入强平风险。
# 交易所侧记得设**逐仓**,让每笔最大损失被保证金封住。
export TG_LEVERAGE="10"
# 距「参考价成立」超过这么多秒就标为已失效。参考价是次根开盘价,
# 过了就不是回测那个成交价了
export TG_STALE_S="90"
+17 -2
View File
@@ -33,7 +33,14 @@ import time
TOKEN = os.environ.get("TG_TOKEN", "")
CHAT = os.environ.get("TG_CHAT", "")
NOTIONAL = float(os.environ.get("TG_NOTIONAL", "200"))
# 名义额。杠杆不改手续费与滑点(都按名义额收),所以抬名义额是有真实成本的;
# 抬它的理由只有一个:把步长取整压下去。实测最差币的偏差
# 100U → 6.7%(SOL)、500U → 1.8%、1000U → 0.6%。
NOTIONAL = float(os.environ.get("TG_NOTIONAL", "500"))
# 杠杆只影响占用保证金,不影响名义敞口、手续费、滑点、盈亏绝对值。
# 止损在 2 ATR ≈ 0.2%,而 10x 的强平约需逆向 10% = 100 个 ATR,差 50 倍,
# 所以这里的杠杆几乎不引入强平风险。逐仓,让每笔的最大损失被保证金封住。
LEVERAGE = float(os.environ.get("TG_LEVERAGE", "10"))
STALE_S = float(os.environ.get("TG_STALE_S", "90"))
ENABLED = bool(TOKEN and CHAT)
@@ -140,11 +147,16 @@ def build(sym: str, direction: int, entry: float, atr_pct: float,
qty, half = quantize(NOTIONAL, entry, rule)
tick = rule["tick"]
lv = {k: snap_px(v, tick) for k, v in lv.items()}
qty_line = (f"入场 {qty:.6g} 币 ≈ {qty * entry:,.1f} USDT"
notional = qty * entry
qty_line = (f"入场 {qty:.6g} 币 ≈ {notional:,.1f} USDT"
f" · 减半腿 {half:.6g} 币(正好一半)")
else:
qty = NOTIONAL / entry
notional = NOTIONAL
qty_line = f"入场 {qty:.6g} 币 ≈ {NOTIONAL:,.0f} USDT(未取整)"
margin = notional / LEVERAGE if LEVERAGE > 0 else notional
# 止损距入场 2 ATR,换成保证金的百分比才是「这笔最多亏多少本金」
loss_pct = SL_ATR * atr_pct * LEVERAGE * 100
head = f"⛔ 已失效({age_s:.0f}s > {STALE_S:.0f}s)· 不要入场" if stale \
else f"{side} {sym}"
@@ -153,6 +165,9 @@ def build(sym: str, direction: int, entry: float, atr_pct: float,
"",
f"参考成交价 {_fmt(lv['entry'])} ← 回测口径(次根开盘)",
qty_line,
f"{LEVERAGE:.0f}x 逐仓 → 占用保证金 {margin:,.1f} USDT"
f" · 触止损亏 {notional * SL_ATR * atr_pct:,.2f} USDT"
f"(保证金的 {loss_pct:.1f}%",
f"距参考价成立 {age_s:.1f}s(含数据延迟 {lag_ms:.0f}ms,不可压缩)",
"",
f"止损 {_fmt(lv['stop'])} 2 ATRstop-market,全仓)",