如何利用CCXT交易數字貨幣合約


更多精彩內容,歡迎關注公眾號:數量技術宅,也可添加技術宅個人微信號:sljsz01,與我交流。

對於幣圈量化老司機來說,相信或多或少都有接觸過ccxt這個接口,ccxt為我們提供了多交易所統一的標准格式API,方便我們做兩件事:第一,跨市場的策略,可以輕松對接不同交易所;第二,同一個策略,可以在幾乎不修改代碼的前提下,移植到不同的交易所。

大多數情況下,我們使用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,與我交流

 

 


往期干貨分享推薦閱讀

分享一個年化15%以上的無風險套利機會

網格交易系統開發

通過深度學習股價截面數據分析和預測股票價格

Omega System Trading and Development Club內部分享策略Easylanguage源碼

一個真實數據集的完整機器學習解決方案(下)

一個真實數據集的完整機器學習解決方案(上)

如何使用交易開拓者(TB)開發數字貨幣策略

股指期貨高頻數據機器學習預測

如何使用TradingView(TV)回測數字貨幣交易策略

如何投資股票型基金?什么時間買?買什么?

【數量技術宅|量化投資策略系列分享】基於指數移動平均的股指期貨交易策略

AMA指標原作者Perry Kaufman 100+套交易策略源碼分享

【 數量技術宅 | 期權系列分享】期權策略的“獨孤九劍”

【數量技術宅|金融數據系列分享】套利策略的價差序列計算,恐怕沒有你想的那么簡單

【數量技術宅|量化投資策略系列分享】成熟交易者期貨持倉跟隨策略

如何獲取免費的數字貨幣歷史數據

【數量技術宅|量化投資策略系列分享】多周期共振交易策略

【數量技術宅|金融數據分析系列分享】為什么中證500(IC)是最適合長期做多的指數

商品現貨數據不好拿?商品季節性難跟蹤?一鍵解決沒煩惱的Python爬蟲分享

【數量技術宅|金融數據分析系列分享】如何正確抄底商品期貨、大宗商品

【數量技術宅|量化投資策略系列分享】股指期貨IF分鍾波動率統計策略

【數量技術宅 | Python爬蟲系列分享】實時監控股市重大公告的Python爬蟲


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM