在這之前的兩篇文章講完了 API 創建和數據獲取,接下來就是交易部分了。如果看到這裡的同學還沒有註冊幣安的話可以用我的邀請鏈接註冊獲得手續費減免(讓我可以拿一點返佣就當是對我的鼓勵啦哈哈哈😘 ):https://accounts.binance.com/register?ref=DPVSZVI3
我們這裡都是以 python 的ccxt
庫裡面封裝好的幣安 API 接口作為示例的,在上一章我們已經安裝並實例化了交易所類exchange
,如果還不會的同學可以回去看看上一篇文章。
1. 現貨賬戶與合約賬戶#
在上一節我們實例化交易所類時提到了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'}
})
2. 限價委託#
現貨的限價委託與合約使用的是同一個函數,只不過合約還需要指定槓桿倍數,再講完市價與限價委託之後再寫如何設置槓桿。
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.
正常情況下運行完上面那個限價買入的代碼後查看現貨交易可以看到相應的委託,可以設置一個較小的委託價格進行測試:
3. 市價委託#
現貨與合約市價委託同樣使用同一個函數。
exchange.create_market_buy_order(symbol='BTC/USDT', amount=0.01)
只需要指定兩個參數:
symbol
同樣是交易的標的符號amount
就是交易的數量
市價委託不需要指定價格,如果賬戶餘額足夠,執行完這個函數馬上就會買入相應數量的倉位,因此這裡就不作演示了。
同理賣出函數為create_market_sell_order()
,參數同上。
4. 創建訂單#
上面的兩個函數都是針對特定的委託以及方向使用不同的函數,但是實際上一個函數就可以全部搞定。
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()
函數等,通過上面的解釋應該可以從名字就看出來函數是幹什麼的。
5. 設置合約槓桿#
再使用合約賬戶進行交易時,如果不指定槓桿倍數,默認會使用你最後一次在圖形界面設置的槓桿倍數進行交易,如果需要進行設置的話就需要使用set_leverage()
,有兩個參數symbol
和leverage
:即交易的標的符號和槓桿倍數(int 類型)。
因此合約開單前最好固定加上set_leverage()
設置槓桿倍數:
exchange.set_leverage(10, 'JUP/USDT')
exchange.create_order('JUP/USDT', 'limit', 'buy', 6, 0.9)