更多精彩內容,歡迎關注公眾號:數量技術宅,也可添加技術宅個人微信號:sljsz01,與我交流。
大多數情況下,我們使用ccxt接口連接行情、交易,默認接入的都是幣幣交易(spot)。其實,ccxt還有一個強大的隱藏功能,它也能用來交易數字貨幣期貨,也就是我們通常說的合約,包括交割合約、永續合約、幣本位合約、U本位合約,只要ccxt封裝了交易所的相關API,我們就可以實現對應的交易。有了這個利器,我們甚至可以用ccxt做一些期現套利,以及跨交易所的期貨策略。
ccxt的官方幫助文檔中,並沒有詳細介紹如何用ccxt交易合約,我們通過這篇文章為大家總結。
CCXT的顯式調用與隱式調用
介紹如何使用ccxt調用期貨方法之前,我們先來看兩個重要的概念:顯式調用與隱式調用。
顯式調用很好理解,就算用ccxt封裝的統一接口,來完成行情獲取、交易等相關的操作。對於ccxt所支持的每一個交易所,我們都可以用同樣的方式,只需更改交易所的名稱,即可用同樣的代碼,在不同交易所,完成同樣的操作。我們來看以下代碼示例:
import ccxt
binance = ccxt.binance()
okex = ccxt.okex()
spot_symbol = "BTC/USDT"
# fetch_order_book
spot_depth = binance.fetch_order_book(spot_symbol)
spot_depth = okex.fetch_order_book(spot_symbol)
# limit_buy_order
binance.create_limit_buy_order(spot_symbol, amount, price)
okex.create_limit_buy_order(spot_symbol, amount, price)
關於顯式調用,ccxt的幫助文檔中已經介紹的比較詳細了,大家有不清楚的可以參照github上ccxt的manual,我們在這里不在贅述。我們重點來看ccxt的隱式調用。隱式調用在ccxt的官方文檔中,幾乎是一筆帶過,僅僅告訴我們,使用dir()命令,我們可以獲取該交易所ccxt支持的隱式方法。
我們根據上述的說明,以幣安交易所為例,通過dir(ccxt.binance()),查看幣安交易所的隱式方法,由於隱式的方法實在太多,我們只能截取部分方法來顯示。
在這些方法中,我們看到了一些共同的抬頭,比如dapi、fapi、sapi,其實,這些抬頭的API,就分別是幣安某個合約接口(比如u本位永續、幣本位交割、幣本位永續)的特有類別的API。如此多的方法,讓我們看的眼花繚亂,那么我們如何知道,每個方法該如何使用,參數又該如何傳入、傳入哪些。
這就需要我們對照幣安交易所的API,來為大家解釋了。我們以u本位合約獲取所有交易對的api為例,我們先看幣安api說明對於這個方法的描述,仔細看這個api的地址GET /fapi/v1/exchangeInfo。
我們再在dir(ccxt.binance())的顯示結果中搜索“exchangeInfo”。我們看到fapi開頭的方法中,有如下幾個,這些方法,其實是一個方法(ccxt分為駝峰和下划線,兩種命名方式),fapiPublicGetExchangeInfo,這個方法,是將GET /fapi/v1/exchangeInfo這個原始api的關鍵詞,按照一定的順序排列組合起來,並且在里面加上了Public。因為這是一個所有人都可以查詢得到的公有方法。如果方法中包含Private字樣,說明該方法是原始api中的私有方法。所以說,我們對於每個原始api,都可以用他的關鍵詞,在ccxt的隱式方法列表中查詢,如果能夠查詢到該關鍵詞的方法,而且方法的其他字段,也與該方法的原始請求地址一致,那么說明該方法,極有可能就是原始api封裝的隱式方法。
我們通過實例來驗證,由於fapiPublicGetExchangeInfo是不需要傳入參數的,我們直接調用symbols = binance.fapiPublicGetExchangeInfo(),這個方法,並看一下這個方法返回的symbols 結果。通過比較ccxt隱式方法返回的結果,與api說明中的返回一致,取到了u本位所有的交易幣種信息,的確和api中的描述一樣。由此可以判斷,我們調用隱式方法的思路是正確的。
隱式調用:接收行情
我們剛才調用的binance.fapiPublicGetExchangeInfo(),已經給我們列出了所有在幣安能夠交易的U本位合約,並且每個symbols list里的symbol字段,就是幣安交易所的u本位合約標准字段。我們以'BTCUSDT'字段為例,調用U本位合約的隱式api,來獲取深度行情。
首先,還是來看一下幣安u本位合約行情的api說明。與exchangeInfo不同的是,深度行情的獲取,需要傳入參數,參數列表有兩個,分別是symbol和limit,大家需要特別注意后面這個是否必需的字段,Yes代表該參數必須傳,No代表該參數可以傳,也可以按系統指定的默認值來。
我們再按照剛才的規則,找到ccxt對於幣安u本位合約獲取深度行情的隱式方法:fapiPublicGetDepth。該函數,同樣符合我們之前所推斷的命名規則。我們調用該函數,按照格式要求傳入symbol函數,執行深度數據的獲取。
ba_futures_symbol = "BTCUSDT"
future_depth = binance.fapiPublicGetDepth({"symbol":ba_futures_symbol})
通過返回結果可以看到,我們成功的使用隱式方法,調取到了幣安u本位BTCUSDT合約的深度數據。
而對於OKEX交易所來說,我們也可以遵循同樣的步驟,來獲取OK我們需要幣種(合約)的深度數據。我們還是通過print(dir(ccxt.okex())),打印ccxt支持的okex交易所的所有隱式方法。
我們再來看OKEX交易所的API,以交割合約為例,我們同樣找到API關於獲取深度行情的方法,以及需要傳入的參數,這個方法的關鍵詞包括”futures"、"instruments“、"book"等。
我們用上述關鍵詞,在ccxt okex的所有隱式方法中尋找,可以找到對應的方法:futuresGetInstrumentsInstrumentIdBook,他的命名結構、命名邏輯,與ok的api傳入地址很相似。
我們調用這個方法來進行測試,這里需要注意的是,對於okex交易所,我們傳入的合約ID(instrument_id)需要時具體的交割合約,比如我們以BTC-USD-0625舉例,與此同時,再傳入一個輔助的size參數。由於我們的size選擇的是50檔的盤口,返回的也是50檔的深度數據。
ok_futures_symbol = "BTC-USD-0625"
future_depth = okex.futuresGetInstrumentsInstrumentIdBook({"instrument_id":ok_futures_symbol, "size":50})
通過這個例子,可以看到ok交易所,我們也可以用同樣的邏輯+方法,獲取到ccxt隱式方法封裝的合約深度。對於其他交易所的隱式行情調用,我們都可以以此類推,在這里就不一一詳述了,大家對哪個交易所有興趣,都可以print(交易所.dir()),並且與該交易所的官方api文檔進行比對,調用相應命名規則的ccxt隱式方法。
隱式調用:交易
我們知道,交易api一般來說都比行情api更加復雜一些,但我們調用api的基本流程,應該來說不會發生變化,依然是先找到交易所api文檔中,對應方法的地址,再根據地址中的關鍵詞、傳入參數,調用ccxt隱式交易api。
先看幣安交易所,還是以u本位api舉例,來看用的最多的下單函數的說明。下單函數請求地址:POST /fapi/v1/order。所以我們必須要找到包含這些關鍵詞的ccxt隱式api對應方法,並且,按照binance的參數傳入規則,將對應的下單參數傳入。
ccxt中對應的交易方法的名稱叫做fapiPrivatePostOrder,我們將該方法名稱拆分:fapi、Private、Post、Order,除了Private,其余正好對應了原始api的關鍵詞字段。Private是ccxt為每個隱式的私有方法,都會添加的前綴。找到了隱式方法,再根據api文檔的說明,我們就可以傳入合法參數進行下單了。以下,就是一個利用隱式api下市價單的例子,在下完單的同時,我們在返回值中提取出orderId,為后續的查詢訂單、撤單方法使用。
order_res = binance.fapiPrivatePostOrder({
"symbol": _symbol,
"side": _direction,
"positionSide": _positionside,
"type": "MARKET",
"quantity": _amount,
"timestamp": severtime
})
orderid = order_res['orderId']
對於OK交易所來說,也是同理,我們先查看OK交易所的原始api,同樣以下單函數為例。OK交易所的下單api,有兩個重要的特征,大家需要特別注意:第一,傳入的參數類型都是string,哪怕背后對應的是整數類型,傳入時也要轉換為string,不然就會報錯。第二,下單的數量,必須轉換為合約的張數,其他交易所,例如幣安,在u本位合約下單時,允許傳入例如下單0.01btc這樣的合約單位,但OK交易所不行,必須轉換為整數,不然訂單就無法提交成功。
此外,instrument_id、type等參數,也需要嚴格的按照交易所api的要求來傳遞,我們來看下方的例子。
order_res = okex.futures_post_order({
"client_oid": "test",
'instrument_id': _futsymbol,
'type': str(1),
'size': str(1),
'order_type': '0',
'match_price': '1'})
orderid = order_res["order_id"]
寫在最后
寫到這里,相信大家對ccxt如何調用交易所隱式api,已經有了很清楚的認識了。ccxt的隱式調用,雖然不如顯式的方便(對於不同交易所,我們還是需要修改對應代碼的,無法統一定制)。
我們這里以ok、幣安舉例,是因為幣安的現貨、u本位合約、幣本位合約,okex的現貨、交割合約、永續合約,再到期權,ccxt都封裝在了隱式方法中,對於這兩個交易所,理論上所有的api功能,我們都可以通過調用隱式的方法實現,免去了我們自己去對接交易所底層api,處理那些鑒權、現貨期貨api合並等麻煩的問題。
但是對於其他交易所來說,就沒有那么幸運了,比如火幣交易所,ccxt隱式提供的api就不包括hbdm,也就是火幣合約相關的隱式方法,再比如gateio交易所,也只有現貨的api提供。
但是,ccxt起碼是給大家在開發數字貨幣實盤系統提供了另外一個途徑,在開發某個交易所的交易系統前,我們可以先通過dir方法,看一下ccxt的隱式接口是否齊全,如果齊全,我們借道ccxt就能夠開發出一個完整功能的系統,如果該交易所隱式接口不齊全,我們再考慮自行對接交易所的api,由此,我們的開發效率也能夠進一步的提高。
想要獲取本次分享的完整代碼,或是任何關於數據分析、量化投資的問題,歡迎添加技術宅微信:sljsz01,與我交流
往期干貨分享推薦閱讀
Omega System Trading and Development Club內部分享策略Easylanguage源碼
【數量技術宅|量化投資策略系列分享】基於指數移動平均的股指期貨交易策略
AMA指標原作者Perry Kaufman 100+套交易策略源碼分享
【數量技術宅|金融數據系列分享】套利策略的價差序列計算,恐怕沒有你想的那么簡單
【數量技術宅|量化投資策略系列分享】成熟交易者期貨持倉跟隨策略
【數量技術宅|金融數據分析系列分享】為什么中證500(IC)是最適合長期做多的指數
商品現貨數據不好拿?商品季節性難跟蹤?一鍵解決沒煩惱的Python爬蟲分享
【數量技術宅|金融數據分析系列分享】如何正確抄底商品期貨、大宗商品