CCXT是一个开源的数字货币交易框架,它封装了全世界绝大多数的交易所API. 我们通过登录chatgpt,使用gpt编写代码,获取数字货币的行情数据。
比如:利用ccxt从OKY交易所获取比特币行情数据
获取结果如下,以后进行分析,如何运行起来。
后面所有的交易命令都可以通过会话的方式获取。这样,不需要学习代码也可以从事数字货币交易了。
安装ccxt框架
在windows或者linux上安装ccxt,安装命令如下:
pip install ccxt -i https://pypi.tuna.tsinghua.edu.cn/simple |
OKX申请keys使用
登录OKX界面,在打开个人头像,选择API申请,申请界面如下:
然后选择申请v5 api,进入如下的申请界面。自定义用户名和密码,进行校验,选择交易功能,得到keys. 得到结果后,最好密码和kyes的信息保存起来,不能让他人套用,带来损失。
通过ccxt登录OKX交易所
首先连接到OKX,输入你的keys,代码如下:
import ccxt exchange = ccxt.okex({ 'apiKey': '66e9e88-******f6688', 'secret': '888888********88', 'password': '66*****', 'timeout': 30000, 'enableRateLimit': True, }) |
这里我们只需要关心几个问题:
1)import ccxt其实就是导入ccxt 2)exchange就是初始化一个交易所,其他交易的连接方式如下: 3)比如OKY交易所初始化的信息里: apiKey就是我门在交易所申请的api的api key,字符串格式 secret就是secret key,字符串格式 password是OKEx交易所才有的passphrase,其他交易所不需要填这个。字符串格式。 |
获取OKY交易所数字币的行情
在OKY交易所,获取orderbook盘口深度数据,第一个参数symbol填上交易对名称,第二个参数limit是指定获取多少档深度数据。比如我们需要获取比特币的行情,核心代码如下。
orderbook = exchange.fetch_order_book(symbol="BTC/USDT", limit=5).
1)获取获取"BTC/USDT"交易对信息
获取"BTC/USDT"交易对数据的完整代码如下:
#获取最新价格数据 ticker = exchange.fetch_ticker(symbol="BTC/USDT") print("ticker:", ticker) #如果要从ticker数据中取出最新的价格,可以通过字典的键去查找它的值,因为返回的数据是字典格式: last = ticker["last"] print("最新价:", last) |
对应的ticker数据如下:
ticker: {'symbol': 'BTC/USDT', 'timestamp': 1679799979804, 'datetime': '2023-03-26T03:06:19.804Z', 'high': 27792.8, 'low': 27152.8, 'bid': 27580.2, 'bidVolume': 0.00505202, 'ask': 27580.3, 'askVolume': 0.47133495, 'vwap': 27485.798501895166, 'open': 27610.8, 'close': 27580.2, 'last': 27580.2, 'previousClose': None, 'change': -30.6, 'percentage': -0.110826198444087, 'average': 27595.5, 'baseVolume': 5531.43501174, 'quoteVolume': 152035908.15901375, 'info': {'instType': 'SPOT', 'instId': 'BTC-USDT', 'last': '27580.2', 'lastSz': '0.003', 'askPx': '27580.3', 'askSz': '0.47133495', 'bidPx': '27580.2', 'bidSz': '0.00505202', 'open24h': '27610.8', 'high24h': '27792.8', 'low24h': '27152.8', 'volCcy24h': '152035908.159013755', 'vol24h': '5531.43501174', 'ts': '1679799979804', 'sodUtc0': '27461.8', 'sodUtc8': '27648.2'}} 最新价: 27580.2 |
具体数据的结果描述如下:
行情的数据结构如下: { 'symbol': string symbol of the market ('BTC/USD', 'ETH/BTC', ...) 'info': { the original non-modified unparsed reply from exchange API }, 'timestamp': int (64-bit Unix Timestamp in milliseconds since Epoch 1 Jan 1970) 'datetime': ISO8601 datetime string with milliseconds 'high': float, // highest price 'low': float, // lowest price 'bid': float, // current best bid (buy) price 'bidVolume': float, // current best bid (buy) amount (may be missing or undefined) 'ask': float, // current best ask (sell) price 'askVolume': float, // current best ask (sell) amount (may be missing or undefined) 'vwap': float, // volume weighed average price 'open': float, // opening price 'close': float, // price of last trade (closing price for current period) 'last': float, // same as `close`, duplicated for convenience 'previousClose': float, // closing price for the previous period 'change': float, // absolute change, `last - open` 'percentage': float, // relative change, `(change/open) * 100` 'average': float, // average price, `(last + open) / 2` 'baseVolume': float, // volume of base currency traded for last 24 hours 'quoteVolume': float, // volume of quote currency traded for last 24 hours } |
- 获取最近30天的交易数据
# 定义交易对 symbol = 'BTC/USDT' # 获取最近 30 条 K 线数据 klines = exchange.fetch_ohlcv(symbol, '1d', limit=30) # 打印 K 线数据 for kline in klines: print(kline) |
BTC/USDT最近30天的行情结果如下:
[1677283200000, 23190.2, 23217.8, 22729.4, 23157.2, 5019.02857511] [1677369600000, 23157.3, 23686.7, 23060.7, 23557.4, 4810.44032196] [1677456000000, 23552.7, 23891.2, 23101.0, 23491.2, 8356.24149089] [1677542400000, 23491.2, 23600.0, 23025.5, 23136.0, 4699.05977688] [1677628800000, 23143.1, 24009.0, 23009.7, 23632.4, 8356.38724014] [1677715200000, 23632.0, 23792.7, 23181.5, 23466.0, 5511.18257716] [1677801600000, 23465.9, 23472.9, 21898.0, 22354.5, 17156.07482816] [1677888000000, 22354.4, 22403.8, 22164.5, 22349.7, 2958.65794217] [1677974400000, 22349.6, 22666.4, 22185.5, 22427.6, 4206.5210596] [1678060800000, 22427.6, 22598.0, 22261.3, 22409.2, 5956.77362899] [1678147200000, 22409.2, 22553.3, 21934.6, 22201.5, 8308.24100926] [1678233600000, 22201.5, 22287.0, 21570.6, 21706.7, 9010.30149603] [1678320000000, 21706.8, 21830.0, 20037.0, 20367.2, 20102.01680472] [1678406400000, 20364.8, 20368.3, 19529.7, 20152.6, 29477.43802602] [1678492800000, 20152.6, 20688.9, 19769.1, 20454.7, 21906.21116802] [1678579200000, 20454.7, 22160.0, 20263.2, 21995.2, 16535.95439772] [1678665600000, 21995.3, 24509.3, 21820.7, 24116.0, 40397.27101346] [1678752000000, 24116.1, 26424.2, 23957.5, 24676.0, 46895.47498368] [1678838400000, 24675.2, 25227.1, 23873.0, 24279.9, 26008.82676517] [1678924800000, 24279.9, 25179.5, 24125.2, 25005.4, 18077.41143903] [1679011200000, 25002.1, 27768.1, 24894.0, 27395.6, 30760.02435145] [1679097600000, 27394.5, 27713.8, 26565.5, 26905.0, 15656.15234983] [1679184000000, 26905.0, 28400.3, 26825.6, 27966.6, 14606.18949344] [1679270400000, 27966.3, 28490.0, 27133.4, 27718.5, 15769.72184277] [1679356800000, 27716.5, 28448.8, 27300.1, 28108.8, 12272.48235288] [1679443200000, 28104.4, 28890.0, 26603.6, 27249.6, 23810.37051319] [1679529600000, 27249.7, 28775.4, 27114.3, 28293.7, 18433.35854101] [1679616000000, 28295.2, 28375.0, 26976.8, 27452.4, 17120.42253367] [1679702400000, 27452.4, 27792.8, 27152.8, 27462.4, 5694.75630012] [1679788800000, 27461.8, 27648.0, 27413.3, 27586.0, 487.75706743] |
3)获取账号内数字币资产
# 获取数字币资产 balance = exchange.fetch_balance() print("balance:", balance) |
返回的信息是字典格式,资产数据如下: balance: {'info': {'code': '0', 'data': [{'adjEq': '', 'details': [{'availBal': '0.45275651', 'availEq': '0.45275651', 'cashBal': '0.45275651', 'ccy': 'TON', 'crossLiab': '', 'disEq': '0.47403606597', 'eq': '0.45275651', 'eqUsd': '0.94807213194', 'fixedBal': '0', 'frozenBal': '0', 'interest': '', 'isoEq': '0', 'isoLiab': '', 'isoUpl': '0', 'liab': '', 'maxLoan': '', 'mgnRatio': '', 'notionalLever': '0', 'ordFrozen': '0', 'spotInUseAmt': '', 'stgyEq': '0', 'twap': '0', 'uTime': '1652587802413', 。。。。。。}} |
特别注意:
有些交易所可能不会返回完整的余额信息。许多交易所不会返回你的空账户或者未用的账户, 这种情况下在返回的余额结构中可能会缺少某些货币的信息。
4)下单交易
限价委托,symbol是币对名称,amount是下单数量,price是下单价格。限价委托就是以指定的价格挂单。
result = exchange.create_limit_buy_order(symbol="BTC/USDT", amount=1, price=1)
print("限价买入委托单结果:", result)
如上是去下一个限价买入订单,下单返回的结果是:
限价买入委托单结果:
{'info': {'client_oid': '', 'code': '0', 'error_code': '0', 'error_message': '', 'message': '', 'order_id': '6************', 'result': True}, 'id': '6885462671577088', 'clientOrderId': None, 'timestamp': None, 'datetime': None, 'lastTradeTimestamp': None, 'symbol': 'BTC/USDT', 'type': 'limit', 'timeInForce': None, 'postOnly': None, 'side': 'buy', 'price': None, 'stopPrice': None, 'average': None, 'cost': None, 'amount': None, 'filled': None, 'remaining': None, 'status': None, 'fee': None, 'trades': None} 其中有一个数据是order_id,就是这笔订单的订单编号,我们可以将它取出来: order_id = result["info"]["order_id"] # 得到这笔订单的编号是:6******** 同样道理,创建限价卖出委托是: result = exchange.create_limit_sell_order(symbol="BTC/USDT", amount=1, price=1) print("限价卖出委托单结果:", result) |
#市价委托 市价委托就是为了尽快成交,所以交易所会用当时有效的最优价格来完成你的市价单。 |
5)查询指定订单
我们可以通过订单编号去查询一笔订单的状态:
order = exchange.fetch_order(id="6*******", symbol="BTC/USDT")print("order:", order)
我们这里查询了一下先前创建的那个限价订单,返回的订单信息是:
order: {'info': {'client_oid': '', 'created_at': '2021-04-30T16:23:42.502Z', 'fee': '', 'fee_currency': '', 'filled_notional': '0', 'filled_size': '0', 'funds': '', 'instrument_id': 'BTC-USDT', 'notional': '', 'order_id': '6**********', 'order_type': '0', 'price': '1', 'price_avg': '0', 'product_id': 'BTC-USDT', 'rebate': '', 'rebate_currency': '', 'side': 'buy', 'size': '1', 'state': '0', 'status': 'open', 'timestamp': '2021-04-30T16:23:42.502Z', 'type': 'limit 。。。。}
其中有一些数据,当然,我们这个限价单并没有实际成交,所以有些数据是空值:
created_at: 订单创建时间 fee: 手续费用,按币种比如BTC计算的 fee_currency:按基础货币如USDT计算的手续费用 filled_size: 已成交数量 price: 委托价格 side: 订单方向 size: 订单数量 type: 订单是限价单还是市价单 price_avg: 成交均价 |
6)撤销未完成的订单
我们撤销一下之前创建的那个限价订单:
result = exchange.cancel_order(id="6************", symbol="BTC/USDT")
print("撤销指定订单结果:", result)
返回的结果是:
撤销指定订单结果:
{'info': {'client_oid': '', 'code': '0', 'error_code': '0', 'error_message': '', 'message': '', 'order_id': 6**********, 'result': True}, 'id': '6************', 'clientOrderId': None, 'timestamp': None, 'datetime': None, 'lastTradeTimestamp': None, 'symbol': 'BTC/USDT', 'type': None, 'timeInForce': None, 'postOnly': None, 'side': None, 'price': None, 'stopPrice': None, 'average': None, 'cost': None, 'amount': None, 'filled': None, 'remaining': None, 'status': None, 'fee': None, 'trades': None}
我们可以看到,结果里有一个info信息,其他的方法返回的结果也是这样,这个其实是ccxt统一处理过的,在info这个字典之后的,其实是交易所返回的原始信息。
info这个字典里有一个信息是result,我们这里是True,说明撤销订单成功了。
如果这个订单已经成交,去撤销就会失败,那这个result就会是Fasle,与此同时,error_message里会包含具体的错误信息,就是说因为什么原因导致撤单失败的。
###############################
欢迎您阅读《跟我学习AI量化投资》的作品!
欢迎加微信进行交流,谢谢!