下载币安APP,立享高达 100 USDT 新手奖励!
2025-06-09
2026-07-15 0
币安 API 自动化交易不是“把策略接上账户就开跑”,而是先把行情读取、权限拆分、签名验证、测试下单、异常回查这几件事分清楚。用 Python 获取实时币价很容易,真正容易出问题的是把 Secret 写进代码、把测试请求当成正式订单、收到超时后重复下单,或在没有风控阈值的情况下让程序连续执行。

第一步不是写 Python,而是在币安账户的 API 管理里创建 Key。新手做自动化交易进阶练习时,建议先把“读行情”和“下单”拆成两个阶段:读取公开行情不需要账户权限;读取账户或执行交易才需要 API Key、Secret、签名和时间戳。刚开始不要直接打开退先权限,也不要把同一组 Key 同时放在多个脚本、云服务器和本地电脑里。
币安官方文档把接口安全类型分为公开市场数据、交易、账户数据和用户数据流等类别。公开行情可以先用无签名接口练习;下单属于交易权限,必须在 API 管理中启用对应权限,并带上 `X-MBX-APIKEY`、`timestamp`、`signature` 等参数。更稳妥的做法,是给只读坚控、下单执行、历史回测分别准备不同 Key,哪里出问题就撤销哪里。

最适合入门的行情接口是现货价格查询,路径是 `/api/v3/ticker/price`。它可以传入 `symbol=BTCUSDT` 获取单个交易对价格,也可以批量请求多个交易对。返回里最关键的字段是 `symbol` 和 `price`,价格通常是字符串,后续计算时再转成 `Decimal`,不要直接用浮点数处理金额。
import requests
from decimal import Decimal
BASE = "api.binance.com"
SCHEME = "https"
def get_price(symbol="BTCUSDT"):
endpoint = "/api/v3/ticker/price"
url = SCHEME + "://" + BASE + endpoint
res = requests.get(url, params={"symbol": symbol}, timeout=5)
res.raise_for_status()
data = res.json()
return data["symbol"], Decimal(data["price"])
symbol, price = get_price("BTCUSDT")
print(symbol, price)这段代码只做公开行情查询,不涉及账户资产,也不会下单。上线前要加三层检查:网络超时重试次数、返回状态码、交易对是否存在。币安接口会有请求权重和速率限制,频繁轮询同一个价格并不聪明;如果你要盯盘,REST 更适合低频检查,WebSocket 更适合连续接收推送。
如果策略需要连续跟踪价格,可以订阅现货 WebSocket 市场流。比如 `{symbol}@ticker` 会推送某个交易对 24 小时滚动窗口统计,更新速度为秒级;`{symbol}@miniTicker` 只保留更轻的价格字段,适合做屏幕展示、价格提醒或轻量坚控。写程序时要把交易对转成小写,例如 `btcusdt@ticker`。
import json
import websocket
STREAM_HOST = "stream.binance.com:9443"
stream = "btcusdt@ticker"
ws_url = "wss://" + STREAM_HOST + "/ws/" + stream
def on_message(ws, message):
data = json.loads(message)
print(data.get("s"), data.get("c"))
ws = websocket.WebSocketApp(ws_url, on_message=on_message)
ws.run_forever()WebSocket 不是下单按钮,它只是让你的程序更快收到行情变化。真实交易系统还要处理断线重连、重复消息、时间延迟、日志落盘和风控开关。欧意等平台也有类似行情推送,适合做价格对照,但下单执行要回到你实际授权的平台和交易对,不能把不同平台的价格直接混成同一个成交条件。
只要进入账户数据或交易接口,就不能只拼一个请求地址。币安签名请求会把参数组合成待签名字符串,再用 Secret Key 计算 HMAC-SHA256,生成 `signature` 后提交。参数里通常会包含 `symbol`、`side`、`type`、`quantity`、`price`、`timestamp` 和 `recvWindow`。其中 `timestamp` 用于判断请求时间,`recvWindow` 用于限制请求有效时间。

Secret Key 不要写死在 HTML、笔记、聊天记录或公开仓库里。Python 里可以从环境变量读取,部署到服务器时再通过系统环境或密钥管理工具注入。日志里也不要打印完整签名参数,因为参数、时间戳、Key 标识和错误信息凑在一起,已经足够暴露很多账户行为。
import os
import time
import hmac
import hashlib
from urllib.parse import urlencode
API_KEY = os.environ.get("BINANCE_API_KEY")
SECRET = os.environ.get("BINANCE_SECRET", "").encode()
def sign_params(params):
query = urlencode(params)
sig = hmac.new(SECRET, query.encode(), hashlib.sha256).hexdigest()
params["signature"] = sig
return params
params = {
"symbol": "BTCUSDT",
"side": "BUY",
"type": "LIMIT",
"timeInForce": "GTC",
"quantity": "0.001",
"price": "50000",
"recvWindow": "5000",
"timestamp": int(time.time() * 1000)
}
signed_params = sign_params(params)币安现货下单接口是 `/api/v3/order`,但进阶练习不应该第一步就打正式下单。更稳的路径是先用 `/api/v3/order/test` 校验签名、时间戳、参数格式和权限。测试接口会创建并验证订单请求,但不会把订单送进撮合引擎;等测试通过、日志正常、风控参数确认后,再考虑切换到正式下单。
import requests
def test_order(signed_params):
endpoint = "/api/v3/order/test"
url = SCHEME + "://" + BASE + endpoint
headers = {"X-MBX-APIKEY": API_KEY}
res = requests.post(url, headers=headers, data=signed_params, timeout=5)
return res.status_code, res.text
status, body = test_order(signed_params)
print(status, body)如果测试接口返回签名错误,先检查参数顺序、URL 编码、Secret 是否正确、系统时间是否同步;如果返回权限错误,先回到 API 管理确认是否启用交易权限和 IP 白名单;如果返回交易对或数量错误,先查交易规则,不要通过加大数量或换成市价单硬试。程序里的失败处理要默认“停下来查原因”,而不是自动改参数继续冲。

第一个闸门是交易对白名单,只允许脚本交易你预先写好的交易对。第二个闸门是单笔金额上限,比如每次只允许小额测试。第三个闸门是方向限制,先只允许买入或只允许卖出,避免策略条件写反。第四个闸门是人工开关,把 `LIVE_TRADING` 之类的变量默认为关闭,只有确认环境、Key、余额、数量和日志都正常后才手动开启。
正式调用 `/api/v3/order` 时,最好优先用限价单练习,因为限价单能让你看到价格、数量、成交状态和未成交订单之间的关系。市价单虽然写起来更短,但新手更容易忽略滑点、深度和成交均价。程序下单后,要立刻查询订单状态,不要只凭 HTTP 返回就判断已经成交。
自动化交易最怕“策略还没稳定,异常处理先失控”。遇到 429,要按限制退避,不要继续高频请求;遇到 418,说明 IP 可能已经被临时封禁;遇到 5XX 或超时,不能简单认为订单失败,因为请求状态可能未知。更稳的处理是记录 `clientOrderId`,再用订单查询接口确认是否已经生成订单。
日志至少要记录:时间、交易对、策略信号、请求参数摘要、返回状态、订单号、成交状态和错误码。不要记录 Secret,不要完整记录签名,不要把日志文件放到公开目录。自动化交易系统越小,日志越要清楚,因为真正排查时,你需要知道程序为什么下单、下了什么、接口怎么回、后续有没有补救动作。
建议按这个顺序练:先用 REST 获取 BTCUSDT 实时价格;再用 WebSocket 同一交易对;然后写一个只记录信号、不下单的策略;接着用 `/api/v3/order/test` 校验签名请求;最后再用小额限价单做正式环境验证。每一步都通过日志和截图确认后,再进入下一步。
币安 API 的优势是现货接口、WebSocket、签名机制、测试接口和文档体系都比较完整,适合从 Python 入门过渡到自动化交易框架。欧意等平台也可以作为行情和执行对照,但不要在同一个脚本里混用不同平台的账户权限。自动化交易的核心不是让程序替你冒险,而是让每一次读取行情、生成信号、验证参数、执行下单和回查状态都有清楚边界。