💡 國內提示:Binance 官網在中國大陸無法直連,訪問需自備網路工具;法幣入金不支援銀行卡,主要走 C2C(USDT↔CNY)通道完成。

Claude 寫 Binance 風控指令碼

加密圈有句話:“爆倉不是突然的事,是慢慢惡化的結果”。爆倉前 2-4 小時維持保證金率(MMR)通常已經很危險了,但很多人因為手機沒通知,等看到時已經被強平。

這篇用 Claude Code 寫了一個小指令碼監控 Binance U 本位合約賬戶的保證金健康度,低於閾值時立即 Telegram 推送。完整程式碼 + 部署。

需求描述(給 Claude)

寫一個 Python 指令碼監控 Binance 合約賬戶:

1. 用 Binance API Key(只勾"讀取"許可權)查 U 本位合約賬戶
2. 算每個開倉的 "維持保證金率"
   維持保證金率 = 維持保證金 / 賬戶餘額
3. 整個賬戶的健康度:
   - 安全:賬戶餘額/總維持保證金 > 5
   - 警戒:2-5
   - 危險:< 2(大機率爆倉程序啟動)
4. 危險時立即 Telegram 推送(含倉位明細 + 當前 MMR)
5. 每 10 分鐘跑一次
6. 用環境變數存 API key,不寫死在程式碼裡

一稿即可用的程式碼

binance_risk_monitor.py:

import os, time, hmac, hashlib, json, urllib.request, urllib.parse
from datetime import datetime

API_KEY = os.environ["BINANCE_API_KEY"]
API_SECRET = os.environ["BINANCE_API_SECRET"].encode()
TG_TOKEN = os.environ["TG_TOKEN"]
TG_CHAT_ID = os.environ["TG_CHAT_ID"]

BASE = "https://fapi.binance.com"

# 閾值
SAFE = 5.0    # 賬戶餘額 / 維持保證金
WARN = 2.0
DANGER = 1.2  # 低於這個立刻警報


def sign(params):
    ts = int(time.time() * 1000)
    params["timestamp"] = ts
    query = urllib.parse.urlencode(params)
    sig = hmac.new(API_SECRET, query.encode(), hashlib.sha256).hexdigest()
    return query + "&signature=" + sig


def api_get(path, params=None):
    query = sign(params or {})
    req = urllib.request.Request(f"{BASE}{path}?{query}",
                                 headers={"X-MBX-APIKEY": API_KEY})
    with urllib.request.urlopen(req, timeout=10) as r:
        return json.loads(r.read())


def send_tg(text):
    url = f"https://api.telegram.org/bot{TG_TOKEN}/sendMessage"
    data = json.dumps({"chat_id": TG_CHAT_ID, "text": text, "parse_mode": "Markdown"}).encode()
    req = urllib.request.Request(url, data=data,
                                 headers={"Content-Type": "application/json"})
    try: urllib.request.urlopen(req, timeout=5)
    except: pass


def check():
    """查賬戶 + 倉位"""
    account = api_get("/fapi/v2/account")
    wallet = float(account["totalWalletBalance"])
    maint = float(account["totalMaintMargin"])
    pnl = float(account["totalUnrealizedProfit"])
    
    if maint == 0:
        return  # 沒開倉
    
    ratio = (wallet + pnl) / maint
    status = "🟢 安全" if ratio > SAFE else ("🟡 警戒" if ratio > WARN else "🔴 危險")
    
    # 構造倉位明細
    positions = [p for p in account["positions"] if float(p.get("positionAmt", 0)) != 0]
    lines = []
    for p in positions:
        sym = p["symbol"]
        amt = float(p["positionAmt"])
        entry = float(p["entryPrice"])
        mark = float(p.get("markPrice", entry))
        unr = float(p.get("unrealizedProfit", 0))
        lev = p.get("leverage", "?")
        lines.append(f"`{sym}` x{lev} · {amt:+.4f} @ ${entry:,.2f} · 現價 ${mark:,.2f} · {unr:+.2f}")
    
    msg = f"""*{status}* · 合約賬戶健康度
賬戶餘額: `${wallet:,.2f}` ({pnl:+,.2f} 未實現)
總維持保證金: `${maint:,.2f}`
健康比率: `{ratio:.2f}x` (> {SAFE:.0f} 安全)

*倉位* ({len(positions)} 個):
""" + "\n".join(lines)
    
    # 只在警戒/危險時發,或者每天一次常規彙報(8:00)
    now = datetime.now()
    is_report_time = now.hour == 8 and now.minute < 10
    
    if ratio < WARN:
        send_tg(msg)
    elif ratio < DANGER:
        send_tg("🚨 *緊急* 3 小時內可能爆倉!\n\n" + msg)
    elif is_report_time:
        send_tg("📊 日報\n\n" + msg)


if __name__ == "__main__":
    try: check()
    except Exception as e:
        send_tg(f"⚠️ 監控指令碼報錯: {e}")

部署(同 Mac 本機)

LaunchAgent com.as.binance-risk.plist:

<key>StartInterval</key><integer>600</integer>
<key>EnvironmentVariables</key>
<dict>
    <key>BINANCE_API_KEY</key><string>YOUR_KEY</string>
    <key>BINANCE_API_SECRET</key><string>YOUR_SECRET</string>
    <key>TG_TOKEN</key><string>...</string>
    <key>TG_CHAT_ID</key><string>...</string>
</dict>

⚠️ API Key 建立時只勾"讀取"許可權,永遠不要勾"交易"或"提現"。讀取許可權足夠監控。

詳見 Binance API 安全配置指南。

實際訊息長啥樣

常規(日報):

📊 日報
🟢 安全 · 合約賬戶健康度
賬戶餘額: $2,340.50 (+45.20 未實現)
總維持保證金: $160.20
健康比率: 14.58x (> 5 安全)

倉位 (2 個):
  BTCUSDT x10 · +0.0250 @ $65,200 · 現價 $66,800 · +40.00
  ETHUSDT x5 · +0.5000 @ $3,400 · 現價 $3,450 · +5.20

警戒:

🟡 警戒 · 合約賬戶健康度
賬戶餘額: $890.50 (-120.00 未實現)
總維持保證金: $340.80
健康比率: 2.61x  ← 低於 5 的警戒線
(訊息正文)

緊急:

🚨 緊急 3 小時內可能爆倉!
🔴 危險 · 合約賬戶健康度
健康比率: 1.15x
...

預警的閾值怎麼設

Binance 爆倉閾值是健康比率 < 1(即餘額剛好等於維持保證金),但爆倉通常是一連串強平,真正觸發 < 1 時已經晚了。

所以我的三檔:

  • 5x(警戒線):還有緩衝,抓緊決策
  • 2x(危險線):最多 2 小時不採取措施就爆倉
  • 1.2x(緊急線):馬上平倉或補保證金

這三檔的意義:5x 的時候你還有充足時間做決定,2x 就必須立刻行動,1.2x 是最後的"救命線"。

什麼時候需要這個指令碼

一定要用:

  • 同時開多個合約倉位
  • 用了 > 5x 槓桿
  • 不是 24 小時盯盤
  • 情緒化操作容易(憤怒加倉、報復性扛單)

可能不用:

  • 只玩 1-2x 低槓桿(風險天然低)
  • 專業量化員(自己有完整風控框架)

延伸:更復雜的風控場景

這個指令碼能擴充套件:

  • 時間段敏感:美聯儲決議前 2 小時閾值提升,自動警報更嚴
  • 單幣種專門監控:某個幣最大倉位 > $X 立即警告
  • 止損關聯:檢測沒設止損的持倉
  • 多賬戶監控:不同賬戶同時監控(配置成 list)

Claude 幫我在 1 個月裡迭代了 4 個版本,每次擴充套件新需求只要跟它說話:

“加一個功能:當單個倉位的未實現虧損超過賬戶餘額 20% 時發警報”

10 分鐘就 OK 了。

總結

  • Binance API + Python 實現實時風控警報門檻極低
  • Claude Code 幫你處理 90% 的程式碼工作
  • 閾值 5x / 2x / 1.2x 三檔實戰好用
  • 可以持續迭代,永遠不嫌貴

做合約不戴頭盔(沒風控監控)不是勇敢,是賭。這指令碼 1 小時能寫完,每個搞合約的都應該有。

→ 合約風控體系完整教程 · 開 Binance 賬戶


延伸閱讀: