使用 Binance API 完成交易(结合网格做空策略)
以下是基于 Binance Futures API 的实现指南,将之前的网格做空策略自动化执行。使用官方的 binance-futures-connector-python 库(Python 库),支持 USDT-M 永续合约的做空(SELL)订单。我们假设交易对为 BTCUSDT(可替换为其他新合约),初始设置基于之前计算:基础价 190.0496、下限 133.0347、网格 50 格、总仓位 6.7275 单位(按实际资金调整,例如以 USDT 为单位)。
风险提示:API 交易涉及高风险,包括资金损失。测试时使用测试网(testnet.binancefuture.com)。请阅读 Binance API 文档和风险披露。
1. 前提准备
- 创建 API 密钥:
- 登录 Binance 账户 > API 管理 > 创建新密钥。
- 启用“期货交易”权限,限制 IP(可选)。
- 获取 API Key 和 Secret Key。
- 安装库:
bash
pip install binance-futures-connector
- 测试网:为安全起见,先用测试网。替换 base_url 为 'https://testnet.binancefuture.com'。
2. API 设置与基本操作
使用 HMAC 认证(推荐)。以下是 Python 代码基础:
python
from binance.cm_futures import CMFutures
# 初始化客户端(替换为你的密钥)
api_key = 'your_api_key'
api_secret = 'your_api_secret'
client = CMFutures(key=api_key, secret=api_secret, base_url='https://fapi.binance.com') # 生产环境
# 查询账户余额(检查 USDT 可用余额)
account_info = client.account()
print(account_info) # 输出包括 'availableBalance' 等
# 设置杠杆(例如 10x)
client.change_leverage(symbol='BTCUSDT', leverage=10)
- 解释:
- account():返回账户信息,包括可用余额(用于检查是否足够开仓)。
- change_leverage():设置合约杠杆,防止爆仓。
3. 实现网格做空订单
网格策略:在下限到基础价区间,放置 50 个限价 SELL(做空)订单,每格数量 0.13455 单位(总仓位 / 50)。
- 计算网格价格:
- 价格间隔 = (基础价 - 下限) / 50 ≈ 1.1403
- 网格价格:从基础价向下递减到下限。
- 代码示例(放置多个限价做空订单):
python
import time # 用于延迟,避免 API 限频
# 参数(基于之前策略,调整为实际)
symbol = 'BTCUSDT' # 新合约符号
base_price = 190.0496
lower_limit = 133.0347
grid_count = 50
total_position = 6.7275 # 总仓位(USDT 价值)
quantity_per_grid = total_position / grid_count # ≈0.13455
# 计算价格间隔
price_interval = (base_price - lower_limit) / grid_count
# 放置网格订单
for i in range(grid_count):
price = base_price - (i * price_interval) # 从高到低放置限价 SELL
params = {
'symbol': symbol,
'side': 'SELL', # 做空
'type': 'LIMIT',
'timeInForce': 'GTC', # Good Till Cancel
'quantity': quantity_per_grid,
'price': round(price, 2) # 价格精度,根据合约调整
}
response = client.new_order(**params)
print(f"Placed SELL order at {price}: {response}")
time.sleep(0.5) # 延迟 0.5 秒,避免 API 频率限制
- 解释:
- 使用循环放置 50 个限价 SELL 订单,实现网格分布。
- new_order():核心方法,side='SELL' 表示做空。
- 如果需要市场订单(立即做空),将 'type' 改为 'MARKET' 并移除 'price'。
4. 加仓机制
当价格上涨到当前基础价 × 1.3 时,加仓 10% 并更新网格。
- 监控价格并加仓(示例循环):
python
# 初始参数
current_base = 190.0496
current_position = 6.7275
add_count = 0 # 已加仓次数
while add_count < 20:
# 获取当前价格(使用 ticker)
ticker = client.ticker_price(symbol=symbol)
current_price = float(ticker['price'])
if current_price >= current_base * 1.3:
# 加仓 10%
current_position *= 1.1
current_base *= 1.3
lower_limit = current_base * 0.7
quantity_per_grid = current_position / grid_count
# 取消旧订单(可选,如果需要重置网格)
client.cancel_all_open_orders(symbol=symbol)
# 重新放置新网格订单(同上循环)
for i in range(grid_count):
price = current_base - (i * ((current_base - lower_limit) / grid_count))
params = {
'symbol': symbol,
'side': 'SELL',
'type': 'LIMIT',
'timeInForce': 'GTC',
'quantity': quantity_per_grid,
'price': round(price, 2)
}
client.new_order(**params)
time.sleep(0.5)
add_count += 1
print(f"Add {add_count}: New base {current_base}, Position {current_position}")
time.sleep(60) # 每分钟检查一次
- 解释:
- 使用 ticker_price() 获取当前价格。
- 加仓后更新参数,重置网格订单。
5. 离场逻辑
当价格 ≤ 下限 且 24 小时成交量 < 2000t 时,平仓所有空单。
- 代码示例(监控并离场):
python
# 假设 't' 为 USDT 单位,调整为实际
volume_threshold = 2000
while True:
# 获取当前价格
ticker = client.ticker_price(symbol=symbol)
current_price = float(ticker['price'])
# 获取 24 小时成交量
ticker_24hr = client.ticker_24hr(symbol=symbol)
volume_24hr = float(ticker_24hr['quoteVolume']) # USDT 成交量
if current_price <= lower_limit and volume_24hr < volume_threshold:
# 平仓所有空单(市价平仓)
params = {
'symbol': symbol,
'side': 'BUY', # 平空(买入平仓)
'type': 'MARKET',
'quantity': current_position, # 全部仓位
'reduceOnly': True # 仅减仓
}
response = client.new_order(**params)
print(f"Exited: {response}")
break # 停止监控
time.sleep(60) # 每分钟检查
- 解释:
- ticker_24hr():获取 24 小时成交量(quoteVolume 为 USDT 单位)。
- new_order with 'reduceOnly': True:确保仅平仓。
- 如果 '2000t' 单位不同(例如吨),需澄清并调整 volume_24hr 的比较。
6. 监控订单
- 查询订单状态:
python
# 查询特定订单
order = client.query_order(symbol=symbol, orderId=your_order_id)
print(order)
# 查询所有开放订单
open_orders = client.get_open_orders(symbol=symbol)
print(open_orders)
- 完整脚本:将以上代码组合成一个脚本,运行前测试余额和杠杆。使用 try-except 处理错误(如 API 限频)。
注意事项
- API 限频:Binance 有请求限制(例如 1200/分钟),使用 time.sleep 控制。
- 错误处理:添加 try-except,例如处理 'Insufficient balance'。
- 测试:先用测试网运行完整策略。
- 新合约:替换 symbol 为新上线合约(查 Binance 公告)。
- 依赖:确保 Python 3+,无额外安装(库已包含所需)。