币安Binance API使用（三、现货合约交易）

在这之前的两篇文章讲完了 API 创建和数据获取，接下来就是交易部分了。如果看到这里的同学还没有注册币安的话可以用我的邀请链接注册获得手续费减免（让我可以拿一点返佣就当是对我的鼓励啦哈哈哈😘 ）：https://accounts.binance.com/register?ref=DPVSZVI3

我们这里都是以 python 的ccxt库里面封装好的币安 API 接口作为示例的，在上一章我们已经安装并实例化了交易所类exchange，如果还不会的同学可以回去看看上一篇文章。

1. 现货账户与合约账户

在上一节我们实例化交易所类时提到了options可选参数中指定了defaultType为future，即合约账户：

Copy
exchange = ccxt.binance({
'apiKey': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
'secret': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
'timeout': 30000,
'enableRateLimit': True,
'options': {'defaultType': 'future'}
})

这里的 apiKey 和 secret 需要替换成自己创建的 API 里面的值，其它参数不明白是什么意思的话可以返回上一章看看。

如果想要实例化现货账户的话，需要指定defaultType为spot：

Copy
exchange = ccxt.binance({
'apiKey': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
'secret': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
'timeout': 30000,
'enableRateLimit': True,
'options': {'defaultType': 'spot'}
})

2. 限价委托

现货的限价委托与合约使用的是同一个函数，只不过合约还需要指定杠杆倍数，再讲完市价与限价委托之后再写如何设置杠杆。

Copy
exchange.create_limit_buy_order(symbol='JUP/USDT', amount=6, price=0.9)

很容易从参数名字看出来它的含义：

symbol就是需要交易的标的符号

amount即买入的数量（这个数量不是花费的 USDT 的数量，而是你买入的币的数量，比如我这里是买入 6 个 JUP，卖出也是同理）

price即委托价格

同理卖出的函数为create_limit_sell_order()，参数意义与上面一样。

使用这些函数时需要账户里有足够的金额，且在非只减仓的情况下需要交易金额大于 5USDT，否则返回错误代码如下：

root@vultr:~/transaction/main# python3 test.py JUP/USDT
Traceback (most recent call last):
File "/usr/local/lib/python3.10/dist-packages/ccxt/base/exchange.py", line 629, in fetch
response.raise_for_status()
File "/usr/lib/python3/dist-packages/requests/models.py", line 943, in raise_for_status
raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 400 Client Error: Bad Request for url: https://api.binance.com/api/v3/order

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/root/transaction/main/test.py", line 247, in
exchange.create_limit_buy_order(COIN, 6, 0.9)
File "/usr/local/lib/python3.10/dist-packages/ccxt/base/exchange.py", line 4493, in create_limit_buy_order
return self.create_order(symbol, 'limit', 'buy', amount, price, params)
File "/usr/local/lib/python3.10/dist-packages/ccxt/binance.py", line 5554, in create_order
response = self.privatePostOrder(request)
File "/usr/local/lib/python3.10/dist-packages/ccxt/base/types.py", line 35, in unbound_method
return _self.request(self.path, self.api, self.method, params, config=self.config)
File "/usr/local/lib/python3.10/dist-packages/ccxt/binance.py", line 10280, in request
response = self.fetch2(path, api, method, params, headers, body, config)
File "/usr/local/lib/python3.10/dist-packages/ccxt/base/exchange.py", line 3643, in fetch2
return self.fetch(request['url'], request['method'], request['headers'], request['body'])
File "/usr/local/lib/python3.10/dist-packages/ccxt/base/exchange.py", line 645, in fetch
skip_further_error_handling = self.handle_errors(http_status_code, http_status_text, url, method, headers, http_response, json_response, request_headers, request_body)
File "/usr/local/lib/python3.10/dist-packages/ccxt/binance.py", line 10224, in handle_errors
self.throw_exactly_matched_exception(self.exceptions['exact'], message, self.id + ' ' + message)
File "/usr/local/lib/python3.10/dist-packages/ccxt/base/exchange.py", line 4013, in throw_exactly_matched_exception
raise exactstring
ccxt.base.errors.InsufficientFunds: binance Account has insufficient balance for requested action.

正常情况下运行完上面那个限价买入的代码后查看现货交易可以看到相应的委托，可以设置一个较小的委托价格进行测试：

3. 市价委托

现货与合约市价委托同样使用同一个函数。

Copy
exchange.create_market_buy_order(symbol='BTC/USDT', amount=0.01)

只需要指定两个参数：

symbol同样是交易的标的符号

amount就是交易的数量

市价委托不需要指定价格，如果账户余额足够，执行完这个函数马上就会买入相应数量的仓位，因此这里就不作演示了。

同理卖出函数为create_market_sell_order()，参数同上。

4. 创建订单

上面的两个函数都是针对特定的委托以及方向使用不同的函数，但是实际上一个函数就可以全部搞定。

Copy
def create_order(
symbol: str,
type: OrderType,
side: OrderSide,
amount: float,
price: float = None,
params: Any = {}
) -> Order

多了两个参数type和side：

type即委托类型，可以为市价market或限价limit

side即方向，可以为买入buy或卖出sell

price默认为None，因为如果是市价委托就可以不指定价格

因此最开始的那个限价买入 JUP 可以写成下面这样：

Copy
exchange.create_order('JUP/USDT', 'limit', 'buy', 6, 0.9)

除此之外还有create_market_order()、create_limit_order()函数等，通过上面的解释应该可以从名字就看出来函数是干什么的。

5. 设置合约杠杆

再使用合约账户进行交易时，如果不指定杠杆倍数，默认会使用你最后一次在图形界面设置的杠杆倍数进行交易，如果需要进行设置的话就需要使用set_leverage()，有两个参数symbol和leverage：即交易的标的符号和杠杆倍数（int 类型）。

因此合约开单前最好固定加上set_leverage()设置杠杆倍数：

Copy
exchange.set_leverage(10, 'JUP/USDT')
exchange.create_order('JUP/USDT', 'limit', 'buy', 6, 0.9)