如何通过Binance API在不平仓的情况下调整持仓规模(Python实现)
Binance API 不平仓调整持仓规模方案
一、现货持仓调整(无需平仓)
现货本身没有“持仓方向”或“平仓”的概念,持有资产就是直接持有,调整规模直接通过买卖订单实现,不需要任何平仓操作:
- 加仓:直接提交限价/市价买单,使用
POST /api/v3/order端点,指定要购买的数量即可,会直接累加现有持仓量。 - 减仓:直接提交限价/市价卖单,指定要卖出的数量,会直接减少现有持仓量,剩余持仓保留。
你之前使用的POST /api/v3/order其实就是正确的调整方式,可能是误解了现货的交易逻辑——现货不需要“平仓”,直接买卖对应数量就能完成持仓规模的动态调整。
Python示例(现货加仓):
import requests import hmac import hashlib import time API_KEY = "your_api_key" API_SECRET = "your_api_secret" BASE_URL = "https://api.binance.com" def create_spot_order(symbol, side, order_type, quantity): endpoint = "/api/v3/order" params = { "symbol": symbol, "side": side, # BUY 对应加仓,SELL 对应减仓 "type": order_type, # 可选 LIMIT 或 MARKET "quantity": quantity, "timestamp": int(time.time() * 1000) } # 生成API签名 query_string = "&".join([f"{k}={v}" for k, v in params.items()]) signature = hmac.new(API_SECRET.encode(), query_string.encode(), hashlib.sha256).hexdigest() params["signature"] = signature response = requests.post(BASE_URL + endpoint, headers={"X-MBX-APIKEY": API_KEY}, params=params) return response.json() # 示例:BTCUSDT现货加仓0.001 BTC(市价单) result = create_spot_order("BTCUSDT", "BUY", "MARKET", "0.001") print(result)
二、期货持仓调整(不平仓重开)
期货(U本位/fapi、币本位/dapi)的核心是利用单边持仓模式实现同方向加仓,或通过反向部分订单实现减仓,全程无需平仓重开:
1. 前提:切换到单边持仓模式
如果当前是双边持仓模式,先切换为单边模式(切换前需确保无未平仓持仓):
def set_futures_position_mode(dual_side_enabled): endpoint = "/fapi/v1/positionSide/dual" params = { "dualSidePosition": dual_side_enabled, # False = 单边模式,True = 双边模式 "timestamp": int(time.time() * 1000) } query_string = "&".join([f"{k}={v}" for k, v in params.items()]) signature = hmac.new(API_SECRET.encode(), query_string.encode(), hashlib.sha256).hexdigest() params["signature"] = signature response = requests.post("https://fapi.binance.com" + endpoint, headers={"X-MBX-APIKEY": API_KEY}, params=params) return response.json() # 切换为单边持仓模式 set_futures_position_mode(False)
2. 同方向加仓(无需平仓)
在单边模式下,直接提交同方向的期货订单即可完成加仓,持仓量会自动累加:
- 多单加仓:提交
BUY方向的期货订单(POST /fapi/v1/order) - 空单加仓:提交
SELL方向的期货订单
Python示例(U本位期货多单加仓):
def create_futures_order(symbol, side, order_type, quantity): endpoint = "/fapi/v1/order" params = { "symbol": symbol, "side": side, # BUY = 加多单,SELL = 加空单 "type": order_type, "quantity": quantity, "timestamp": int(time.time() * 1000) } query_string = "&".join([f"{k}={v}" for k, v in params.items()]) signature = hmac.new(API_SECRET.encode(), query_string.encode(), hashlib.sha256).hexdigest() params["signature"] = signature response = requests.post("https://fapi.binance.com" + endpoint, headers={"X-MBX-APIKEY": API_KEY}, params=params) return response.json() # 示例:BTCUSDT U本位期货多单加仓10 USDT(市价单) result = create_futures_order("BTCUSDT", "BUY", "MARKET", "10") print(result)
3. 部分减仓(无需全平重开)
在单边模式下,提交反向方向但数量小于当前持仓量的订单,即可实现部分减仓,剩余持仓会保留:
- 多单减仓:提交
SELL方向订单,数量为想要减少的持仓量 - 空单减仓:提交
BUY方向订单,数量为想要减少的持仓量
比如当前持有100 USDT多单,提交SELL方向50 USDT的市价单,持仓会直接变为50 USDT多单,无需全平后重开。
4. 双边持仓模式下的调整(可选)
如果必须使用双边模式,也可以在对应方向下新订单加仓——双边模式下多空持仓分开计算,同方向下单同样无需平仓,直接累加持仓量即可。
关键注意事项
- 期货操作前务必确保账户有足够保证金,避免触发爆仓机制。
- 所有Binance API私有请求都需要进行HMAC签名认证,示例中已包含完整签名逻辑。
- 可以通过
GET /fapi/v2/positionRisk(U本位)或GET /dapi/v1/positionRisk(币本位)查询当前持仓情况,确认调整结果。
内容的提问来源于stack exchange,提问作者Pablo Martinez
相关产品推荐
相关产品推荐

