在这之前的两篇文章讲完了API创建和数据获取,接下来就是交易部分了。如果看到这里的同学还没有注册币安的话可以用我的邀请链接注册获得手续费减免(让我可以拿一点返佣就当是对我的鼓励啦哈哈哈😘 ):https://accounts.binance.com/register?ref=DPVSZVI3
我们这里都是以python的ccxt
库里面封装好的币安API接口作为示例的,在上一章我们已经安装并实例化了交易所类exchange
,如果还不会的同学可以回去看看上一篇文章。
在上一节我们实例化交易所类时提到了options
可选参数中指定了defaultType
为future
,即合约账户:
exchange = ccxt.binance({
'apiKey': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
'secret': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
'timeout': 30000,
'enableRateLimit': True,
'options': {'defaultType': 'future'}
})
这里的apiKey和secret需要替换成自己创建的API里面的值,其它参数不明白是什么意思的话可以返回上一章看看。
如果想要实例化现货账户的话,需要指定defaultType
为spot
:
exchange = ccxt.binance({
'apiKey': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
'secret': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
'timeout': 30000,
'enableRateLimit': True,
'options': {'defaultType': 'spot'}
})
现货的限价委托与合约使用的是同一个函数,只不过合约还需要指定杠杆倍数,再讲完市价与限价委托之后再写如何设置杠杆。
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/orderDuring 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.
正常情况下运行完上面那个限价买入的代码后查看现货交易可以看到相应的委托,可以设置一个较小的委托价格进行测试:
现货与合约市价委托同样使用同一个函数。
exchange.create_market_buy_order(symbol='BTC/USDT', amount=0.01)
只需要指定两个参数:
symbol
同样是交易的标的符号amount
就是交易的数量市价委托不需要指定价格,如果账户余额足够,执行完这个函数马上就会买入相应数量的仓位,因此这里就不作演示了。
同理卖出函数为create_market_sell_order()
,参数同上。
上面的两个函数都是针对特定的委托以及方向使用不同的函数,但是实际上一个函数就可以全部搞定。
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可以写成下面这样:
exchange.create_order('JUP/USDT', 'limit', 'buy', 6, 0.9)
除此之外还有create_market_order()
、create_limit_order()
函数等,通过上面的解释应该可以从名字就看出来函数是干什么的。
再使用合约账户进行交易时,如果不指定杠杆倍数,默认会使用你最后一次在图形界面设置的杠杆倍数进行交易,如果需要进行设置的话就需要使用set_leverage()
,有两个参数symbol
和leverage
:即交易的标的符号和杠杆倍数(int类型)。
因此合约开单前最好固定加上set_leverage()
设置杠杆倍数:
exchange.set_leverage(10, 'JUP/USDT')
exchange.create_order('JUP/USDT', 'limit', 'buy', 6, 0.9)