以下是基于 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+,无额外安装(库已包含所需)。